Heim >Backend-Entwicklung >PHP-Tutorial >Analyse der Syntaxdetails des PHP-Generators
Eine Generatorfunktion sieht genauso aus wie eine gewöhnliche Funktion, außer dass der Generator bei Bedarf mehrere Werte erzeugt, anstatt einen einzelnen Wert zurückzugeben.
Wenn die Generatorfunktion aufgerufen wird, gibt sie einen zurück Wenn Sie über dieses Objekt iterieren (z. B. durch eine foreach-Schleife), ruft PHP die Generatorfunktion jedes Mal auf, wenn ein Wert erforderlich ist, und speichert dann den generierten Wert, wenn der Generator einen Wert erzeugt wird wiederhergestellt, wenn der nächste Wert benötigt wird.
Wenn keine weiteren Werte erzeugt werden, kann die Generatorfunktion einfach beendet werden und der aufrufende Code wird fortgesetzt, als ob ein Array alle seine Werte aufgebraucht hätte.
Hinweis:
Generatoren können keine Werte zurückgeben: Dies führt zu einem Kompilierungsfehler. Eine leere Return-Anweisung in einem Generator stellt eine gültige Syntax dar und führt zum Ausfall des Generators.
Yield-Schlüsselwort
Der Kern einer Generatorfunktion ist das Schlüsselwort yield. In seiner einfachsten Form ähnelt eine yield-Anweisung einer return-Anweisung, mit der Ausnahme, dass yield einen Wert zum Anzeigen des Generators bereitstellt Generator, anstatt einen Wert zurückzugeben und dann die Ausführung zu stoppen.
Beispiel Nr. 1 Einfaches Beispiel für die Erzeugung eines Werts
<?php function gen_one_to_three() { for ($i = 1; $i <= 3; $i++) { // Note that $i is preserved between yields. yield $i; } } $generator = gen_one_to_three(); foreach ($generator as $value) { echo "$value\n"; } ?>
Die obige Routine würde Folgendes ausgeben:
1 2 3
Hinweis:
Intern wird der serialisierte Ganzzahlschlüssel mit dem Ausgabewert gepaart, genau wie ein nicht-assoziatives Array
Achtung, wenn Sie Kontextausdrücke verwenden. Bei der Verwendung von yield (z. B. in einer Zuweisungsanweisung rechts vom Gleichheitszeichen) achten Sie darauf, Klammern zu verwenden. Beispielsweise ist der folgende Code korrekt:
$data = (yield $value);
Aber Der folgende Code verursacht einen Parsing-Fehler:
$data = yield $value;
Diese Syntax kann mit der send()-Methode im Generatorobjekt verwendet werden.
Holen Sie sich den Wert mit dem Schlüssel
PHP unterstützt assoziative Arrays sowie Generatoren. Zusätzlich zum Generieren einfacher Werte können Sie gleichzeitig auch Schlüssel generieren Die Syntax des /value-Paares ist sehr einfach und kann zum Definieren assoziativer Arrays verwendet werden, wie unten gezeigt.
Beispiel #2 Ein Schlüssel/Wert-Paar liefern
Die obige Routine wird Ausgabe:<?php /* The input is semi-colon separated fields, with the first * field being an ID to use as a key. */ $input = <<<'EOF' 1;PHP;Likes dollar signs 2;Python;Likes whitespace 3;Ruby;Likes blocks EOF; function input_parser($input) { foreach (explode("\n", $input) as $line) { $fields = explode(';', $line); $id = array_shift($fields); yield $id => $fields; } } foreach (input_parser($input) as $id => $fields) { echo "$id:\n"; echo " $fields[0]\n"; echo " $fields[1]\n"; } ?>Vorsicht ist die gleiche wie bei der früheren Generierung einfacher Werte in einem Kontextausdruck, wobei die Yield-Anweisung in Klammern eingeschlossen werden muss:
1: PHP Likes dollar signs 2: Python Likes whitespace 3: Ruby Likes blocksNullwert generieren
$data = (yield $key => $value);
Yield kann ohne Parameter aufgerufen werden, um NULL-Werte mithilfe automatisch generierter Schlüssel zu generieren.
Beispiel Nr. 3: NULL-Werte generieren
Die obige Routine gibt aus:<?php function gen_three_nulls() { foreach (range(1, 3) as $i) { yield; } } var_dump(iterator_to_array(gen_three_nulls())); ?>Erzeugen von Werten durch Referenz
array(3) { [0]=>NULL [1]=>NULL [2]=>NULL }
Generatorfunktionen können Werte durch Referenzen erzeugen. Dies ist dasselbe wie die Rückgabe von Referenzen aus Funktionen: durch Hinzufügen von & vor der Funktionsname.
Beispiel #4 Werte durch Referenz liefern
Die obige Routine gibt Folgendes aus:<?php function &gen_reference() { $value = 3; while ($value > 0) { yield $value; } } /* 注意我们可以在循环中改变$number * because the generator is yielding references, $value * within gen_reference() changes. */ foreach (gen_reference() as &$number) { echo (--$number).'... '; } ?>
2... 1... 0...