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