2008-12-01 68 views
2

我有一个类,我希望能够遍历某个数组成员。我做了快速搜索,发现IteratorAggregate使用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数组的成员名称。

问题是:这是一个不成熟和/或不必要的优化?如果不是,那么实现这一目标的最佳方法是什么?

回答

4

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

没有看起来像一个值得花费时间的优化。

+0

我明白了,我没有考虑过这种可能性。 – monzee 2008-12-01 20:29:35

4

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

是的,?