2008-12-01 3 views
2

У меня есть класс, и я хочу иметь возможность перебирать определенный элемент массива. Я сделал быстрый поиск и нашел 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 подкласса.

Вопрос в том, является ли это преждевременной и/или ненужной оптимизацией? Если нет, то лучший способ добиться этого?

ответ

4

Второй код не будет работать на нескольких циклах объекта, где вы начинаете новый цикл до завершения другого.

Неужели на самом деле не стоит оптимизировать расходы.

+0

Вижу, я не рассматривал эту возможность. – monzee 2008-12-01 20:29:35

4

но не создает ли новый экземпляр ArrayIterator каждый раз, когда используется foreach?

Да, и?

Смежные вопросы