Was ist yield
?
Das yield
Schlüsselwort gibt Daten von einer Generatorfunktion zurück:
Das Herzstück einer Generatorfunktion ist das Yield-Schlüsselwort. In seiner einfachsten Form ähnelt eine Yield-Anweisung einer Return-Anweisung, mit der Ausnahme, dass Yield nicht die Ausführung der Funktion stoppt und zurückgibt, sondern stattdessen einen Wert für die Code-Schleife über den Generator bereitstellt und die Ausführung der Generatorfunktion anhält.
Was ist eine Generatorfunktion?
Eine Generatorfunktion ist effektiv eine kompaktere und effizientere Möglichkeit, einen Iterator zu schreiben . Sie können eine Funktion (Ihre xrange
) definieren, die Werte berechnet und zurückgibt , während Sie sie durchlaufen :
foreach (xrange(1, 10) as $key => $value) {
echo "$key => $value", PHP_EOL;
}
Dies würde die folgende Ausgabe erzeugen:
0 => 1
1 => 2
…
9 => 10
Sie können auch die Kontrolle $key
in dem foreach
durch den Einsatz
yield $someKey => $someValue;
In der Generatorfunktion, $someKey
ist alles , was Sie erscheinen möchten $key
und $someValue
in dem Wert sein $val
. Im Beispiel der Frage ist das$i
.
Was ist der Unterschied zu normalen Funktionen?
Jetzt fragen Sie sich vielleicht, warum wir nicht einfach die native Funktion von PHP range
verwenden , um diese Ausgabe zu erzielen. Und richtig bist du. Die Ausgabe wäre die gleiche. Der Unterschied ist, wie wir dorthin gekommen sind.
Wenn wir range
PHP verwenden, wird es ausgeführt, das gesamte Array von Zahlen im Speicher und return
das gesamte Array in der foreach
Schleife erstellt, die dann darüber hinweggeht und die Werte ausgibt. Mit anderen Worten, das foreach
wird auf dem Array selbst arbeiten. Die range
Funktion und das foreach
einzige "Gespräch" einmal. Stellen Sie sich vor, Sie bekommen ein Paket per Post. Der Zusteller wird Ihnen das Paket geben und gehen. Und dann packen Sie das gesamte Paket aus und nehmen alles heraus, was sich darin befindet.
Wenn wir die Generatorfunktion verwenden, tritt PHP in die Funktion ein und führt sie aus, bis sie entweder das Ende oder ein yield
Schlüsselwort erreicht. Wenn es auf a trifft yield
, gibt es den zu diesem Zeitpunkt angegebenen Wert an die äußere Schleife zurück. Dann geht es zurück in die Generatorfunktion und setzt dort fort, wo es nachgegeben hat. Da Sie xrange
eine for
Schleife halten, wird diese ausgeführt und gibt nach, bis sie $max
erreicht wurde. Stellen Sie sich das wie foreach
den Generator vor, der Tischtennis spielt.
Warum brauche ich das?
Offensichtlich können Generatoren verwendet werden, um Speichergrenzen zu umgehen. Abhängig von Ihrer Umgebung kann das Ausführen eines range(1, 1000000)
Skripts Ihr Skript beschädigen, während das gleiche mit einem Generator einwandfrei funktioniert. Oder wie Wikipedia es ausdrückt:
Da Generatoren ihre Ertragswerte nur bei Bedarf berechnen, sind sie nützlich, um Sequenzen darzustellen, deren Berechnung teuer oder unmöglich wäre. Dazu gehören zB unendliche Sequenzen und Live-Datenströme.
Generatoren sollen auch ziemlich schnell sein. Aber denken Sie daran, dass wir, wenn wir schnell sprechen, normalerweise in sehr geringer Anzahl sprechen. Bevor Sie jetzt loslegen und Ihren gesamten Code ändern, um Generatoren zu verwenden, führen Sie einen Benchmark durch, um festzustellen, wo dies sinnvoll ist.
Ein weiterer Anwendungsfall für Generatoren sind asynchrone Coroutinen. Das yield
Schlüsselwort gibt nicht nur Werte zurück, sondern akzeptiert sie auch. Einzelheiten dazu finden Sie in den beiden unten verlinkten ausgezeichneten Blog-Posts.
Seit wann kann ich verwenden yield
?
Generatoren wurden in PHP 5.5 eingeführt . Der Versuch, yield
vor dieser Version zu verwenden , führt je nach dem Code, der auf das Schlüsselwort folgt, zu verschiedenen Analysefehlern. Wenn Sie also einen Analysefehler von diesem Code erhalten, aktualisieren Sie Ihr PHP.
Quellen und weiterführende Literatur:
yeild
eine Lösung wie diese bietet