O que é yield?
A yieldpalavra-chave retorna dados de uma função geradora:
O coração de uma função geradora é a palavra-chave yield. Em sua forma mais simples, uma declaração de rendimento se parece muito com uma declaração de retorno, exceto que, em vez de interromper a execução da função e retornar, o rendimento fornece um valor ao código que circula sobre o gerador e pausa a execução da função do gerador.
O que é uma função de gerador?
Uma função de gerador é efetivamente uma maneira mais compacta e eficiente de escrever um iterador . Ele permite que você defina uma função (sua xrange) que calculará e retornará valores enquanto você estiver fazendo um loop sobre ela :
foreach (xrange(1, 10) as $key => $value) {
echo "$key => $value", PHP_EOL;
}
Isso criaria a seguinte saída:
0 => 1
1 => 2
…
9 => 10
Você também pode controlar o $keyno foreachusando
yield $someKey => $someValue;
Na função do gerador, $someKeyé o que você deseja que apareça $keye $someValueseja o valor em $val. No exemplo da pergunta é isso $i.
Qual é a diferença para funções normais?
Agora você pode se perguntar por que não estamos simplesmente usando a rangefunção nativa do PHP para obter essa saída. E você está certo. A saída seria a mesma. A diferença é como chegamos lá.
Quando usamos rangePHP, irá executá-lo, criar toda a matriz de números na memória e returnque toda variedade ao foreachcircuito que irá, em seguida, passar por isso e fornecer os valores. Em outras palavras, o foreachirá operar no próprio array. A rangefunção e a foreachúnica "conversa" uma vez. Pense nisso como receber um pacote pelo correio. O entregador entregará o pacote e sairá. E então você desembrulha o pacote inteiro, retirando o que estiver lá.
Quando usamos a função de gerador, o PHP entra na função e a executa até encontrar o final ou uma yieldpalavra - chave. Quando encontrar a yield, retornará o valor naquele momento para o loop externo. Em seguida, ele volta para a função de gerador e continua a partir de onde produziu. Como você xrangemantém um forloop, ele será executado e renderá até que $maxseja atingido. Pense nisso como foreacho gerador jogando pingue-pongue.
Por que eu preciso disso?
Obviamente, os geradores podem ser usados para solucionar os limites de memória. Dependendo do seu ambiente, executar um range(1, 1000000)script fatal será um passo, enquanto o mesmo com um gerador funcionará bem. Ou como a Wikipedia coloca:
Como os geradores calculam seus valores gerados somente sob demanda, eles são úteis para representar sequências que seriam caras ou impossíveis de calcular de uma só vez. Isso inclui, por exemplo, sequências infinitas e fluxos de dados ao vivo.
Os geradores também devem ser bem rápidos. Mas lembre-se de que, quando estamos falando rápido, geralmente estamos falando em números muito pequenos. Portanto, antes que você corra e mude todo o seu código para usar geradores, faça uma referência para ver onde faz sentido.
Outro caso de uso para geradores são as rotinas assíncronas. A yieldpalavra-chave não apenas retorna valores, mas também os aceita. Para detalhes sobre isso, veja as duas excelentes postagens no blog abaixo.
Desde quando posso usar yield?
Geradores foram introduzidos no PHP 5.5 . Tentar usar yieldantes dessa versão resultará em vários erros de análise, dependendo do código que segue a palavra-chave. Portanto, se você receber um erro de análise desse código, atualize seu PHP.
Fontes e leituras adicionais:
yeildmais de, digamos, uma solução como esta: ideone.com/xgqevM