ArrayObject,getIterator();

时间:2012-07-07 07:53:57

标签: php spl arrayobject

我想了解 getIterator() 是什么,我会解释一下:

据我所知getIterator是一种我们称之为包含外部迭代器的方法。

问题是getIterator包含它自己的方法关闭认为看起来与Iterator接口相同但它不能是一个接口它可以是类但我试图在SPL中搜索它。 php源代码并没有找到任何,也许我让它变得比实际更复杂,如果有人可以帮助我理解它在SPL.php源代码的位置以及它是什么(我会很高兴,等等)。谢谢大家,祝你有个愉快的一天。

1 个答案:

答案 0 :(得分:12)

ArrayObject实现IteratorAggregate,它允许您返回迭代器而不是实现它。这很简单。假设你有一个包装数组的类,比如

class Foo
{
    private $array = [1,2,3,4];
}

并希望foreach覆盖Foo的实例,如下所示:

foreach (new Foo as $bar) {
    echo $bar; // outputs 1234
}

要实现这一点,您可以添加Iterator接口,但是您必须在接口中实现所有方法,以便在对象内迭代数组。您不希望在需要该功能时反复复制该代码,特别是因为已经有一个Iterator可以执行您想要的操作。因此,不是实施Iterator,而是实施IteratorAggregate

class Foo implements IteratorAggregate
{
    private $array = [1,2,3,4];

    public function getIterator()
    {
        return new ArrayIterator($this->array);
    }
}

现在当你执行foreach PHP时,将使用从getIterator返回的Iterator而不是Foo实例本身,允许您获取输出1234.

如果是ArrayObject,则只需要foreach ArrayObject上的getIterator。当然,您也可以自己致电ArrayObject,因为它是公开的,然后直接使用返回的Iterator。

另请注意public __construct ( [ mixed $input [, int $flags = 0 [, string $iterator_class = "ArrayIterator" ]]] )

的ctor签名
{{1}}

注意到将返回哪个迭代器。