從儲存區中移除目前的項目會阻止 SplObjectStorage::next() 運作。
範例作為 PHPUnit 測試
<?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);
}
?>
這個測試會失敗,因為迭代永遠不會到達第二個 stdClass。
SplObjectStorage::next() 顯然依賴於目前的元素有效。
如果您想在迭代期間分離物件,您應該在呼叫 next() 之前取消物件的引用,並在 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);
}
?>
這個測試會通過。