我试图了解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它会变得更加清晰,谢谢大家,祝你有个美好的一天
答案 0 :(得分:1)
next()
之前没有调用rewind
或current()
,那么内部迭代器指针不会被设置为第一个元素......
常见情况是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()时,不会从内部迭代器中检索该值,而是在其他时间检索它(并且构造函数不是其中之一)。
就个人而言,我认为这是一个错误的边界,因为它是意外的,可以解决而不会引入不必要的行为或性能问题,但是哦。