Heim >Backend-Entwicklung >PHP-Tutorial >Analyse der Syntaxdetails des PHP-Generators

Analyse der Syntaxdetails des PHP-Generators

伊谢尔伦
伊谢尔伦Original
2016-11-23 09:10:131234Durchsuche

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 = <<<&#39;EOF&#39;
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(&#39;;&#39;, $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 blocks

Nullwert 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).&#39;... &#39;;
    }
?>

2... 1... 0...

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PHP-GeneratorobjektNächster Artikel:PHP-Generatorobjekt