ArrayObject,getIterator();

Avi*_*ida 5 php spl arrayobject

我想知道是什么getIterator(),我会解释:

据我所知,getIterator我们称之为一种方法,包括一个外部迭代器.

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

Gor*_*don 12

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

class Foo
{
    private $array = [1,2,3,4];
}
Run Code Online (Sandbox Code Playgroud)

你想要foreach一个Foo像这样的实例:

foreach (new Foo as $bar) {
    echo $bar; // outputs 1234
}
Run Code Online (Sandbox Code Playgroud)

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

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

    public function getIterator()
    {
        return new ArrayIterator($this->array);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下ArrayObject,重点是让你foreach超过的价值ArrayObject.当然,您也可以打电话给getIterator自己,因为它是公开的,然后直接使用返回的Iterator.

还要注意ctor签名ArrayObject:

public __construct (
    [ mixed $input 
    [, int $flags = 0 
    [, string $iterator_class = "ArrayIterator" 
]]] )
Run Code Online (Sandbox Code Playgroud)

注意哪个Iterator将被退回.