Co to jest yield
?
Do yield
kluczowych danych wraca z funkcji generującej:
Sercem funkcji generatora jest słowo kluczowe wydajności. W najprostszej formie instrukcja return wygląda bardzo podobnie do instrukcji return, z tą różnicą, że zamiast zatrzymywać wykonywanie funkcji i zwracać, wydajność zamiast tego podaje wartość pętli kodu nad generatorem i wstrzymuje wykonywanie funkcji generatora.
Co to jest funkcja generatora?
Funkcja generatora jest bardziej kompaktowym i wydajnym sposobem na napisanie Iteratora . To pozwala zdefiniować funkcję (twój xrange
), które będą obliczenia i zwrotu wartości podczas jesteś zapętlenie nad nim :
foreach (xrange(1, 10) as $key => $value) {
echo "$key => $value", PHP_EOL;
}
Spowoduje to utworzenie następującego wyniku:
0 => 1
1 => 2
…
9 => 10
Można również kontrolować $key
w foreach
za pomocą
yield $someKey => $someValue;
W funkcji generatora $someKey
jest to, czego szukasz $key
i $someValue
która ma być wartością $val
. W przykładzie pytania to jest $i
.
Jaka jest różnica w stosunku do normalnych funkcji?
Teraz możesz się zastanawiać, dlaczego nie używamy po prostu natywnej range
funkcji PHP do osiągnięcia tego wyniku. I masz rację. Wynik byłby taki sam. Różnica polega na tym, jak się tam dostaliśmy.
Gdy używamy range
PHP, będzie go wykonać, należy utworzyć całą tablicę liczb w pamięci i return
że cała tablica do foreach
pętli, która będzie następnie przejść nad nim i wyjście wartości. Innymi słowy, foreach
będzie działać na samej tablicy. range
Funkcja i foreach
tylko „rozmowa” raz. Pomyśl o tym jak o otrzymaniu paczki pocztą. Doręczyciel wręczy ci paczkę i wyjdzie. A następnie rozpakowujesz całą paczkę, wyjmując wszystko, co jest w środku.
Kiedy użyjemy funkcji generatora, PHP wejdzie do funkcji i wykona ją, dopóki nie napotka końca lub yield
słowa kluczowego. Po napotkaniu znaku a yield
, zwróci dowolną wartość w tym czasie do zewnętrznej pętli. Następnie wraca do funkcji generatora i kontynuuje od miejsca, w którym ustąpił. Ponieważ Twoja pętla xrange
zawiera for
pętlę, będzie ona wykonywana i ustępowała, dopóki nie $max
zostanie osiągnięta. Pomyśl o tym jak foreach
o generatorze grającym w ping ponga.
Dlaczego tego potrzebuję?
Oczywiście, generatory mogą być używane do obejścia limitów pamięci. W zależności od środowiska robienie range(1, 1000000)
skryptu zakończy się śmiercią, podczas gdy to samo z generatorem będzie działać dobrze. Lub, jak ujęła to Wikipedia:
Ponieważ generatory obliczają uzyskane wartości tylko na żądanie, są przydatne do reprezentowania sekwencji, które byłyby drogie lub niemożliwe do obliczenia na raz. Należą do nich np. Sekwencje nieskończone i strumienie danych na żywo.
Generatory również powinny być dość szybkie. Pamiętaj jednak, że kiedy mówimy o szybkim czasie, zwykle rozmawiamy bardzo małymi liczbami. Zanim więc wybiegniesz i zmienisz cały kod na generatory, wykonaj test porównawczy, aby zobaczyć, gdzie ma to sens.
Innym przypadkiem użycia generatorów są asynchroniczne coroutines. Słowo yield
kluczowe nie tylko zwraca wartości, ale także je akceptuje. Aby uzyskać szczegółowe informacje na ten temat, zobacz dwa doskonałe posty na blogu połączone poniżej.
Od kiedy mogę używać yield
?
Generatory zostały wprowadzone w PHP 5.5 . Próba użycia yield
przed tą wersją spowoduje różne błędy analizy, w zależności od kodu występującego po słowie kluczowym. Jeśli więc wystąpi błąd analizy składni z tego kodu, zaktualizuj PHP.
Źródła i dalsze czytanie:
yeild
, powiedzmy, takie rozwiązanie: ideone.com/xgqevM