Как работают совместные подпрограммы / генераторы PHP

Я нашел этот пример совместной подпрограммы PHP.

https://gnugat.github.io/2014/04/30/php-generators-and-coroutines.html

function holy_grail_countdown($number)
{
    while (0 < $number) {
        $reset = (yield $number);
        $number = $reset ?: $number - 1;
    }
}

$c = holy_grail_countdown(5);
foreach ($c as $number) {
    echo "$number\n"; // outputs 5, then 2 and finally 1.
    if (5 === $number) {
        $c->send(3);
    }
}

Я до сих пор не понимаю, почему это работает. Почему не выводит 5, 3, 2, 1?

Он отправляет значение 3 в выражения ((yield $number)), но похоже, что выполняет 2 итерации.

# 1st iteration
$reset = (yield $number); # reset=3
$number = $reset ?: $number - 1; = #number=3
# 2nd iteration
$reset = (yield $number); # reset=null
$number = $reset ?: $number - 1; = #number=3-1=>2

Почему есть вторая итерация с reset=null?

Спасибо.

Поскольку каждая итерация цикла foreach всегда отправляет генератору значение null, чтобы убедиться, что он не блокирует, в случае, если ваш код не отправляет никакого значения в генератор, когда он ожидает значение

Mark Baker 15.03.2018 23:42

О, спасибо. По сути, он выполняет 1 или 2 взаимодействия в зависимости от того, отправляю я данные или нет. Это умно. Есть ли какой-либо вариант использования для обработки итерации null?

Felix 15.03.2018 23:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
188
0

Другие вопросы по теме