getInnerIterator() 返回的值确实是内部迭代器,而不是克隆。应该谨慎使用它:例如,调用 next() 或 rewind() 会使内部迭代器前进或重置 - 尽管这种影响直到你调用 IteratorIterator 对象的 next() 方法才会被注意到 - 它似乎缓存了它的 current() 和 key() 值(截至 PHP v5.5.9)。即使内部迭代器本身是有效的(即 valid() 返回 TRUE),IteratorIterator 也不会报告它自己有效,直到你 either 重置它或者调用它的 next() 方法 - 这两种方法导致 IteratorIterator 与内部迭代器重新同步它的 current、key 和 valid 状态。
<?php
$ii = new IteratorIterator(new ArrayIterator(range(1,6)));
$i1 = $ii->getInnerIterator(); $i2 = $ii->getInnerIterator(); echo $i1->current(); echo $i1->key(); var_dump($ii->valid()); $i1->next(); echo $i1->key(); var_dump($ii->valid()); $ii->rewind(); echo $ii->key(); $i1->next(); echo $ii->key(); echo $i1->key(); $ii->next(); echo $ii->key(); echo $i1->key(); ?>