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 — オブジェクトをストレージから取り除く
説明
public void SplObjectStorage::detach
( object
$object
)オブジェクトをストレージから取り除きます。
パラメータ
-
object -
取り除きたいオブジェクト。
返り値
値を返しません。
例
例1 SplObjectStorage::detach() の例
<?php
$o = new StdClass;
$s = new SplObjectStorage();
$s->attach($o);
var_dump(count($s));
$s->detach($o);
var_dump(count($s));
?>
上の例の出力は、 たとえば以下のようになります。
int(1) int(0)
参考
- SplObjectStorage::attach() - オブジェクトをストレージに追加する
- SplObjectStorage::removeAll() - 別のストレージに含まれているオブジェクトを現在のストレージから取り除く
r dot wilczek at web-appz dot de
30-Apr-2010 01:18
