Sobes.tech
Middle

Jakou roli mají generátory v jazyce PHP a čím se liší od iterátorů?

sobes.tech AI

Odpověď od AI

Generátory v PHP umožňují vytvářet iterátory bez implementace rozhraní Iterator. Používají klíčové slovo yield k vrácení hodnot po jednom, přičemž pozastavují provádění funkce do další iterace.

Rozdíly od iterátorů:

  • Implementace: Iterátory vyžadují implementaci rozhraní Iterator (current, key, next, rewind, valid), což může být u jednoduchých případů zbytečně složité. Generátory jsou implementovány jako funkce s yield.
  • Paměť: Generátory spotřebují méně paměti při práci s velkými datovými sadami, protože generují hodnoty "za běhu" místo načítání celé sady do paměti. Iterátory mohou načítat nebo zpracovávat data kompletně, podle jejich implementace.
  • Syntaxe: Syntaxe generátorů je jednodušší a čitelnější pro tvorbu jednoduchých iterátorů.
  • Stav: Generátory automaticky uchovávají svůj vnitřní stav mezi voláními next. U iterátorů je správa stavu na vývojáři.

Příklad použití generátoru:

<?php
// Jednoduchý generátor čísel
function generateNumbers(int $limit) {
    for ($i = 0; $i <= $limit; $i++) {
        yield $i;
    }
}

// Použití generátoru
foreach (generateNumbers(5) as $number) {
    echo $number . " "; // Výstup: 0 1 2 3 4 5
}

Příklad použití základního iterátoru (pro srovnání, není úplný příklad):

<?php
// Jednoduchá implementace iterátoru (pro srovnání)
class SimpleIterator implements Iterator {
    private array $items = [];
    private int $position = 0;

    public function __construct(array $items) {
        $this->items = $items;
    }

    public function current(): mixed { /*...*/ }
    public function key(): mixed { /*...*/ }
    public function next(): void { /*...*/ }
    public function rewind(): void { /*...*/ }
    public function valid(): bool { /*...*/ }
}

Generátory jsou užitečné pro líné načítání dat (například čtení velkých souborů řádek po řádku) a pro tvorbu konečných nebo nekonečných sekvencí bez nadměrné spotřeby paměti. Iterátory jsou naopak flexibilnější a mohou být použity pro složitější datové struktury a logiku iterace.