2009-09-02 12 views
5

Por más que lo intente, no entiendo qué hace la clase IteratorIterator. Entiendo que las clases pueden implementar Traversable para que el motor sepa que puede hacer bucles usando foreach y. Me doy cuenta de que se supone que IteratorIterator convierte todo lo que es Traversable en un iterador, pero no puedo entender cómo.¿Cómo funciona la clase PHP IteratorIterator?

Tome por ejemplo, la clase PDOStatement; ¿cómo se implementarían los métodos estándar de iterador (siguiente, clave, rebobinado, etc.) para permitir la iteración sobre una declaración PDOS?

Lo siento si mi pregunta no es clara, sólo estoy luchando para comprender la razón exacta de esta clase y la documentación es escasa.

Gracias,

Will

Actualización: El paso por los archivos de HPTP, me encontré con una prueba que utiliza 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"; 
} 

?> 

El resultado esperado es:

Hello 
World 

Realmente no sigo cómo el constructo IteratorIterator toma $ root-> child como un argumento y cómo se las arregla para iterar sobre los elementos secundarios.

+0

he encontrado la respuesta [aquí] (http://blog.ircmaxell.com/2011/10/iteratoriterator-php-inconsistencies.html). Pero me parece que el IteratorIterator ahora tiene poca importancia, ¿no es así? – akond

Respuesta

1

Basado en this, creo que le permite Iterar sobre objetos iterados. Es decir. puede arrastrar otros objetos en su objeto maestro y usar IteratorIterator en su objeto maestro, también iterar los objetos secundarios.

ACTUALIZACIÓN: Según su actualización. Esto tiene sentido para mí, aunque solo hay un objeto raíz, por lo que iterar no se aplica realmente en este ejemplo, pero podría hacerlo si hubiera más objetos raíz. En otras palabras, creo que IteratorIterator es lo mismo que tener bucles foreach anidados, sin tener que conocer todos los elementos de cada objeto. En otras palabras, un foreach anidado que usa objetos orientados a objetos ... hay una declaración redundante. :-)

0

pensé ejemplo # 2 here es bastante sencillo ...
que básicamente le permite implementar un comportamiento específico para su clase para los próximos/funciones/anteriores/actuales/rebobinado clave de la matriz, que se espera por el analizador php foreach .

así que para implementar su pregunta, uno crearía una clase Iterator con una PDOStatement como su memeber, que por ejemplo use el siguiente método para llamar a PDOStatement :: fetch para devolver su siguiente declaración. almacenarlo le permitirá implementar tanto perivous como current. No he usado demasiado esta clase, pero apuesto a que no es tan difícil implementar un rebobinado y una tecla. Tenga en cuenta que esto es sobre la marcha, así que podría estar equivocado en los detalles, pero creo que el concepto debe ser claro

+0

No estoy seguro de seguir. El ejemplo al que se ha vinculado habla de un iterador estándar y no de la clase IteratorIterator (http://us2.php.net/manual/en/class.iteratoriterator.php). ¿Podrías aclararlo por favor? – WilliamMartin

2

Si no encontramos todavía, https://www.phpro.org/tutorials/Introduction-to-SPL.html tiene algunos ejemplos que pueden ayudarle.


IteratorIterator>

  • "Este envoltorio iterador permite la conversión de todo lo que es de Traversable en un iterador."

de Traversable>

  • "Interfaz para detectar si una clase es transitable usando foreach."
  • " Interno (incorporados) clases que implementan esta interfaz se puede utilizar en un foreach construir y no necesita para implementar IteratorAggregate o iterador. "
  • " Esta es una interfaz interna del motor que c annot se implementará en PHP scripts. De cualquier IteratorAggregate o iterador se deben utilizar en su lugar."

El sitio cuenta con algunos ejemplos RecursiveIteratorIterator que podrían ser conveniente, pero, si lo consigo derecho, IteratorIterator es desde el punto de vista bastante inútil scripting (cuando se utiliza para foreach por lo menos).

se crea Iterateable objetos fuera de objetos que implementan la interfaz de Traversable, pero las clases que implementan la interfaz del interno de Traversable son foreachable de todos modos y secuencias de comandos no se puede poner en práctica de Traversable ...

(no se menciona en la documentación, el SimpleXMLElement está implementando de Traversable)