В генераторе в PHP достигается наличие одного объекта (Generator) в текущем файле посредством возврата объекта Generator функцией генератора.
Функция, объявленная с использованием ключевого слова yield, автоматически становится генератором. При первом вызове такой функции PHP не выполняет её код сразу. Вместо этого он возвращает объект типа Generator, который encapsсулирует состояние выполнения функции.
Этот объект Generator действует как итератор. Каждый раз, когда объект Generator итерируется (например, в цикле foreach или с использованием методов next(), send(), current() и т.д.), PHP возобновляет выполнение кода генератора с того места, где он остановился после последнего оператора yield.
Оператор yield приостанавливает выполнение функции и возвращает значение. При следующем запросе значения, выполнение возобновляется с оператора, следующего за yield.
Таким образом, несмотря на то, что функция генератора может содержать множество операторов yield, она создает и возвращает лишь один экземпляр объекта Generator при первом вызове. Этот единственный объект управляет состоянием выполнения генератора и предоставляет доступ к генерируемым значениям.
php
Ключевая идея в том, что функция генератора при своем вызове не выполняет код, а создает и возвращает именно объекттератор, который затем используется для пошагового выполнения логики генератора.