PHP yield

Publikováno PHP

V PHP od verze 5.5 je k dispozici operátor yield. Ten funguje podobně jako return s jedním rozdílem.

Když ve funkci zavoláte return, tak se funkce ukončí a když tu samou funkci zavoláte znova, začne opět od začátku.

Když ve funkci zavoláte yield, tak se funkce ukončí, ale když ji zavoláte znova, začne přesně tam, kde skončila (tedy například bude pokračovat v cyklu).

Yield znamená v překladu něco jako „vynést“, v PHP si to můžete představit tak, že se „vynesou data“, aby se nemusela držet v paměti. Budu mít například následující dva programy, které vypíší čísla od 0 do 1000000.

Klasický příklad

$data = range(0, 1000000);
 
echo round((memory_get_usage()/1048576),2)." MB zabráno v paměti\n";
 
foreach ($data as $cislo) {
    echo $cislo . " ";
}

Příklad s yield

function range_yield($zacatek, $konec) {
    for ($i = $zacatek; $i <= $konec; $i++) {
        yield $i;
    }
}
 
$data = range_yield(0, 1000000);

echo round((memory_get_usage()/1048576),2)." MB zabráno v paměti\n";
 
foreach ($data as $cislo) {
    echo $cislo . " ";
}

Porovnání zabrané paměti

yield

Jak můžete z grafu vyčíst, tak se zabraná paměť u příkladu s yield s různými parametry nijak neměnila, kdežto paměťová náročnost u klasické příkladu podstatně rostla.

Yield se tedy hodí všude tam (a nejen tam), kde získáváme větší počet dat. Může to extrémě ulevit serveru při vyšší návštěvnosti.

Komentáře