Sobes.tech
Middle

Aká je úloha generátorov v jazyku PHP a ako sa líšia od iterátorov?

sobes.tech AI

Odpoveď od AI

Generátory v PHP umožňujú vytváranie iterátorov bez implementácie rozhrania Iterator. Používajú kľúčové slovo yield na vrátenie hodnôt po jednom, pozastavujúc vykonávanie funkcie do ďalšej iterácie.

Rozdiely oproti iterátorom:

  • Implementácia: Iterátory vyžadujú implementáciu rozhraní Iterator (current, key, next, rewind, valid), čo môže byť pre jednoduché prípady zdĺhavé. Generátory sú implementované ako funkcie s yield.
  • Pamäť: Generátory spotrebúvajú menej pamäte pri práci s veľkými súbormi dát, pretože generujú hodnoty "za behu" namiesto načítania celého súboru do pamäte. Iterátory môžu načítať alebo spracovávať dáta úplne, v závislosti od ich implementácie.
  • Syntax: Syntax generátorov je jednoduchšia a čitateľnejšia pre tvorbu jednoduchých iterátorov.
  • Stav: Generátory automaticky zachovávajú svoj vnútorný stav medzi volaniami next. Pri iterátoroch je správa stavu na vývojárovi.

Príklad použitia generátora:

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

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

Príklad použitia základného iterátora (pre porovnanie, nie je úplný príklad):

<?php
// Jednoduchá implementácia iterátora (pre porovnanie)
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 sú užitočné pre lenivé načítanie dát (napríklad čítanie veľkých súborov riadok po riadku) a na tvorbu konečných alebo nekonečných sekvencií bez nadmerného využívania pamäte. Iterátory sú naopak flexibilnejšie a môžu byť použité pre zložitejšie dátové štruktúry a logiku iterácie.