我有一个类,我希望能够迭代某个数组成员。我快速搜索了一下,发现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()
,但我不知道它在内部使用的数组的成员名称以及它是否可以被子类覆盖。
问题是:这是过早和/或不必要的优化吗?如果没有,实现这一目标的最佳方法是什么?