Cuando una función generadora es invocada por primera vez, un objeto de la clase interna Generator es devuelto. Este objeto implementa la interfaz Iterator en prácticamente el mismo modo que lo haría un iterador unidireccional.
La mayoría de métodos en la clase Generator tienen la misma semántica que los métodos en la interfaz iterator, pero los objetos Generator tienen un método adicional: send().
Los objetos Generator no pueden ser instanciados vía new.
Ejemplo #1 La clase Generator
<?php
class Generator implements Iterator {
public function rewind(); // Rebobina el iterador. Si
// la iteración ya ha empezado,
// lanzará una excepción.
public function valid(); // Devuelve false si el
// iterador ha sido cerrado.
// En cualquier otro caso devuelve true.
public function current(); // Devuelve el valor facilitado con yield.
public function key(); // Devuelve la clave facilitada con yield.
public function next(); // Retoma la ejecución del
// generador.
public function send($value); // Envía el valor dado al
// generador como resultado de
// la sentencia yield y
// resume la ejecución del
// generador.
}
?>
Generator::send() permite que se inyecten valores en las funciones generadoras mientras se itera sobre ellas. El valor inyectado será devuelto desde la sentencia yield y podrá ser usado como cualquier otra variable desde la función generadora.
Ejemplo #2 Utilizar Generator::send() para inyectar valores
<?php
function printer() {
while (true) {
$string = yield;
echo $string;
}
}
$printer = printer();
$printer->send('Hola mundo!');
?>
El resultado del ejemplo sería:
Hola mundo!