Nedir yield
?
yield
Anahtar kelime jeneratör işlevinden döner veriler:
Bir jeneratör fonksiyonunun kalbi verim anahtar kelimesidir. En basit haliyle, bir getiri ifadesi, bir dönüş ifadesine çok benzemektedir, tek fark, fonksiyonun yürütülmesini durdurmak ve geri dönmek yerine, bunun yerine jeneratör üzerinde döngü yapan koda bir değer sağlamak ve jeneratör fonksiyonunun yürütülmesini duraklatmasıdır.
Jeneratör işlevi nedir?
Bir jeneratör işlevi bir Yineleyici yazmak için daha kompakt ve etkili bir yoldur . Siz bir işlev (sizin tanımlamanızı sağlar xrange
olacak) hesaplanması ve geri dönüş değerleri ise sen edilir üzerinde döngü :
foreach (xrange(1, 10) as $key => $value) {
echo "$key => $value", PHP_EOL;
}
Bu, aşağıdaki çıktıyı oluşturur:
0 => 1
1 => 2
…
9 => 10
Ayrıca kontrol edebilirsiniz $key
içinde foreach
kullanarak
yield $someKey => $someValue;
Jeneratör işlevinde, $someKey
sizin için görünür istediğiniz şey olur $key
ve $someValue
değer olmak $val
. Sorunun örneğinde bu $i
.
Normal işlevler arasındaki fark nedir?
Şimdi bu çıktıyı elde etmek için neden sadece PHP'nin yerel range
işlevini kullanmadığımızı merak edebilirsiniz . Ve haklısın. Çıktı aynı olurdu. Aradaki fark oraya nasıl ulaştığımız.
Kullandığımız zaman range
PHP, bunu çalıştırmak bellekte sayıların tüm dizi oluşturmak ve edecek return
o tüm dizi için foreach
o zaman ve çıkış değerleri üzerinden gidecek döngü. Başka bir deyişle, foreach
dizi üzerinde çalışır. range
Fonksiyonu ve foreach
sadece bir kez "konuşma". Postaya bir paket almak gibi düşün. Teslimatçı size paketi teslim edecek ve gidecektir. Ve sonra tüm paketi açıp orada ne varsa çıkarırsınız.
Oluşturucu işlevini kullandığımızda, PHP işleve adım atacak ve sonuna veya bir yield
anahtar kelimeye ulaşana kadar yürütecektir . A ile karşılaştığında yield
, o zaman değeri ne olursa olsun dış döngüye dönecektir. Daha sonra jeneratör fonksiyonuna geri döner ve verimden devam eder. Senin bu yana xrange
bir tutan for
döngü, bu çalıştırır ve kadar verim $max
ulaşıldı. Bunu düşünün foreach
ve ping pong oynayan jeneratör.
Neden buna ihtiyacım var?
Açıkçası, jeneratörler bellek sınırları etrafında çalışmak için kullanılabilir. Ortamınıza bağlı olarak, bir range(1, 1000000)
komut dosyası ölümcül olacak, bir jeneratör ile aynı iyi çalışır. Veya Wikipedia'nın belirttiği gibi:
Üreteçler, elde ettikleri değerleri sadece talep üzerine hesapladıkları için, bir kerede hesaplanması pahalı veya imkansız olan dizileri temsil etmek için kullanışlıdırlar. Bunlar, sonsuz dizileri ve canlı veri akışlarını içerir.
Jeneratörlerin de oldukça hızlı olması gerekiyor. Ancak hızlı konuştuğumuzda, genellikle çok az sayıda konuştuğumuzu unutmayın. Bu nedenle, şimdi bitmeden ve tüm kodlarınızı jeneratörleri kullanacak şekilde değiştirmeden önce, nerede mantıklı olduğunu görmek için bir kıyaslama yapın.
Jeneratörler için bir başka Kullanım Örneği asenkron koroutinlerdir. yield
Anahtar kelime yalnızca değerleri dönmez ama aynı zamanda onları kabul eder. Bununla ilgili ayrıntılar için, aşağıda bağlantı verilen iki mükemmel blog yayınına bakın.
Ne zamandan beri kullanabilirim yield
?
Jeneratörler PHP 5.5'te kullanılmaya başlandı . yield
Bu sürümden önce kullanılmaya çalışılması, anahtar kelimeyi izleyen koda bağlı olarak çeşitli ayrıştırma hatalarına neden olur. Bu koddan ayrıştırma hatası alırsanız PHP'nizi güncelleyin.
Kaynaklar ve ek okuma:
yeild
gibi bir çözümün ne işe yaradığını açıklayınız