<?php
function generator(): Generator
{
echo "Eu sou um gerador!\n";
for ($i = 1; $i <= 3; $i++) {
yield $i;
}
}
// Inicializa o gerador
$generator = generator();
// Retrocede o gerador para o início da primeira expressão yield,
// se já não estava lá
$generator->rewind(); // Eu sou um gerador!
// Nada acontece aqui. O gerador já está retrocedido.
$generator->rewind(); // Sem saída (NULL)
// Isto retrocede o gerador para a primeira expressão yield,
// se já não estava lá, e itera sobre o gerador.
foreach ($generator as $value) {
// Após gerar o primeiro valor, o gerador permanece na
// primeira expressão yield até que continue a execução e avance ao próximo yield
echo $value, PHP_EOL; // 1
break;
}
// Continua e retrocede novamente. Nenhum erro ocorre porque o gerador não avançou além do primeiro yield
$generator->rewind();
echo $generator->current(), PHP_EOL; // 1
// Nenhum erro ocorre, o gerador ainda está no primeiro yield
$generator->rewind();
// Isto avança o gerador para a segunda expressão yield
$generator->next();
try {
// Aqui uma Exception é lançada
// porque o gerador já avançou para o segundo yield
$generator->rewind(); // Fatal error: Uncaught Exception: Cannot rewind a generator that was already run
} catch (Exception $e) {
echo $e->getMessage();
}
?>
O exemplo acima produzirá:
Eu sou um gerador!
1
1
Cannot rewind a generator that was already run