Оператор yield — основа генераторной функции. Отдалённо этот оператор похож на оператор return , так как тоже реализует возврат, только вместо того, чтобы останавливать выполнение текущей функции, yield предоставляет значение коду, зацикливающемуся на генераторе, и приостанавливает выполнение функции генератора.
Для понимания, что делает yield, необходимо понимать, что такое генераторы. Генераторам же предшествуют итераторы. Когда вы создаёте список, вы можете считывать его элементы один за другим — это называется итерацией.
Генераторы это тоже итерируемые объекты, но прочитать их можно лишь один раз. Это связано с тем, что они не хранят значения в памяти, а генерируют их на лету.
Чтобы освоить yield, вы должны понимать, что когда вы вызываете функцию, код внутри тела функции не исполняется. Функция только возвращает объект-генератор.
Пример простейшего генератора:
function genFingersOnTheHand() {
for ($i = 1; $i <= 5; $i++) {
// Здесь оператор yield возвращает значение и ожидает следующего цикла.
yield $i;
}
}
$generator = genFingersOnTheHand();
foreach($generator as $value) {
echo "$value ";
}
Приведённый пример выведет строку "1 2 3 4 5 " по результатам всех пяти циклов генератора.