downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

SplObjectStorage::getInfo> <SplObjectStorage::current
Last updated: Fri, 20 May 2011

view this page in

SplObjectStorage::detach

(PHP 5 >= 5.1.0)

SplObjectStorage::detachRemoves an object from the storage

Descripción

public void SplObjectStorage::detach ( object $object )

Removes the object from the storage.

Parámetros

object

The object to remove.

Valores devueltos

No devuelve ningún valor.

Ejemplos

Example #1 SplObjectStorage::detach() example

<?php
$o 
= new StdClass;
$s = new SplObjectStorage();
$s->attach($o);
var_dump(count($s));
$s->detach($o);
var_dump(count($s));
?>

El resultado del ejemplo sería algo similar a:

int(1)
int(0)

Ver también



add a note add a note User Contributed Notes SplObjectStorage::detach
r dot wilczek at web-appz dot de 30-Apr-2010 08:18
Detaching the current entry from the storage prevents SplObjectStorage::next() to operate.

Example as a PHPUnit-test:

<?php
public function testDetachingCurrentPreventsNext()
{
   
$storage = new SplObjectStorage;
   
$storage->attach(new stdClass);
   
$storage->attach(new stdClass);
   
$storage->rewind();
   
$iterated = 0;
   
$expected = $storage->count();
    while (
$storage->valid()) {
       
$iterated++;
       
$storage->detach($storage->current());
       
$storage->next();
    }
   
$this->assertEquals($expected, $iterated);
}
?>

This test will fail, for the iteration will never reach the second stdClass.
SplObjectStorage::next() obviously relies on the current element to be valid.

If you want to detach objects during iterations, you should dereference objects, before you call next() and detach the reference after next():

<?php
public function testDetachingReferenceAfterNext()
{
   
$storage = new SplObjectStorage;
   
$storage->attach(new stdClass);
   
$storage->attach(new stdClass);
   
$storage->rewind();
   
$iterated = 0;
   
$expected = $storage->count();
    while (
$storage->valid()) {
       
$iterated++;
       
$object = $storage->current();
       
$storage->next();
       
$storage->detach($object);
    }
   
$this->assertEquals($expected, $iterated);
}
?>

This test will pass.

 
show source | credits | stats | sitemap | contact | advertising | mirror sites