5

我试图了解是什么getIterator(),我将解释:

据我所知getIterator,我们调用的方法是包含一个外部迭代器。

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

4

1 回答 1

13

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

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

并且你想foreach通过一个实例Foo,像这样:

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

要实现这一点,您可以添加Iterator接口,但随后您必须实现接口中的所有方法,以完成在对象内迭代数组的简单任务。当您需要该功能时,您不想一遍又一遍地重复该代码,特别是因为已经有一个迭代器可以满足您的需求。所以不是实施Iterator你实施IteratorAggregate

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

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

现在,当您执行此操作时,foreachPHP 将使用从返回的迭代器getIterator而不是Foo实例本身,从而允许您获得输出 1234。

在 的情况下ArrayObject,这一点只是为了允许您foreach超过ArrayObject. 当然,你也可以调用getIterator自己,因为它是公共的,然后直接使用返回的迭代器。

还要注意 ctor 签名ArrayObject

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

其中指出将返回哪个迭代器。

于 2012-07-07T08:12:45.710 回答