<?php
function generator(): Generator
{
echo "Je suis un générateur !\n";
for ($i = 1; $i <= 3; $i++) {
yield $i;
}
}
// Initialiser le générateur
$generator = generator();
// Remettre le générateur au début de la première expression yield,
// si ce n'est pas déjà le cas
$generator->rewind(); // Je suis un générateur !
// Rien ne se passe ici ; le générateur est déjà remis à zéro
$generator->rewind(); // Pas de sortie (NULL)
// Cela remet le générateur au début de la première expression yield,
// si ce n'est pas déjà le cas, et itère sur le générateur
foreach ($generator as $value) {
// Après avoir renvoyé la première valeur, le générateur reste à
// la première expression yield jusqu'à ce qu'il reprenne l'exécution et avance à la prochaine yield
echo $value, PHP_EOL; // 1
break;
}
// Reprendre et remettre à zéro à nouveau. Aucune erreur ne se produit car le générateur n'a pas avancé au-delà du premier yield
$generator->rewind();
echo $generator->current(), PHP_EOL; // 1
// Aucune erreur ne se produit, le générateur est toujours à la première yield
$generator->rewind();
// Cela fait avancer le générateur à la deuxième expression yield
$generator->next();
try {
// Cela lancera une exception,
// car le générateur a déjà avancé à la deuxième yield
$generator->rewind(); // Erreur fatale : Exception non capturée : Impossible de remettre un générateur qui a déjà été exécuté
} catch (Exception $e) {
echo $e->getMessage();
}
?>
L'exemple ci-dessus va afficher :
Je suis un générateur !
1
1
Impossible de remettre un générateur qui a déjà été exécuté