这是我在这里问的同一个问题,尽管听起来不同:
为什么我必须倒带 IteratorIterator
(你的 CullingIterator 是一个 FilterIterator,它是一个 IteratorIterator)。
阅读接受的答案和评论,但总结是 IteratorIterator 在 php 源代码中的编写方式在功能上建模如下:
class IteratorIterator {
private $cachedCurrentValue;
private $innerIterator;
...
public function current() { return $this->cachedCurrentValue; }
public function next() {
$this->innerIterator->next();
$this->cachedCurrentValue = $this->innerIterator->current();
}
public function rewind() {
$this->innerIterator->rewind();
$this->cachedCurrentValue = $this->innerIterator->current();
}
}
重要的部分是当您调用 current() 时,不会从内部迭代器中检索该值,而是在其他时间检索该值(并且构造函数不是其中之一)。
就个人而言,我认为这是一个错误的边界,因为它是出乎意料的并且可以解决,而不会引入不需要的行为或性能问题,但是哦,好吧。