Ответ
Метод, использующий yield, возвращает объект встроенного класса Generator.
Generator — это внутренний класс, реализующий интерфейсы Iterator и Traversable. Это означает, что возвращаемый объект можно использовать в цикле foreach.
Пример с явным указанием типа (PHP 7.0+):
function generateSequence(int $start, int $end): Generator {
for ($i = $start; $i <= $end; $i++) {
yield $i;
}
}
$gen = generateSequence(1, 5);
var_dump($gen instanceof Generator); // bool(true)
echo get_class($gen); // Generator
foreach ($gen as $value) {
echo $value . ' '; // 1 2 3 4 5
}
Ключевые особенности:
- Ленивые вычисления: Значения генерируются по требованию, а не все сразу, что экономит память.
- Итератор: Объект
Generatorуправляет своим состоянием (текущее значение, ключ, возможность продолжения). - Двусторонняя коммуникация: Через
Generator::send($value)можно передавать значения в генератор, аyieldможет возвращать их.
Важно: Нельзя использовать return для возврата значения из такой функции в PHP < 7.0. В PHP 7.0+ return может использоваться для завершения генератора и установки его конечного возвращаемого значения, доступного через $gen->getReturn().