Różnica pomiędzy return
i yield
wydawało się oczywiste, dopóki nie zorientowali się tam także yield from
i możliwość łączenia obu return
i yield
w tej samej funkcji!
Rozumiałem, return
że wszystko po tym nie zostało wykonane, prawda?
Jednak:
function generate(): iterable {
return [1, 2, 3];
}
foreach (generate() as $value) {
echo $value;
}
Produkuje: „123”
Ale następujące:
function generate(): iterable {
return [1, 2, 3];
yield;
}
foreach (generate() as $value) {
echo $value;
}
Nic nie produkuje! Czy to oznacza, że dochód jest realizowany?
Czy to błąd?
var_dump(generate()->GetReturn());
Odpowiedzi:
Return
Po prostu zwraca dzwoniącemu wyjątkową wartość.
Yield
Przekształć bieżącą funkcję / metodę, aby zwrócić a
Generator
, która da więcej niż unikalną wartość: za każdym razem, gdyyield
jest wyzwalana, daje wartość wywołującemu, pojedynczo, tradycyjnie za pomocąforeach
pętli.Yield
+Return
Generatory, oprócz generowania wartości, mogą również zapewniać unikalną zwracaną wartość. Ta wartość nie będzie częścią pętli wokół generatora, należy uzyskać do niej dostęp przy użyciu
Generator::getReturn()
metody.Return
+Yield
Może to być postrzegane jako błąd, ale tak nie jest.
Są to dwie fazy:
generate()
funkcja zawierayield
słowo kluczowe, dlatego jest oznaczona jako wytwarzającaGenerator
.return
zdarza się przedyield
, generator nie ma szansy wygenerować żadnej wartości. Jednakże[1, 2, 3]
macierz może być pobrana zGenerator::getReturn()
.Kompletny przykład z adnotacjami:
źródło
Z dokumentacji :
Nie ma więc znaczenia, czy
yield
jest ono wykonywane, parser widzi je gdzieś w definicji funkcji i zamienia w generator.Jeśli funkcja nigdy nie wykonuje
yield
instrukcji, generator nie generuje żadnych wartości. Zwracana wartośćreturn
jest ignorowana podczas próby użycia wyniku. Dokumentacja mówi:Więc możesz zrobić:
źródło