Перебор массива элементов с помощью 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()
, но я не знаю имя члена массива, который он использует внутри, и можно ли его перезаписать подклассом.
Вопрос в том:это преждевременная и/или ненужная оптимизация?Если нет, то как лучше всего этого добиться?
Решение
Второй код потерпит неудачу в нескольких циклах объекта, где вы начнете новый цикл до завершения другого.
Это тоже не выглядело как оптимизация, на которую стоит тратить время.
Другие советы
но разве это не создает новый экземпляр ArrayIterator каждый раз, когда на нем используется foreach?
да и?