Co to jest yield?
Do yieldkluczowych 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ć $keyw foreachza pomocą
yield $someKey => $someValue;
W funkcji generatora $someKeyjest to, czego szukasz $keyi $someValuektó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 rangefunkcji 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 rangePHP, będzie go wykonać, należy utworzyć całą tablicę liczb w pamięci i returnże cała tablica do foreachpętli, która będzie następnie przejść nad nim i wyjście wartości. Innymi słowy, foreachbędzie działać na samej tablicy. rangeFunkcja i foreachtylko „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 yieldsł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 xrangezawiera forpętlę, będzie ona wykonywana i ustępowała, dopóki nie $maxzostanie osiągnięta. Pomyśl o tym jak foreacho 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 yieldkluczowe 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 yieldprzed 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