while transversable objetos lista iteradores php iterator

objetos - transversable php



PHP-Razones para usar Iterators? (5)

Los iteradores son tan rápidos como cualquier otra cosa, pero con una interfaz más sencilla y tal vez más verbos para envolverla. Sin embargo, la principal ventaja no es lo que puede necesitar ahora, sino cómo puede ampliarlos para enfrentar sus problemas futuros ( ¡y vendrán!), y eso es lo que nosotros, los muchachos, llamamos "salvar tu trasero futuro". :)

Estaba leyendo el manual hoy y noté los diferentes iteradores . Para mí, parece que todos son algo sin sentido; No veo una razón para usarlos a menos que prefiera su sintaxis, o no sepa cómo escribir una función recursiva. ¿Hay alguna razón para usar iteradores incorporados en PHP sobre simplemente escribir un bucle o hacer un método recursivo?

Solo busco respuestas objetivas, no preferencias subjetivas (es decir: no me importa si piensas que es más "legible" u "más orientado a objetos", quiero saber si son más rápidos, ofrecen funcionalidades que pueden no se logrará al rodar el suyo, etc.).


Un ejemplo simple: Implementación de un objeto que se puede acceder y recorrer como una matriz. SimpleXML es un buen ejemplo del poderoso comportamiento que se puede lograr con esto.

Para lograr esto, puede implement la interfaz Iterator que define los métodos public current() , public key() , public next() , public rewind() y public valid() .

O simplemente puede implement la interfaz alternativa IteratorAggregate que define un método public getIterator() que simplemente devuelve un iterador para los datos internos que desea exponer.

Asegúrese de revisar los ejemplos de las interfaces anteriores y verá la ventaja.


La pregunta puede tener una gran variedad de respuestas, pero las respuestas correctas probablemente se pueden resumir como: Iterator se puede usar para iterar algo más complejo que una matriz simple .

Un ejemplo es algún tipo de ORM o generador de consultas. Supongamos que tenemos uno: usarlo podría verse así:

$friends = new Model_Friend(); $friends = $people->where(''age'',''>'',30)->where(''gender'',''='',''female''); foreach ($friends as $friend) { echo $friend->name; }


La principal ventaja de los iteradores es que abstraen el concepto de iteración. Esto significa que cualquier proveedor de datos se puede usar a través de la misma interfaz. Y ahí es exactamente donde puedes aprovecharlos:

  • pereza
  • Uso reducido de memoria
  • Composición

pereza

Con los proveedores de datos, los datos solo se obtienen cuando realmente los necesita (por ejemplo, cuando itera).

Uso reducido de memoria

Los iteradores lo alientan a procesar datos de forma iterativa, en lugar de almacenarlos en la memoria. Si bien es posible hacer esto sin iteradores, las abstracciones que proporcionan ocultan la implementación, lo que los hace realmente fáciles de usar.

Composición

Lo que dijo Mario

Juozas Kaziukėnas escribió recientemente una publicación de blog sobre cómo podría usar iteradores para emular la evaluación diferida en PHP. Entra en detalles sobre algunas de las cosas que he mencionado.


Creo que la razón principal es la versatilidad. No hacen que las cosas sean más legibles y puedes lograr la mayoría de lo que hacen los iteradores con un simple foreach .

Pero los iteradores pueden servir como una especie de fuente compactada de bucle o bucle que puede pasar. Puede tener fuentes de datos más diversas que solo una lista / matriz. Y la verdadera ventaja es que puedes envolverlos o apilarlos para la agregación.

La denominación es algo obvia, pero supongo que podría usar el AppendIterator para, por ejemplo, combinar una lista estática de nombres de archivos y el resultado de un DirectoryIterator . O bien, envuélvalo en un LimitIterator lugar de cablearlo en una condición for . Todas estas son características bastante básicas y se pueden hacer de forma manual en un foreach. Pero al menos RegexIterator y FilterIterator parecen adecuados para reducir cierta complejidad.

Pero al final es realmente una elección estilística. Tendría más sentido si tiene objetos personalizados que atraviesan algo (por ejemplo, un objeto VFS que puede apuntar a archivos reales o entradas de la base de datos). Pero incluso entonces podrías iterator_to_array convertir una lista así, y usar un foreach -over-array normal.

El único caso fue que es realmente imperativo preferir los iteradores si la fuente de datos es de tamaño ilimitado. Las matrices desplegadas para su uso en un foreach pueden consumir más memoria que un iterador que puede recuperar elemento por elemento.