У меня есть класс, и я хочу иметь возможность перебирать определенный элемент массива. Я сделал быстрый поиск и нашел 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()
, но я не знаю имя элемента массива он использует внутренне и будет ли это overwriteable подкласса.
Вопрос в том, является ли это преждевременной и/или ненужной оптимизацией? Если нет, то лучший способ добиться этого?
Вижу, я не рассматривал эту возможность. – monzee 2008-12-01 20:29:35