1

我试图理解 FilterIterator 在This Code的行为,我试图理解动作序列,我不明白为什么如果你尝试打印current()值它不会工作,除非你使用next()rewind()例如之前:

// Please take a look at the link before
echo $cull->current(); // wont work
$cull->next(); or $cull->rewind(); then echo $cull->current(); // work

现在我不知道我必须“刷新”“指针”才能打印元素,如果有人可以向我解释一下动作序列,它会变得更清晰,谢谢大家,祝你有美好的一天。

4

2 回答 2

1

这是我在这里问的同一个问题,尽管听起来不同: 为什么我必须倒带 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() 时,不会从内部迭代器中检索该值,而是在其他时间检索该值(并且构造函数不是其中之一)。

就个人而言,我认为这是一个错误的边界,因为它是出乎意料的并且可以解决,而不会引入不需要的行为或性能问题,但是哦,好吧。

于 2012-10-14T21:42:45.800 回答
1

恕我直言,如果您不调用next()或在第一次rewind访问之前current(),内部迭代器指针未设置为第一个元素......

常见的情况是while($it->next())AFAIK!

于 2012-09-17T06:58:21.643 回答