2

我有一个类,我希望能够迭代某个数组成员。我快速搜索了一下,发现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(),但我不知道它在内部使用的数组的成员名称以及它是否可以被子类覆盖。

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

4

2 回答 2

4

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

看起来并不像一个值得花时间在上面的优化。

于 2008-12-01T17:02:22.453 回答
4

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

是的,还有?

于 2008-12-01T17:13:31.340 回答