Генератор в PHP

Генераторы это простые итераторы, которые поддерживает перемещение только вперед на 1 шаг. Они вычисляют и выдают значения по требованию. Генераторы сохраняют свое внутреннее состояние на момент выдачи значения и восстанавливают его при запросе следующего значения.

Простой пример определения и использования генератора:

function myFirstGenerator(): \Generator
{
    yield 'one';
    yield 'two';
    yield 'three';
}

foreach (myFirstGenerator() as $value) {
    echo $value . PHP_EOL;
}

Результат выполнения кода:

one
two
three

Генераторы полезны для перебора больших наборов данных при экономии оперативной памяти.

Представим, что у нас есть задача прочитать построчно файл размером 4 Гб, а скрипту PHP доступно только 100 Мб оперативной памяти. При использовании генераторов нет необходимости размещать весь файл в памяти - память используется для размещения только 1 строки.

function readFile($filename = '')
{
    $res = fopen($filename, 'r');
    while(feof($res) === false) {
        yield fgets($res);
    }
    fclose($res);
}

foreach (readFile('test.txt') as $row) {
    // Do something with $row
}

03.11.2014 10:09