<?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