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.
SplObjectStorage::detach
(PHP 5 >= 5.1.0)
SplObjectStorage::detach — Removes an object from the storage
Descrierea
public void SplObjectStorage::detach
( object
$object
)Removes the object from the storage.
Valorile întoarse
Nu este întoarsă nici o valoare.
Exemple
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));
?>
Exemplul de mai sus va afișa ceva similar cu:
int(1) int(0)
Vedeți de asemenea
- SplObjectStorage::attach() - Adds an object in the storage
- SplObjectStorage::removeAll() - Removes objects contained in another storage from the current storage
r dot wilczek at web-appz dot de ¶
3 years ago
