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 syield. - 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.