Frage

Versuchen Sie, wie ich könnte ich nicht meinen Kopf um das, was die IteratorIterator Klasse tatsächlich der Fall ist. Ich verstehe, dass Klassen können Travers implementieren, damit der Motor es Schleife kennt, kann foreach mit und Ich weiß, dass IteratorIterator zu konvertieren alles soll die Travers in ein Iterator ist, aber ich kann für das Leben von mir nicht zu verstehen, wie.

Nehmen Sie

zum Beispiel der PDOStatement Klasse; Wie würden die Standard Iteratormethoden (nächste, Schlüssel, zurückspulen usw.) implementiert werden Iteration über einen PDOStatement zu erlauben?

Sorry, wenn meine Frage nicht klar ist, ich habe Schwierigkeiten nur den genauen Grund für diese Klasse und die Dokumentation zu erfassen auf es wenig ist.

Danke,

Will

Update: Wenn man durch die PHPT Dateien, fand ich einen Test, den 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 weiß nicht wirklich folgen, wie das IteratorIterator Konstrukt $ Wurzel- nimmt> Kind als Argument und wie es zu iterieren über die untergeordneten Elemente verwaltet.

War es hilfreich?

Lösung

Basierend auf diese , ich glaube, es erlaubt Ihnen zu Iterate über Iterated Objekte. D. h Sie können auch andere Objekte in Ihrem Master-Objekt ziehen und IteratorIterator auf Ihrem Master-Objekt, Iterate das Kind sich als gut.

UPDATE: Basierend auf Ihrem Update. Das macht Sinn für mich, obwohl es nur eine Root-Objekt ist, so iteriert sie nicht wirklich in diesem Beispiel gelten, aber man konnte, wenn es mehr Wurzelobjekte waren. Mit anderen Worten, ich glaube, IteratorIterator ist die gleiche wie verschachtelte foreach-Schleifen mit, ohne dass alle Elemente eines jeden Objekts kennen. Mit anderen Worten, eine verschachtelte foreach objektorientierten Objekten mit ... gibt es eine redundante Erklärung. : -)

Andere Tipps

Wenn Sie tut es noch finden, https: //www.phpro. org / tutorials / Introduction-to-SPL.html ein paar Beispiele, die Sie helfen könnten.


IteratorIterator>

  • "Der Iterator-Wrapper ermöglicht es die Umwandlung von allem, was ist Travers in einen Iterator. "

Travers>

  • "Interface zu erkennen, ob eine Klasse verfahrbaren foreach verwenden. "
  • "Interne (eingebaute) Klassen, dass diese Schnittstelle implementieren kann verwendet werden, in einem foreach-Konstrukt und nicht implementieren müssen IteratorAggregate oder Iterator. "
  • "Dies ist eine interne Engine-Schnittstelle die nicht in PHP implementiert werden Skripte. Entweder IteratorAggregate oder Iterator muss stattdessen verwendet werden. "

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

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

(nicht in der Dokumentation erwähnt, die SimpleXMLElement setzt Travers)

ich dachte Beispiel # 2 hier ganz gerade nach vorne ...
es kann Sie im Grunde 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.

so für Ihre Frage der Umsetzung, würde man einen Iterator-Klasse mit einem PDOStatement als memeber, als zum Beispiel die Verwendung mit der nächsten Methode erstellen die PDOStatement aufrufen :: holen seine nächste Anweisung zurückzukehren. Speicherung es wird Ihnen sowohl perivous und Strom umzusetzen. havn't verwendet diese Klasse zu viel, aber ich wette, es ist nicht so schwer, o einen Rücklauf und Schlüssel implementieren. Beachten Sie, dass dies auf der Fliege ist so, ich könnte auf den Details falsch sein, aber ich denke, das Konzept klar sein sollte,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top