I have a class and I want to be able to iterate over a certain array member. I did a quick search and found IteratorAggregate:
class foo implements IteratorAggregate
{
protected $_array = array('foo'=>'bar', 'baz'=>'quux');
public function getIterator()
{
return new ArrayIterator($this->_array);
}
}
which works great, but doesn't that create a new ArrayIterator instance every time foreach is used on it?
So I thought I should store the iterator instance in a member:
protected $_iterator;
public function getIterator()
{
if (!$this->_iterator instanceof ArrayIterator) {
$this->_iterator = new ArrayIterator($this->_array);
}
return $this->_iterator;
}
The problem is that the iterator uses a copy of $this->_array during the first call of getIterator(), so changes to the member aren't reflected on subsequent foreach constructs.
I was thinking I should subclass ArrayIterator, add a setArray($array) method and call it before returning it in getIterator(), but I don't know the member name of the array it uses internally and whether or not it's overwriteable by a subclass.
The question is: is this a premature and/or unnecessary optimization? If no, what's the best way to achieve this?