DEV Community

Cover image for PHP Tips | Usando o poder dos Generators 🏭
Raziel Rodrigues
Raziel Rodrigues

Posted on • Edited on

1 1

PHP Tips | Usando o poder dos Generators 🏭

O assunto de hoje é Generator. Neste artigo, vou explicar o que estudei e o link para o repositório com todo o conteúdo.

Generators

Então, vendo que o 'for' não ia ser a melhor solução sempre, os criadores do PHP decidiram implementar os Generators na versão 5.5 da linguagem. Generators são basicamente funções que retornam o resultado de algo iterável sem precisar salvar o resultado da iteração em uma variável. Uma vez que o generator logo após retornar iterar já retorna o resultado, ou seja, não sendo mais necessário fazer o famoso $array[] = $value, economizando então memória e evitando um erro de estouro de pilha de execução.

1 - Uso básico

function yieldCall()
{
    for ($i = 0; $i < 10; $i++) {
        yield $i;
    }
}

$generator = yieldCall();
var_dump($generator);

foreach ($generator as $value) {
    echo $value;
}
Enter fullscreen mode Exit fullscreen mode

Rodando o código, tu consegue perceber que o valor é impresso na tela normalmente, assim como se fosse feito da forma tradicional.

2 - Definindo chave para o iterador

$csv = 'nome;raziel';

function parserYield($input)
{
    foreach (explode(';', $input) as $key => $value) {
        yield uniqid() => $value;
    }
}

foreach (parserYield($csv) as $key => $value) {
    echo ($key);
    echo '<hr>';
    echo $value;
}

echo '<hr>';
Enter fullscreen mode Exit fullscreen mode

3 - Usando com ponteiros

function &genYield()
{
    $value = 3;

    while ($value > 0) {
        yield $value;
    }
}

foreach (genYield() as &$key) {
    echo (--$key);
}

echo '<hr>';
Enter fullscreen mode Exit fullscreen mode

4 - Composição de um array

class Test
{
}

function y()
{
    yield 3;
    yield 4;
}

function x()
{
    yield 1;
    yield from y();
}

$x = x();

foreach ($x as $value) {
    var_dump($value);
}

$x->getReturn();

var_dump(is_array($x->getReturn()));

echo '<hr>';
Enter fullscreen mode Exit fullscreen mode

O Motivo Final

echo '<h1> Exemplo benchmark: </h1> <hr>';

function forEachOnly()
{
    $numeros = [];
    foreach (range(1, 1000000) as $value) {
        $numeros[] = $value;
    }

    echo "Memory peak usage FOREACH: " . memory_get_peak_usage(true) . " bytes \n";
}

function generatorCall()
{
    foreach (range(1, 1000000) as $value) {
        yield $value;
    }
}

function generatorOnly()
{
    foreach (generatorCall() as $value) {
        $value;
    }
    echo "Memory peak usage GENERATOR: " . memory_get_peak_usage(true) . " bytes \n";
}

# forEachOnly(); DESCOMENTA PRA VER ESSE
# generatorOnly(); E DEPOIS DESCOMENTA ESSE
Enter fullscreen mode Exit fullscreen mode

Irei mostrar aqui o benchmark que você mesmo pode testar:

Memory peak usage FOREACH: 44052480 bytes
Memory peak usage GENERATOR: 18878464 bytes
Enter fullscreen mode Exit fullscreen mode

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read more

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up