O que é yield
?
A yield
palavra-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 $key
no foreach
usando
yield $someKey => $someValue;
Na função do gerador, $someKey
é o que você deseja que apareça $key
e $someValue
seja 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 range
funçã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 range
PHP, irá executá-lo, criar toda a matriz de números na memória e return
que toda variedade ao foreach
circuito que irá, em seguida, passar por isso e fornecer os valores. Em outras palavras, o foreach
irá operar no próprio array. A range
funçã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 yield
palavra - 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ê xrange
mantém um for
loop, ele será executado e renderá até que $max
seja atingido. Pense nisso como foreach
o 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 yield
palavra-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 yield
antes 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:
yeild
mais de, digamos, uma solução como esta: ideone.com/xgqevM