Nedir yield?
yieldAnahtar 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 xrangeolacak) 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 $keyiçinde foreachkullanarak
yield $someKey => $someValue;
Jeneratör işlevinde, $someKeysizin için görünür istediğiniz şey olur $keyve $someValuedeğ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 rangeiş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 rangePHP, bunu çalıştırmak bellekte sayıların tüm dizi oluşturmak ve edecek returno tüm dizi için foreacho zaman ve çıkış değerleri üzerinden gidecek döngü. Başka bir deyişle, foreachdizi üzerinde çalışır. rangeFonksiyonu ve foreachsadece 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 yieldanahtar 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 xrangebir tutan fordöngü, bu çalıştırır ve kadar verim $maxulaşıldı. Bunu düşünün foreachve 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. yieldAnahtar 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ı . yieldBu 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:
yeildgibi bir çözümün ne işe yaradığını açıklayınız