(PHP 5 >= 5.5.0, PHP 7, PHP 8)
Generator::rewind — Ré-initialise l'itérateur au premier yield
La méthode remet le générateur à l'endroit précédant le premier yield
.
Si le générateur n'est pas au premier yield
lorsqu'on appelle cette méthode,
il sera d'abord avancé jusqu'à la première expression yield
avant de revenir en arrière.
Si le générateur est déjà au début du deuxième yield
,
cela lancera une Exception.
Note:
Il s'agit de la méthode première appelée lors du démarrage d'une boucle
foreach
. Elle ne sera pas exécutée après les bouclesforeach
.
Cette fonction ne contient aucun paramètre.
Aucune valeur n'est retournée.
Exemple #1 Exemple de Generator::rewind()
<?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é