Üreteçlere giriş

(PHP 5 >= 5.5.0, PHP 7)

Üreteçler, Iterator arayüzünü gerçekleyen bir sınıfı gerçeklemenin karmaşıklığı ve giderleri olmaksızın basit yineleyicileri gerçeklemek için kolay bir yol sağlar.

Bir üreteç, önemli miktarda işlem süresi gerektirmeden ve bellek sınırını aşabilecek bir dizi oluşturmaya gerek kalmadan bir dizi veriyi yinelemek için foreach kullanan bir kod yazmanızı sağlar. Bunun için bir üreteç işlevini normal bir işlev yazar gibi yazabilirsiniz, siz bir kez değer döndürmeyi, beklerken bir üreteç üzerinde yinelenecek değerleri sağlamak için gerektiği kadar çok kez değer döndürebilir.

Buna basit bir örnek range() işlevini bir üreteç olarak tekrar gerçeklemektir. Standard range() işlevi her değeri ve onun dönen değerini içeren devasa boyutlara ulaşabilen bir dizi üretmek zorundadır. Örneğin, range(0, 1000000) çağrısı 100MB üzerinde bellek kullanımıyla sonuçlanabilir.

Bir seçenek olarak, bir xrange() üreteci gerçekleyebiliriz, tek ihtiyacımız bir Iterator nesnesi oluşturmaya yetecek bellek ayırmak ve 1 kilobayttan azıyla dönmesi için üretecin dahili durumunu izlemektir.

Örnek 1 - range() işlevini bir üreteç olarak gerçeklemek

<?php
function xrange($start$limit$step 1) {
    if (
$start $limit) {
        if (
$step <= 0) {
            throw new 
LogicException('Step must be +ve');
        }

        for (
$i $start$i <= $limit$i += $step) {
            
yield $i;
        }
    } else {
        if (
$step >= 0) {
            throw new 
LogicException('Step must be -ve');
        }

        for (
$i $start$i >= $limit$i -= $step) {
            
yield $i;
        }
    }
}

/*
 * range() ve xrange() işlevlerinin ikisi de aşağıda 
 * benzer çıktıyı verecektir.
 */

echo 'range() içindeki bir haneli tek sayılar:  ';
foreach (
range(192) as $number) {
    echo 
"$number ";
}
echo 
"\n";

echo 
'xrange() içindeki bir haneli tek sayılar: ';
foreach (
xrange(192) as $number) {
    echo 
"$number ";
}
?>

Yukarıdaki örneğin çıktısı:

range() içindeki bir haneli tek sayılar: 1 3 5 7 9 
xrange() içindeki bir haneli tek sayılar: 1 3 5 7 9 

Generator nesneleri

Bir üreteç işlevi çağrıldığında dahili Generator sınıfının yeni bir nesnesi döner. Bu nesne Iterator arayüzünü gerçekler. Bu, sadece ileri doğru yineleme yapan bir yineleme nesnesinin yaptığını yapacak ve değer gönderme ve döndürme dahil, üretecin durumunu da değiştirmeye yarayacak çağırılabilir yöntemler sağlayacaktır.