Iteração sobre uma matriz de membro com IteratorAggregate
Pergunta
Eu tenho uma classe e eu quero ser capaz de interagir sobre um determinado membro da matriz. Eu fiz uma pesquisa rápida e IteratorAggregate
encontrado:
class foo implements IteratorAggregate
{
protected $_array = array('foo'=>'bar', 'baz'=>'quux');
public function getIterator()
{
return new ArrayIterator($this->_array);
}
}
que funciona muito bem, mas não faz isso criar uma nova instância ArrayIterator
cada vez foreach
é usado sobre ele?
Então, eu pensei que eu deveria armazenar a instância iterador em um membro:
protected $_iterator;
public function getIterator()
{
if (!$this->_iterator instanceof ArrayIterator) {
$this->_iterator = new ArrayIterator($this->_array);
}
return $this->_iterator;
}
O problema é que o iterador usa uma cópia do $this->_array
durante a primeira chamada de getIterator()
, então muda para o membro não são refletidas em construções foreach
subsequentes.
Eu estava pensando que eu deveria subclasse ArrayIterator
, adicione um método setArray($array)
e chamá-lo antes de voltar em getIterator()
, mas eu não sei o nome do membro da matriz que usa internamente e se é ou não é overwriteable por uma subclasse.
A questão é: esta é uma otimização prematura e / ou desnecessários? Se não, qual é a melhor maneira de conseguir isso?
Solução
Você segundo código irá falhar em vários ciclos do objeto onde você começa um novo ciclo antes que outro está terminado.
Realmente Não se parecer com uma pena de otimização de passar o tempo em ambos.
Outras dicas
mas não que criar uma nova instância ArrayIterator cada vez foreach é usado sobre ele?
Sim, e?