Detaching the current entry from the storage prevents SplObjectStorage::next() to operate.Example as a PHPUnit-test:<?phppublic 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():<?phppublic 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.