Generators
PHP Manual

Résumé sur les générateurs

(PHP 5 >= 5.5.0)

Les générateurs fournissent une façon simple d'implémenter des itérateurs sans le coût, ni la complexité d'implémenter une classe qui implémente l'interface Iterator.

Un générateur vous permet d'écrire du code qui utilise foreach pour parcourir un jeu de données, sans avoir à construire un tableau en mémoire pouvant conduire à la limite de la mémoire, ou nécessiter du temps de génération. Au lieu de cela, vous pouvez écrire une fonction générateur, qui est identique à une fonction normale, excepté le fait qu'au lieu de faire un seul retour, un générateur peut yield autant de fois que nécessaire afin de fournir les valeurs à parcourir.

Un exemple simple de ce mécanisme est la ré-implémentation de la fonction range() sous la forme d'un générateur. La fonction standard range() doit générer un tableau avec chaque valeur le contenant, et le retourner, ce qui peut conduire en la génération de gros tableaux : par exemple, l'appel du code range(0, 1000000) peut consommer plus de 100 Mo de mémoire.

Comme alternative, nous pouvons implémenter un générateur xrange(), qui n'aura en besoin mémoire que la seule création d'un objet Iterator, et surveiller le statut courant interne du génération, ce qui revient à une consommation mémoire inférieure à 1 Ko.

Exemple #1 Implémentation de la fonction range() sous la forme d'un générateur

<?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;
        }
    }
}

/* Note que les fonctions range() et xrange() produisent le
 * même affichage. */

echo 'Chiffre paire simple depuis range():  ';
foreach (
range(192) as $number) {
    echo 
"$number ";
}
echo 
"\n";

echo 
'Chiffre paire simple depuis xrange(): ';
foreach (
xrange(192) as $number) {
    echo 
"$number ";
}
?>

L'exemple ci-dessus va afficher :

Chiffre paire simple depuis range():  1 3 5 7 9 
Chiffre paire simple depuis xrange(): 1 3 5 7 9 

Generators
PHP Manual