Der Unterschied zwischen return
und yield
schien klar zu sein, bis ich herausfand, dass es auch yield from
die Möglichkeit gab, beide return
und yield
in derselben Funktion zu kombinieren !
Mein Verständnis von return
war , dass alles nach wurde nicht ausgeführt, nicht wahr?
Jedoch:
function generate(): iterable {
return [1, 2, 3];
}
foreach (generate() as $value) {
echo $value;
}
Produziert: "123"
Aber folgendes:
function generate(): iterable {
return [1, 2, 3];
yield;
}
foreach (generate() as $value) {
echo $value;
}
Produziert nichts! Das heißt also, dass die Rendite ausgeführt wird?
Ist das ein Fehler?
var_dump(generate()->GetReturn());
Antworten:
Return
Gibt dem Anrufer einfach einen eindeutigen Wert zurück.
Yield
Transformieren Sie die aktuelle Funktion / Methode, um a zurückzugeben
Generator
, das mehr als einen eindeutigen Wert erzeugt: Jedes Malyield
, wenn es ausgelöst wird, gibt es den Wert nacheinander an den Aufrufer weiter, wobei traditionell eineforeach
Schleife verwendet wird.Yield
+Return
Generatoren können zusätzlich zum Generieren von Werten auch einen eindeutigen Rückgabewert bereitstellen. Dieser Wert ist nicht Teil der Schleife um den Generator, sondern muss mit der
Generator::getReturn()
Methode aufgerufen werden .Return
+Yield
Dies könnte als Fehler angesehen werden, ist es aber nicht.
Sie sind zwei Phasen:
generate()
Funktion dasyield
Schlüsselwort und wird daher als a erzeugend markiertGenerator
.return
dies zufällig vor dem liegtyield
, hat der Generator keine Chance, einen Wert zu erzeugen. Das[1, 2, 3]
Array kann jedoch mit abgerufen werdenGenerator::getReturn()
.Ein vollständig kommentiertes Beispiel:
quelle
Aus der Dokumentation :
Es spielt also keine Rolle, ob das
yield
ausgeführt wird, der Parser sieht es irgendwo in der Funktionsdefinition und verwandelt es in einen Generator.Wenn die Funktion die
yield
Anweisung niemals ausführt , erzeugt der Generator keine Werte. Der von zurückgegebene Wertreturn
wird ignoriert, wenn Sie versuchen, das Ergebnis zu verwenden. Die Dokumentation sagt:So könnten Sie tun:
quelle