¡La diferencia entre returny yieldparecía clara hasta que descubrí que también existía yield fromy la posibilidad de combinar ambos returny yielden la misma función!
Mi comprensión de returnfue que todo después no fue ejecutado, ¿verdad?
Sin embargo:
function generate(): iterable {
return [1, 2, 3];
}
foreach (generate() as $value) {
echo $value;
}
Produce: "123"
Pero lo siguiente:
function generate(): iterable {
return [1, 2, 3];
yield;
}
foreach (generate() as $value) {
echo $value;
}
¡No produce nada! Entonces, ¿eso significa que el rendimiento se ejecuta?
¿Es esto un error?

var_dump(generate()->GetReturn());Respuestas:
ReturnSimplemente devuelve un valor único a la persona que llama.
YieldTransforme la función / método actual para devolver a
Generator, lo que producirá más que un valor único: cada vez queyieldse activa, le da el valor a la persona que llama, uno a la vez, tradicionalmente usando unforeachbucle.Yield+ReturnLos generadores, además de generar valores, también pueden proporcionar un valor devuelto único. Ese valor no será parte del bucle alrededor del generador, debe accederse a él utilizando el
Generator::getReturn()métodoReturn+YieldEsto podría verse como un error, sin embargo, no lo es.
Son dos fases:
generate()se ve que la función contiene layieldpalabra clave, por lo tanto se marca como produciendo aGenerator.returnsucede antes que elyield, el generador no tiene la posibilidad de producir ningún valor. Sin embargo, la[1, 2, 3]matriz se puede recuperar conGenerator::getReturn().Un ejemplo completo anotado:
fuente
De la documentación :
Por lo tanto, no importa si
yieldse ejecuta, el analizador lo ve en algún lugar de la definición de la función y lo convierte en un generador.Si la función nunca ejecuta la
yielddeclaración, entonces el generador no produce ningún valor. El valor devuelto porreturnse ignora cuando intenta utilizar el resultado. La documentación dice:Entonces podrías hacer:
fuente