$arrayIter = new ArrayIterator( array(1, 2) );
$iterIter = new IteratorIterator($arrayIter);

var_dump($iterIter->valid()); //false
var_dump($arrayIter->valid()); //true

如果我第一呼叫的 $ iterIter->倒带()的,则 $ iterIter->有效()的是真实的。我很好奇,为什么它需要倒带()被调用。我想有很好的理由,但我本来期望它只是在任何状态它的内部迭代器是在开始迭代,并把它作为一个选择开始迭代之前倒带。

调用next()似乎也把它放在一个“有效”状态(尽管它前进到下一个位置,这表明它是先前在第一位置)。

$arrayIter = new ArrayIterator(array(1,2));
$iterIter = new IteratorIterator($arrayIter);

$iterIter->next();
var_dump($iterIter->valid()); 

再次我很好奇为什么我需要调用倒带(),尽管在一个有效的状态下的内迭代之中。

有帮助吗?

解决方案

通过一个新的迭代器的位置没有初始化,只是为了性能的原因,你可以在其他迭代器叠放迭代器,如果所有的人都将在施工期间倒带会有一些性能影响,另外一些迭代器可能会改变他们的执行该构造函数之后第一值 - 这是未知的迭代器进一步向外

迭代器通常由不倒带()的foreach()执行的第一...

其他提示

虽然延伸的IteratorIterator类饶实现整个迭代器接口和/或创建我已经运行到这个问题,以及迭代器的装饰。

这装饰已经是解决问题的方法,它仅需要实现缺少的功能,以除去不一致性。不需要自动倒带:

class IteratorDecorator extends IteratorIterator
{
    public function valid()
    {
        return $this->getInnerIterator()->valid();
    }
}

例如:如果你有一个Iterator对象,它是通过缺省情况下,例如有效ArrayIterator

$it = new ArrayIterator(array(1));
var_dump($it->valid());             # bool(true)

$itit = new IteratorIterator($it);
var_dump($itit->valid());           # bool(false)

此示出了IteratorIterator实施不一致良好,IteratorIterator对象不正确反映内ArrayIterator的状态。使用IteratorDecorator可以治愈这样的:

$decor = new IteratorDecorator($it);
var_dump($decor->valid());          # bool(true)

如果你还跟着,直到这里,这里就是你可能要考虑的另一种特殊情况:如果你不需要有内部迭代器rewind,你可以使用它返回正确的有效性,以及在NoRewindIterator

$noretit = new NoRewindIterator($it);
var_dump($noretit->valid());        # bool(true)

两者约翰内斯“没有自动倒带”参数考虑进去,这是有道理的,因为NoRewindIterator预计,迭代器不应该反绕并正确显示了内部迭代器的有效性。

但随着IteratorDecorator节目,我不做任何形式的自动倒带,以及去除不一致的情况。

像@johannes说,该位置未在IteratorIterator初始化,因而任何其它的它的方法是在其上运行,或者它被用于用foreach之前,它是无效的()

尝试做

var_dump( $iterIter->current() ); // NULL
var_dump( $iterIter->getInnerIterator()->current() ); // 1

和也

$iterIter->rewind();
var_dump( $iterIter->current() ); // 1
var_dump( $iterIter->getInnerIterator()->->current() );  // 1

和还注意到,上unitiliazed IteratorIterator:

$iterIter->next(); // 2
var_dump( $iterIter->current()) ; // 2 (from NULL to 2)
var_dump( $iterIter->getInnerIterator()->current() );  // 2

请注意从代码段$arrayIter相同$iterIter->getInnerIterator()

希望有所阐明一些。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top