Was ist yield?
Das yieldSchlü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 $keyin dem foreachdurch den Einsatz
yield $someKey => $someValue;
In der Generatorfunktion, $someKeyist alles , was Sie erscheinen möchten $keyund $someValuein 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 rangeverwenden , 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 rangePHP verwenden, wird es ausgeführt, das gesamte Array von Zahlen im Speicher und returndas gesamte Array in der foreachSchleife erstellt, die dann darüber hinweggeht und die Werte ausgibt. Mit anderen Worten, das foreachwird auf dem Array selbst arbeiten. Die rangeFunktion und das foreacheinzige "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 yieldSchlü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 xrangeeine forSchleife halten, wird diese ausgeführt und gibt nach, bis sie $maxerreicht wurde. Stellen Sie sich das wie foreachden 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 yieldSchlü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, yieldvor 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:
yeildeine Lösung wie diese bietet