首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArrayObject,getIterator();

ArrayObject,getIterator();
EN

Stack Overflow用户
提问于 2012-07-07 07:53:56
回答 1查看 4.4K关注 0票数 5

我试图理解getIterator()是什么,我会解释:

如我所知,getIterator是我们调用的包含外部Iterator的方法。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-07 08:12:45

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

代码语言:javascript
复制
class Foo
{
    private $array = [1,2,3,4];
}

您希望对一个foreach实例进行Foo,如下所示:

代码语言:javascript
复制
foreach (new Foo as $bar) {
    echo $bar; // outputs 1234
}

为了实现这一点,您可以添加Iterator接口,但随后您必须实现接口中的所有方法,以执行在对象中迭代数组的简单任务。当您需要该功能时,您不希望一次又一次地重复该代码,特别是因为已经有一个Iterator可以实现您想要的功能。所以,与其实现Iterator,不如实现IteratorAggregate

代码语言:javascript
复制
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,重点只是允许您对ArrayObject中的值进行foreach。当然,您也可以自己调用getIterator,因为它是公开的,然后直接使用返回的Iterator。

还请注意ArrayObject的ctor签名

代码语言:javascript
复制
public __construct (
    [ mixed $input 
    [, int $flags = 0 
    [, string $iterator_class = "ArrayIterator" 
]]] )

哪一个词会被退回。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11373318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档