Может ли быть помимо yield return в генераторе

Ответ

Да, в генераторе можно использовать yield break для принудительного завершения генератора. Также можно использовать return с PHP 7.0+, но он должен быть без значения (просто завершает генератор). С PHP 7.4+ можно возвращать значение через return, но это будет доступно только через getReturn().

Пример:

function generator() {
    yield 1;
    yield 2;
    if (someCondition()) {
        yield break; // завершает генератор
    }
    yield 3;
    return "Done"; // PHP 7.4+
}

$gen = generator();
foreach ($gen as $value) {
    echo $value;
}
echo $gen->getReturn(); // "Done"

Ответ 18+ 🔞

А, ну это про генераторы в PHP! Ёпта, тема-то простая, но народ часто путается, как их правильно завершать. Смотри, тут всё как с машиной старой — можно заглушить ключом, а можно просто проводки оборвать, но результат один: движок перестаёт работать.

Вот смотри, в генераторе есть два способа сказать "всё, хватит, я устал":

  1. yield break — это как вежливо сказать "спасибо, я закончил"
  2. Просто return (с PHP 7.0) — тоже работает, но это как хлопнуть дверью

А с PHP 7.4 вообще прикол — можно через return значение вернуть! Но не напрямую, а через метод getReturn() потом достать. Это как оставить записку на столе, когда уходишь.

Вот смотри пример, я его чуть прокомментирую:

function generator() {
    yield 1; // выдаём первое значение
    yield 2; // выдаём второе
    if (someCondition()) {
        yield break; // тут говорим "всё, приехали, дальше не будет"
    }
    yield 3; // это уже не выполнится, если условие выше сработало
    return "Done"; // а это возвращаемое значение (PHP 7.4+)
}

$gen = generator();
foreach ($gen as $value) {
    echo $value; // выведет 1, 2, и всё
}
echo $gen->getReturn(); // а вот тут получим "Done", если генератор дошёл до return

Вообще, yield break — это явный способ сказать "стоп машина". Особенно полезно, когда у тебя там сложная логика, вложенные циклы, и нужно резко всё оборвать. Без него пришлось бы городить костыли с флагами и проверками.

А return без значения — это почти то же самое, но как бы менее явно. Хотя с PHP 7.4, когда можно значение возвращать, return становится более осмысленным — ты не просто завершаешь генератор, ты ещё и результат какой-то передаёшь.

Короче, выбирай что нравится. Главное — не пытайся return с значением использовать в версиях PHP ниже 7.4, а то будет тебе хиросима, чувак. Проверяй версию PHP, а то потом удивление пиздец будет, когда всё посыпется.