为什么我必须回放IteratorIterator

goa*_*oat 2 php spl iterator

$arrayIter = new ArrayIterator( array(1, 2) );
$iterIter = new IteratorIterator($arrayIter);

var_dump($iterIter->valid()); //false
var_dump($arrayIter->valid()); //true
Run Code Online (Sandbox Code Playgroud)

如果我先调用$ iterIter-> rewind(),则$ iterIter-> valid()为true.我很好奇为什么要调用rewind().我想它有充分的理由,但我希望它只是在内部迭代器处于的任何状态下开始迭代,并在开始迭代之前将其作为回退选项.

调用next()似乎也把它置于"有效"状态(虽然它前进到下一个位置,表明它先前处于第一个位置).

$arrayIter = new ArrayIterator(array(1,2));
$iterIter = new IteratorIterator($arrayIter);

$iterIter->next();
var_dump($iterIter->valid()); 
Run Code Online (Sandbox Code Playgroud)

同样,我很好奇为什么我需要调用rewind(),尽管内部迭代器处于有效状态.

joh*_*nes 5

使用新的迭代器,位置不会初始化,只是出于性能原因,您可以将迭代器堆叠在其他迭代器之上,如果所有这些迭代器在构造期间都会倒带会对性能产生影响,另外一些迭代器可能会在之后更改它们的第一个值构造函数已执行 - 迭代器未知.

迭代器通常由foreach()执行,它首先执行倒带()...