Php,Spl,FilterIterator行为

时间:2012-09-17 06:53:21

标签: php spl filter-iterator

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

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

现在我不知道我要“刷新”“指针”能够打印元素,如果能有人向我解释请动作序列mabye它会变得更加清晰,谢谢大家,祝你有个美好的一天

2 个答案:

答案 0 :(得分:1)

如果你没有在第一次访问next()之前没有调用rewindcurrent(),那么内部迭代器指针不会被设置为第一个元素......

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

答案 1 :(得分:1)

这是我在这里提出的问题,即使它听起来有所不同: Why must I rewind 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()时,不会从内部迭代器中检索该值,而是在其他时间检索它(并且构造函数不是其中之一)。

就个人而言,我认为这是一个错误的边界,因为它是意外的,可以解决而不会引入不必要的行为或性能问题,但是哦。