我有一个类和我希望能够遍历一定阵列成员。我做了快速搜索,发现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()返回之前调用它,但我不知道它在内部使用数组的会员名称和它是否是由一个子类overwriteable。

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

有帮助吗?

解决方案

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

真正地没有像价值上要么花时间的优化。

其他提示

  

但不会创造一个新的ArrayIterator实例每次的foreach是在使用它?

是,和

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top