PHP 5.5 YIELD

PHP 5.5’e generator özelliği yield anahtar kelimesi ile eklendi.
Bu sayede uğraşmaya gerek kalmadan kolayca iterator’ler oluşturulabiliyor. PHP 5.5 altı sürümlerde kullanılamaz.

Örneğin bir fonksiyonumuz var ve fonksiyon içerisinde 10 kez çevrim yapan bir döngümüz var. Eski sistemde bunu 2 biçimde yapabilirdik.

Ya recursive fonksiyon(kendi kendisini çağıran) oluşturup içerisinde dizi döndürür, tüm döngü sonrası diziyi gönderirdik(return) ya da dışarıdan sağladığımız döngü ile, döngü süresince her bir çevrimde fonksiyonu çağırırdık.

Yield generatör özelliğinde ise  iç döngülü ve dönen değerden tekrar döngü işlemli fonksiyona gerek kalmıyor.

Kullanımına bir örnek vermek gerekirse

function kendisini_topla($toplam, $adet) {
for($i = 0; $i < $adet; $i++) {
$toplam ++;
yield $toplam;
}
}

// cagiralim ve ilk tutari 5 kez arttırıp ekrana basalim
foreach(kendisini_topla(100, 5) as 
$toplam) {
echo "Toplam: $toplam \n";
}

İşlem sonucu
Toplam: 100
Toplam: 101
Toplam: 102
Toplam: 103
Toplam: 104

çıktı verecektir.

Aynı işlemi yield kullanmadan yapalım.

function kendisini_topla($toplam, $adet) {
   for($i = 0; $i < $adet; $i++) {
      $t[] = $toplam++;
   }
   return $t;
}
// cagiralim
$donen_toplam = kendisini_topla(100, 5);
//ekrana yansitalim
foreach($donen_toplam as $toplam) {
   echo "Toplam: $toplam \n";
}

İşlem sonucu yine aynı çıktıyı verecektir.
Toplam: 100
Toplam: 101
Toplam: 102
Toplam: 103
Toplam: 104

İkisi arasında neredeyse hiç fark yok gibi. Peki yield’in farkı ne? Birincisi pratikliği ikincisi ise  Bellekte kapladığı alan farkı!

Sayfanın en altında ölçüm sonuçları ve farkı görebilirsiniz, gerçi çok basit bir işlem yapılmış, yani fonksiyon gerektirmeyen bir karşılatırma yapılmış. Yield’in asıl fark yaratacağı kullanım, fonksiyonlar ve kendi kendisini çağıran işlemlerde, kısaca pratik ve kolayca  iterator’ler oluşturmada öne çıkacaktır.

http://www.php.net/manual/tr/language.generators.overview.php

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Notice: ob_end_flush(): failed to send buffer of zlib output compression (0) in /home/veblebi/public_html/wp-includes/functions.php on line 3644