Bir Generator(jeneratör-üretec) fonksiyonu, normal bir fonksiyona benzemektedir, ancak bir değer döndürmek yerine, bir jeneratör Yield ihtiyaç duyduğu kadar değer üretir. Yield içeren herhangi bir fonksiyon , bir jeneratör fonksiyonudur.
Bir üreteç işlevi çağrıldığında üzerinde yineleme yapılabilecek bir nesne döndürür. Bu nesne üzerinde yineleme yaptığınızda (örneğin foreach ile), PHP bir değere her ihtiyaç duyuşunda nesnenin yineleme yöntemlerini çağırır ve üreteç bir değer ürettiğinde üretecin durumunu kaydeder, böylece yeni bir değere her ihtiyaç duyuluşunda üreteç kaldığı yerden devam edebilir.
Üretilecek değer kalmadığında, Jenerator basitçe çıkar ve adeta bir dizi değerlerini tüketmiş gibi kod çağrılmaya devam eder.
Bir jenerator fonksiyonun kalbi, Yield anahtar sözcüğüdür. En basit haliyle, bir Yield ifadesi, fonksiyonun çalışmasını durdurmak ve geri döndürmek yerine, bunun yerine, jeneratör üzerinde döngü koduna bir değer sağlamak ve jeneratör fonksiyonunun çalışmasını duraklatmak dışında bir return ifadesine çok benzer.
PHP'de fonksiyon yazmayı biliyoruz. Fonksiyonların herhangi biryerde sonlanması ve geriye değer döndürmesi için de return kullanıdığımızı biliyoruz. İşte yield tıpkı return gibi geriye değer döndürür ama return'den farklı olarak fonksiyonu sonlandırmaz. Özetle değer üretir. Bu nedenle de yield'li fonksiyonlara üreteç (generator) denir.
Avantajları
Doğrudan kavram hakkında konuşursak, hala kafanızın karıştığı tahmin edilmektedir, Öyleyse, aşağıdaki gibi jeneratörün avantajları nelerdir:
Jeneratör PHP uygulamalarının performansı üzerinde çok büyük bir etkiye sahiptir.
PHP kodu çalıştığında çok fazla bellek tasarrufu sağlar.
Büyük miktarda veri hesaplamak için daha uygun.
PHP Jeneratör nedir?
5.5 sürümünde PHP'ye eklenen jeneratörler, bellekte bir dizi oluşturmaya gerek kalmadan verilerde dolaşmanın basit bir yolunu sağlayan fonksiyonlardır.
ÖRNEK:


<?php
function getRange ($max = 10) {

  for ($i = 1; $i < $max; $i++) {

  return $i;
 }
    
}

echo getRange();  
?>
	

Yukarda ki örnekte $i değerinin sadece 1 rakamı ekrana yazar fonksiyon içinden ve döngüyü sonlandırırak çıkar. Ancak bir diziye veriler eklenebilir ve sonuca ulaşabiliriz.


<?php
function getRange ($max = 10) {
    $array = [];

    for ($i = 1; $i < $max; $i++) {
        $array[] = $i;
    }

    return $array;
}

foreach (getRange(9) as $range) {
    echo "Dataset {$range} <br>";
}

?>

ÇIKTI:

Dataset 1 
Dataset 2 
Dataset 3 
Dataset 4 
Dataset 5 
Dataset 6 
Dataset 7 
Dataset 8 
Yukarıdaki örneğe Yield jeneratorle yaparsak.


function getRange ($max = 10) {

    for ($i = 1; $i < $max; $i++) {
     
      yield $i;   
    }
}

foreach (getRange(9) as $range) {
    echo "Dataset {$range} <br>";
}	

Yukardaki örnek return ifadelerinde olduğu gibi bir diziye depolanmadan kolaylıkla çıktı verebilir.
PHP Generator çok büyük sayıdaki döngüleri daha hızlı ve daha az kaynak tüketerek oluşturmamıza yarıyor.


function MB($byte){
	return number_format($byte/1048576, 2);
}


function getRange ($max = 1000000) {
    $array = [];

    for ($i = 1; $i < $max; $i++) {
        $array[] = $i;
    }

    return $array;
}

$depo =getRange();

echo MB(memory_get_usage())."<br>";

//32,37mb bellek kullanılır.


Yukarda ki örnek return ifadesinde 32.37 mb bellek kullanır, Yield ne kadar kullanır bakalım.


<?php

function MB($byte){
	return number_format($byte/1048576, 2);
}

function getVerim ($max = 10) {

    for ($i = 1; $i < $max; $i++) {
     
      yield $i;   
    }
}

$verim =getVerim(1000000);
echo MB(memory_get_usage());

?>


Yield kullanınca .37mb alan kullandı.
ÇIKTI:
PHP sürümünüzün erişebileceği en büyük sayı olan PHP_INT_MAX'dir . return ifadeli örneğe bu sayıyı ekleyin tarayıcıya gidin ve yenileyin. Fakat bu sefer farklı bir şey fark edeceksiniz. Jeneratör komut dosyası bir uyarı hatası veriyor.
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes)
PHP'nin hafızası doldu. Akla gelen olası çözümler arasında php.ini'ye girilmesi ve memory_limit'in arttırılması yer alıyor . Kendimize şu soruları soralım, bu gerçekten etkili mi? Tüm sunucumuzun hafızasını almak için tek bir komut dosyası mı istiyoruz? Cevaplar hayır ve hayır. Bu etkili değildir ve tek bir komut dosyasının tüm hafızamızı kullanmasını istemiyoruz.
Jeneratör Kullanımı
Jeneratörler inkar edemeyeceğimiz önemli bir performans artışı sunuyor. Çoğu zaman PHP kodlarımızın işlenmesi için güçlü sunuculara ihtiyacımız yoktur. Sadece biraz refactoring(kod düzenleme) yapmamız gerekiyor. Jeneratörler kullanışlıdır ve biz onları daha fazla kullanmamalıyız.
Lütfen konu haricinde soru sormayın cevaplanmayacaktır. Yorumunuz onaylandıktan sonra yayınlanacaktır. Lütfen Yukarıda ki mesajları okuyun tekrar aynı soruları sormayın.