使用IteratorAggregate迭代成员数组

时间:2008-12-01 16:40:05

标签: php spl

我有一个类,我希望能够迭代某个数组成员。我做了一个快速搜索,找到了IteratorAggregate

class foo implements IteratorAggregate
{
    protected $_array = array('foo'=>'bar', 'baz'=>'quux');

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

效果很好,但每次使用ArrayIterator时都不会创建新的foreach实例吗?

所以我认为我应该将迭代器实例存储在一个成员中:

    protected $_iterator;

    public function getIterator()
    {
        if (!$this->_iterator instanceof ArrayIterator) {
            $this->_iterator = new ArrayIterator($this->_array);
        }
        return $this->_iterator;
    }

问题是迭代器在$this->_array的第一次调用期间使用了getIterator()的副本,因此对该成员的更改不会反映在后续的foreach构造中。

我在想我应该继承ArrayIterator,添加setArray($array)方法并在getIterator()中返回之前调用它,但我不知道它使用的数组的成员名称在内部以及它是否可被子类覆盖。

问题是:这是一个过早和/或不必要的优化吗?如果不是,实现这一目标的最佳方式是什么?

2 个答案:

答案 0 :(得分:4)

第二个代码将在对象的多个循环上失败,在另一个循环完成之前,您将开始一个新循环。

Didnt看起来真的看起来像是值得花时间去做优化。

答案 1 :(得分:4)

  

但是每次使用foreach时都不会创建新的ArrayIterator实例吗?

是的,是吗?