Generator::rewind

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

Generator::rewindReinicia el iterador al primer yield

Descripción

public Generator::rewind(): void

El método devuelve el generador al punto anterior al primer yield. Si el generador no está en el primer yield cuando se llama a este método, se avanzará primero hasta la primera expresión yield antes de retroceder. Si el generador ya está al inicio del segundo yield, se lanzará una Exception.

Nota:

Se trata del método primero llamado al inicio de un ciclo foreach. No se ejecutará después de los ciclos foreach.

Parámetros

Esta función no tiene parámetros.

Valores devueltos

No devuelve ningún valor.

Ejemplos

Ejemplo #1 Ejemplo de Generator::rewind()

<?php

function generator(): Generator
{
echo
"¡Soy un generador!\n";

for (
$i = 1; $i <= 3; $i++) {
yield
$i;
}
}

// Inicializar el generador
$generator = generator();

// Devolver el generador al inicio de la primera expresión yield,
// si no lo está ya
$generator->rewind(); // ¡Soy un generador!

// No ocurre nada aquí; el generador ya está reiniciado
$generator->rewind(); // Sin salida (NULL)

// Esto devuelve el generador al inicio de la primera expresión yield,
// si no lo está ya, e itera sobre el generador
foreach ($generator as $value) {
// Después de devolver el primer valor, el generador permanece en
// la primera expresión yield hasta que se reanude la ejecución y avance a la siguiente yield
echo $value, PHP_EOL; // 1

break;
}

// Reanudar y reiniciar nuevamente. No se produce ningún error ya que el generador no ha avanzado más allá del primer yield
$generator->rewind();

echo
$generator->current(), PHP_EOL; // 1

// No se produce ningún error, el generador sigue en la primera yield
$generator->rewind();

// Esto hace avanzar el generador a la segunda expresión yield
$generator->next();

try {
// Esto lanzará una excepción,
// ya que el generador ya ha avanzado a la segunda yield
$generator->rewind(); // Error fatal: Exception no capturada: No se puede devolver un generador que ya ha sido ejecutado
} catch (Exception $e) {
echo
$e->getMessage();
}

?>

El resultado del ejemplo sería:

¡Soy un generador!
1
1
No se puede devolver un generador que ya ha sido ejecutado

add a note

User Contributed Notes 1 note

up
22
i&#39;m pati on stackoverflow
9 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