Какой будет возвращаемый тип у метода с конструкцией yield в PHP?

«Какой будет возвращаемый тип у метода с конструкцией yield в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод, использующий 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().