Generator::rewind

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Generator::rewindRé-initialise l'itérateur au premier yield

Description

public Generator::rewind(): void

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 boucles foreach.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

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é

add a note

User Contributed Notes 1 note

up
22
i&#39;m pati on stackoverflow
8 years ago
Actually, this method can be useful to test a generator before iterating, as it executes your function up to the first yield statement. I.e. if you try to read a non-existent file in a generator, an error will normally occur only in client code foreach()'s first iteration. Sometimes this can be critical to check beforehand.

Take a look at a modified example from here:
http://php.net/manual/ru/language.generators.overview.php#112985

<?php

function getLines($file) {
$f = fopen($file, 'r');
try {
while (
$line = fgets($f)) {
yield
$line;
}
} finally {
fclose($f);
}
}

$getLines = getLines('no_such_file.txt');
$getLines->rewind(); // with ->rewind(), a file read error will be thrown here and a log file will not be cleared

openAndClearLogFile();

foreach (
$getLines as $n => $line) { // without ->rewind(), the script will die here and your log file will be cleared
writeToLogFile('reading: ' . $line . "\n");
}

closeLogFile();

?>

P.S.: When you iterate over a generator after ->rewind(), you'll get the first yielded value immediately, as the preceding code was already executed.
To Top