function grange($start, $limit, $step = 1) {
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
}
$sum = 0;
for ($i = $start; $i <= $limit; $i += $step) {
$sum += $num;
}
$sum = 0;
while (($num = fgets($handle)) !== false) {
$sum += $num;
}
while (($fiterator->next()) {
$sum += $fiterator->current();
}
do {
echo $g->current(), "\n";
$g->next();
$i++;
} while($i <= 4);
Который про память. При том, что
Когда у нас есть возможность (или настоятельная необходимость) не считывать все данные (сеть, диск) полностью в ОЗУ, а забирать их чанками (порциями), чтобы обработать, отправить результат в вызывающую функцию и тут же забыть его, можно вполне обойтись без генераторов.
Любой код, который экономит память генератором, можно написать без него. Больше того - именно этот код и будет лежать в основе нашего генератора.
То есть, при всех достоинствах и разнообразных способах применения генераторов, экономия памяти - не имманентное их свойство. Генератор всего лишь использует тот код, который на самом деле экономит память, обрачивая его в красивый фантик.
Чтобы сэкономить память при чтении из файла, мы используем цикл while.
Генератор просто может этот while переобуть в воздухе на foreach.
Но память при этом будет экономить не он, а старый добрый while.