Php 使用IteratorAggregate在成员数组上迭代
我有一个类,我希望能够迭代某个数组成员。我进行了快速搜索,找到了Php 使用IteratorAggregate在成员数组上迭代,php,spl,Php,Spl,我有一个类,我希望能够迭代某个数组成员。我进行了快速搜索,找到了IteratorAggregate: class foo implements IteratorAggregate { protected $_array = array('foo'=>'bar', 'baz'=>'quux'); public function getIterator() { return new ArrayIterator($this->_array);
IteratorAggregate
:
class foo implements IteratorAggregate
{
protected $_array = array('foo'=>'bar', 'baz'=>'quux');
public function getIterator()
{
return new ArrayIterator($this->_array);
}
}
这非常有效,但这不是每次对其使用foreach
时都会创建一个新的ArrayIterator
实例吗
所以我想我应该将迭代器实例存储在一个成员中:
protected $_iterator;
public function getIterator()
{
if (!$this->_iterator instanceof ArrayIterator) {
$this->_iterator = new ArrayIterator($this->_array);
}
return $this->_iterator;
}
问题是迭代器在第一次调用getIterator()
时使用了$this->\u数组的副本,因此对成员的更改不会反映在后续的foreach
构造中
我想我应该子类化ArrayIterator
,添加一个setArray($array)
方法,并在getIterator()
中返回它之前调用它,但我不知道它内部使用的数组的成员名,也不知道它是否可被子类覆盖
问题是:这是一个过早和/或不必要的优化吗?如果没有,那么实现这一点的最佳方法是什么?第二个代码将在对象的多个循环上失败,其中在另一个循环完成之前启动一个新循环
这两种方法看起来都不值得花时间进行优化
但这不是每次使用foreach时都会创建一个新的ArrayIterator实例吗
是的,而且?我明白了,我还没有考虑过这种可能性。