题
我有一个类和我希望能够遍历一定阵列成员。我做了快速搜索,发现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是在使用它?
是,和
不隶属于 StackOverflow