Pregunta

mucho que lo intentaba no puedo sacarlo de mi cabeza lo que realmente hace la clase IteratorIterator. Yo entiendo que las clases pueden implementar de Traversable lo que el motor sabe que puede bucle usando foreach y que darse cuenta de que IteratorIterator se supone para convertir cualquier cosa que sea de Traversable en un iterador, pero no puedo para la vida de entender cómo.

Tomemos, por ejemplo, el PDOStatement clase; ¿cómo los métodos estándar Iterator (al lado, clave, rebobinar, etc.) se implementan para permitir la iteración sobre un PDOStatement?

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 $ Raíz> niño como un argumento y cómo se las arregla para iterar sobre los elementos secundarios.

¿Fue útil?

Solución

este , creo que le permite iterar los objetos más repetido. Es decir. se puede tirar de otros objetos en su objeto principal y utilizando IteratorIterator en su objeto principal, Iterar los objetos secundarios también.

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

Otros consejos

Si no encontramos todavía, https: //www.phpro. org / tutoriales / Introducción a SPL.html tiene algunos ejemplos que podría ayudarle.


IteratorIterator>

  • "Esta envoltura permite que el iterador conversión de todo lo que es Desplazable en un iterador ".

de Traversable>

  • "Interfaz para detectar si una clase es transitable usando foreach ".
  • "(built-in) que las clases internas implementar esta interfaz se puede utilizar en un foreach construir y no hacer necesitará implementar IteratorAggregate o Iterator ".
  • "Esta es una interfaz interna del motor que no puede ser implementado en PHP guiones. De cualquier IteratorAggregate o Iterador debe 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 (cuando se utiliza para foreach al menos) de secuencias de comandos.

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)

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

Así que para la implementación de su pregunta, se podría crear una clase de iterador con un PDOStatement como su memeber, que, por ejemplo utilizar el siguiente método para llamar a la PDOStatement :: fetch para volver a su próximo estado de cuenta. almacenamiento que le permitirá implementar tanto perivous y actual. Havn't utilizado esta clase demasiado, pero apuesto a que no es tan difícil o implementar un rebobinado y la clave. cuenta que se trata sobre la marcha por lo que podría estar equivocado en los detalles, pero creo que el concepto debe ser claro

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top