2009-09-02 4 views
5

Versuchen Sie, wie ich könnte, kann ich nicht verstehen, was die IteratorIterator-Klasse tatsächlich tut. Ich verstehe, dass Klassen Traversable implementieren können, so dass die Engine weiß, dass es Schleife foreach und kann ich erkennen, dass IteratorIterator alles konvertieren soll, das Traversable in einen Iterator ist, aber ich kann nicht für das Leben von mir verstehen, wie.Wie funktioniert die PHP IteratorIterator Klasse?

Nehmen Sie zum Beispiel die Klasse PDOStatement; Wie würden die Standard-Iterator-Methoden (Next, Key, Rewind, etc.) implementiert werden, um eine Iteration über ein PDOS-Statement zu ermöglichen?

Entschuldigung, wenn meine Frage unklar ist, bin ich gerade dabei, den genauen Grund für diese Klasse zu begreifen und die Dokumentation darüber ist spärlich.

Danke,

Will

Update: die PHPT Dateien Wenn man durch, fand ich einen Test, der IteratorIterator verwendet:

<?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"; 
} 

?> 

Die erwartete Ausgabe lautet:

Hello 
World 

Ich folge nicht wirklich, wie das IteratorIterator-Konstrukt $ root-> child as annimmt ein Argument und wie es gelingt, über die Kindelemente zu iterieren.

+0

Ich fand die Antwort [hier] (http://blog.ircmaxell.com/2011/10/iteratoriterator-php-inconsisstencies.html). Aber es scheint mir, dass der IteratorIterator jetzt von geringer Bedeutung wird, nicht wahr? – akond

Antwort

1

Basierend auf this, ich denke, es ermöglicht Ihnen, über Iterated Objekte zu Iterieren. I.e. Sie können andere Objekte in Ihrem Master-Objekt ziehen und IteratorIterator für Ihr Master-Objekt verwenden. Iterieren Sie auch die untergeordneten Objekte.

UPDATE: Basierend auf Ihrem Update. Das ist für mich sinnvoll, obwohl es nur ein Wurzelobjekt gibt, so dass das Iterieren in diesem Beispiel nicht wirklich zutrifft, aber Sie könnten, wenn es mehr Wurzelobjekte gäbe. Mit anderen Worten, ich glaube, IteratorIterator ist das gleiche wie verschachtelte foreach-Schleifen, ohne alle Elemente eines jeden Objekts kennen zu müssen. Mit anderen Worten, eine verschachtelte foreach mit objektorientierten Objekten ... es gibt eine redundante Aussage. :-)

0

ich dachte Beispiel # 2 here ziemlich geradlinig ...
es läßt Du im Allgemeinen für die nächsten/vorherigen/Strom/Zurückspulen/Tastenfeld-Funktionen, erwartet von dem php foreach-Parser ein bestimmtes Verhalten für Ihre Klasse implementieren .

Um Ihre Frage zu implementieren, würde man eine Iterator-Klasse mit einem PDOStatement als Member erstellen, als zum Beispiel die nächste Methode verwenden, um PDOStatement :: fetch aufzurufen, um die nächste Anweisung zurückzugeben. Wenn Sie es speichern, können Sie sowohl perivous als auch current implementieren. Ich habe diese Klasse nicht zu viel benutzt, aber ich wette, es ist nicht so schwer, einen Rücklauf und Schlüssel zu implementieren. Beachten Sie, dass dies im Vorübergehen ist, also könnte ich falsch in den Details sein, aber ich denke, das Konzept sollte klar sein

+0

Ich bin mir nicht sicher, ob ich folge. Das Beispiel, mit dem Sie verlinkt haben, spricht über einen Standard-Iterator und nicht über die IteratorIterator-Klasse (http://us2.php.net/manual/en/class.iteratoriterator.php). Kannst du das bitte klären? – WilliamMartin

2

Wenn Sie es noch nicht gefunden haben, https://www.phpro.org/tutorials/Introduction-to-SPL.html hat ein paar Beispiele, die Ihnen helfen könnten.


IteratorIterator>

  • „Der Iterator-Wrapper ermöglicht die Umwandlung von irgendetwas, das Travers in einen Iterator ist."

Travers>

  • "Interface, um herauszufinden, ob eine Klasse verfahrbar mit foreach ist."
  • " Internal (eingebaut) Klassen, die diese Schnittstelle implementieren verwendet werden kann in ein foreach Konstrukt und nicht müssen IteratorAggregate oder Iterator implementieren. "
  • " Dies ist eine interne Motorschnittstelle die c nicht in PHP Skripten implementiert werden. Entweder IteratorAggregate oder Iterator muss stattdessen verwendet werden.“

Die Website einige RecursiveIteratorIterator Beispiele hat, die nützlich sein könnten, aber , wenn ich es richtig bekommen, ist IteratorIterator vom Scripting Sicht ziemlich nutzlos (wenn verwendet, um zumindest foreach).

Es schafft Iterateable aus Objekte Objekte die Travers Schnittstelle implementiert, aber intern Klassen die Travers Schnittstelle sind Implementierung foreachable sowieso und Skripte können nicht Travers implementieren ...

(Nicht in den Dokumenten erwähnt, implementiert das SimpleXMLElement Traversable)