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?

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top