Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用IteratorAggregate在成员数组上迭代_Php_Spl - Fatal编程技术网

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实例吗


是的,而且?

我明白了,我还没有考虑过这种可能性。