Generators
PHP Manual

Generator et les objets

Lorsqu'une fonction générateur est appelée pour la première fois, un objet de la classe interne Generator est retourné. Cet objet implémente l'interface Iterator de la même façon qu'un objet itérateur le ferait.

La plupart des méthodes de la classe Generator a la même sémantique que les méthodes de l'interface Iterator, mais les objets du générateur ont une méthode supplémentaire : send().

Attention

Les objets Generator ne peuvent être instanciés via le mot clé new.

Exemple #1 La classe Generator

<?php
class Generator implements Iterator {
    public function 
rewind();          // Ré-initialise l'itérateur. Si
                                       // l'itération a déjà commencé,
                                       // ceci va émettre une exception.

    
public function valid();           // Retourne false si l'itérateur
                                       // a été fermé.
                                       // Sinon, retourne true.

    
public function current();         // Retourne la valeur fournie.

    
public function key();             // Retourne la clé fournie.

    
public function next();            // Reprend l'exécution du
                                       // générateur.
    
    
public function send($value);      // Envoi la valeur fournie au
                                       // générateur comme résultat
                                       // de l'expression et reprend
                                       // l'exécution du générateur.
}
?>

Generator::send()

La méthode Generator::send() permet aux valeurs d'être injectées dans les fonctions du générateur pendant l'itération. La valeur injectée sera retournée depuis la structure yield et peut ainsi être utilisée comme n'importe quelle autre variable dans la fonction générateur.

Exemple #2 Utilisation de la méthode Generator::send() pour injecter des valeurs

<?php
function printer() {
    while (
true) {
        
$string yield;
        echo 
$string;
    }
}

$printer printer();
$printer->send('Hello world!');
?>

L'exemple ci-dessus va afficher :

Hello world!

Generators
PHP Manual