Pergunta

Por mais que tentasse eu não posso colocar minha cabeça em torno do que o IteratorIterator de classe, na verdade, não.Eu entendo que as classes podem implementar Traversable de modo que o motor sabe que pode loop usando foreach e Percebo que IteratorIterator é suposto para converter tudo o que é Traversable em um Iterador, mas eu não posso para a vida da-me a entender como.

Tomemos, por exemplo, o PDOStatement de classe;como seria o padrão Iterator métodos (avançar, a chave, rebobinar, etc) e implementados para permitir a iteração através de um PDOStatement?

Desculpe se a minha pergunta é, claro, estou apenas lutando para entender a razão exata para esta classe e a documentação é escassa.

Obrigado,

Vai

Atualização:Passando o phpt arquivos, encontrei um teste que usa IteratorIterator:

<?php

$root = simplexml_load_string('<?xml version="1.0"?>
<root>
    <child>Hello</child>
    <child>World</child>
</root>
');

foreach (new IteratorIterator($root->child) as $child) {
    echo $child."\n";
}

?>

O resultado esperado é:

Hello
World

Eu realmente não siga como o IteratorIterator construir demora $root->criança como um argumento e como ele gerencia para iterar sobre os elementos filho.

Foi útil?

Solução

Baseado em isto, Acho que isso permite que você iterar sobre objetos iterados. Ou seja, você pode puxar outros objetos em seu objeto mestre e usar o iteratorIterator em seu objeto mestre, iterar os objetos infantis também.

ATUALIZAÇÃO: Com base na sua atualização. Isso faz sentido para mim, embora exista apenas um objeto raiz, para que ele realmente não se aplique neste exemplo, mas você poderia se houvesse mais objetos raiz. Em outras palavras, acredito que o iteratorIterator é o mesmo que ter aninhado para os loops, sem ter que conhecer todos os elementos de cada objeto. Em outras palavras, um aninhado para cada um usando objetos orientados a objetos ... há uma declaração redundante. :-)

Outras dicas

Se você não encontrá-lo ainda, https://www.phpro.org/tutorials/Introduction-to-SPL.html tem alguns exemplos que podem ajudar você.


IteratorIterator >

  • "Este iterador permite que o wrapper conversão de tudo o que é Traversable em um Iterador."

Traversable >

  • "Interface para detectar se uma classe é traversable usando foreach."
  • "Interno (built-in) classes de implementar esta interface pode ser utilizada em uma construção foreach e não necessidade de implementar IteratorAggregate ou Iterator."
  • "Este é um interno do mecanismo de interface o que não pode ser implementado em PHP scripts.Quer IteratorAggregate ou Iterador deve ser usado em vez disso."

O site tem alguns RecursiveIteratorIterator exemplos que podem ser úteis, mas, se eu entendi direito, IteratorIterator é de scripts ponto de vista inútil (quando usado para foreach pelo menos).

Ele cria Iterateable Objetos a partir de Objetos execução do Traversable interface, mas estagiário classes de implementação do Traversable interface são foreachable de qualquer maneira e scripts não é possível implementar Traversable...

(Não mencionado no docs, o SimpleXMLElement é a implementação de Traversable)

Eu pensei em exemplo #2 aqui é bastante direto ...
Ele basicamente permite implementar um comportamento específico para a sua classe para as funções de matriz seguinte/anterior/atual/rewind/key, esperadas pelo analisador PHP foreach.

Portanto, para implementar sua pergunta, criaria uma classe de iterador com um pdostatement como seu memeber, do que, por exemplo, use o próximo método para chamar o Pdostatement :: Fetch para retornar sua próxima instrução. O armazenamento permitirá que você implemente o perivous e o atual. Não usei muito essa classe, mas aposto que não é tão difícil implementar um retrocesso e chave. Observe que isso está em tempo real, para que eu esteja errado nos detalhes, mas acho que o conceito deve ser claro

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