O comando yield do PHP 5.5
30 Jul 2014No PHP 5.5, com a introdução dos geradores, um novo comando foi adicionado a linguagem. Este comando é o yield.
A palavra-chave yield, já é conhecida em outras linguagens, como Python, por exemplo. Na verdade, o comando yield é bastante parecido com o comando return, com a diferença que usando yield, a função continua em execução, ou seja, o valor será retornado e a função continuará executando o restante do código.
Isto é muito útil em situações onde precisamos utilizar uma função em um loop foreach. Ao invés de armazenar todos os dados em um array e então retorná-lo para ser utilizado no foreach, podemos retornar os valores conforme a execução da função. Isto traz um ganho de desempenho, visto que, criar um array para armazenar os valores consome uma certa quantidade de memória. Isto aumenta mais ainda se a quantidade de dados retornados for grande.
Vamos então a dois exemplos bem simples, um utilizando a palavra chave yield para retornar os dados e outro utilizando o método tradicional.
Exemplo com yield:
<?php
function getPaises(){
$paises = array('Brasil', 'China', 'Costa Rica', 'Dinamarca', 'Egito');
for ($i = 0; $i < sizeof($paises); $i++){
yield $paises[$i];
}
}
foreach (getPaises() as $pais) {
echo "<p>{$pais}</p>";
}
?>
Exemplo sem yield:
<?php
function getPaises(){
$paises = array('Brasil', 'China', 'Costa Rica', 'Dinamarca', 'Egito');
$dados = array();
for ($i = 0; $i < sizeof($paises); $i++){
$dados[] = $paises[$i];
}
return $dados;
}
foreach (getPaises() as $pais) {
echo "<p>{$pais}</p>";
}
?>
No primeiro exemplo, os dados são retornados instantaneamente. Já no segundo exemplo, sem utilizar a palavra-chave yield, os dados são processados, armazenados em um array temporário e só depois retornados para serem utilizados no foreach.
É claro que neste cenário não haverá muito ganho de desempenho, pois estamos trabalhando com poucos elementos, porém com uma grande quantidade de dados, o uso do comando yield irá trazer uma boa economia de memória.
O arquivo com os exemplos deste post pode ser baixado AQUI.
Até a próxima 😉