https://www.php.net/manual/ru/language.generators....
foreach (xrange(1, 9, 2) as $number) {
echo "$number ";
}
Если рассказать простым языком магии, то при таком вызове внутри foreach, функция xrange определяет, что ее результат не собираются записывать в отдельную переменную, а собираются перебирать по элементам.
Поэтому, когда выполнение интерпретатора php доходит до команды as, функция xrange выполняется до первого попавшегося yield внутри этой функции и возвращает это значение. При этом, контекст функции запоминается, а также внутренний цикл:
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
засыпает до того момента, пока во внешнем foreach выполнение не пройдет команду as еще раз, тогда произойдет размораживание yield и извлечение следующего значения, чтобы использовать его только как один элемент $number.
За счет того, что as меняет режим работы вызова функции xrange, получается не извлекать все подряд.