Domanda

Per quanto mi sforzi, non riesco a capire cosa fa effettivamente la classe IteratorIterator.Capisco che le classi possono implementare Traversable in modo che il motore sappia che può eseguire il loop utilizzando foreach E Mi rendo conto che IteratorIterator dovrebbe convertire tutto ciò che è Traversable in un Iterator, ma non riesco a capire come.

Prendiamo ad esempio il Dichiarazione PDO classe;come verrebbero implementati i metodi Iterator standard (next, key, rewind, ecc.) per consentire l'iterazione su un'istruzione PDOStement?

Scusate se la mia domanda non è chiara, sto solo faticando a comprendere il motivo esatto di questo corso e la documentazione al riguardo è scarsa.

Grazie,

Volere

Aggiornamento:Esaminando i file phpt, ho trovato un test che utilizza 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";
}

?>

L'output atteso è:

Hello
World

In realtà non seguo il modo in cui il costrutto IteratorIterator accetta $root->child come argomento e come riesce a scorrere gli elementi figlio.

È stato utile?

Soluzione

Basato su Questo, penso che ti permetta di scorrere oggetti iterati.Cioè.puoi estrarre altri oggetti nel tuo oggetto principale e utilizzare IteratorIterator sul tuo oggetto principale, iterare anche gli oggetti secondari.

AGGIORNAMENTO:In base al tuo aggiornamento.Questo ha senso per me, anche se esiste un solo oggetto root, quindi l'iterazione non si applica realmente in questo esempio, ma potresti farlo se ci fossero più oggetti root.In altre parole, credo che IteratorIterator equivalga ad avere cicli foreach nidificati, senza dover conoscere tutti gli elementi di ciascun oggetto.In altre parole, un foreach annidato che utilizza oggetti orientati agli oggetti...c'è un'affermazione ridondante.:-)

Altri suggerimenti

Se fatto trovare ancora, https: //www.phpro. org / tutorial / Introduzione-to-SPL.html ha un paio di esempi che potrebbero aiutare.


IteratorIterator>

  • "Questo involucro iteratore permette al conversione di tutto ciò che è Attraversabile in un Iterator. "

Traversable>

  • "Interfaccia per rilevare se una classe è traversable utilizzando foreach ".
  • "interne (built-in) classi che implementare questa interfaccia può essere utilizzata in un foreach costruire e non fare necessario implementare IteratorAggregate o Iterator. "
  • "Si tratta di un'interfaccia motore interno che non può essere implementato in PHP script. Sia IteratorAggregate o Iteratore deve essere usato al posto. "

Il sito ha alcuni esempi RecursiveIteratorIterator che potrebbero essere a portata di mano, ma, se ho capito bene , IteratorIterator è dal punto di scripting di vista abbastanza inutile (quando utilizzato per foreach almeno).

Si crea Iterateable oggetti fuori di oggetti che implementano l'interfaccia Traversable, ma le classi che implementano l'interfaccia intern Traversable sono foreachable comunque e gli script non può attuare Traversable ...

(non menzionati nella documentazione, il SimpleXMLElement sta attuando Traversable)

ho pensato esempio # 2 qui è abbastanza semplice ...
permette in sostanza di implementare un comportamento specifico per la classe per i prossimi precedente / corrente / riavvolgimento / funzioni di matrice chiave /, previsto dal parser php foreach.

modo per implementare la tua domanda, si potrebbe creare una classe Iterator con una PDOStatement come memeber, rispetto ad esempio utilizzare il metodo successivo per chiamare il PDOStatement :: prendere per tornare la sua prossima dichiarazione. riporlo vi permetterà di implementare sia perivous e corrente. havn't usato questa classe troppo, ma scommetto che non è così difficile o implementare un rewind e la chiave. notare che questa è in moto in modo potrei sbagliarmi sui dettagli, ma credo che il concetto dovrebbe essere chiaro

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top