Каковы допустимые примеры использования goto в PHP?

Я знаю, есть другие questions о инструкции goto, представленной в PHP 5.3.

Но я не мог найти достойного ответа там, все были типа "последнее средство", "xkcd", "зло", "плохое", "ЗЛО!!!". Но никакого действительного примера. Только утверждения о том, что они не используются. Или утверждения о том, что есть некоторые редкие случаи использования (опять же без примеров).

Итак, возникает вопрос: "Каковы допустимые варианты использования goto в PHP?". Ответы для "Является ли goto злом?" не приветствуются и будут отменены. Спасибо:)

Или кто-то имеет ссылку на RFC, где объясняется это решение - я не мог найти его.

Ответы

Ответ 1

Одно возможное использование (которое может быть реализовано с использованием других средств) - это реализация конечного автомата .

Ответ 2

См. PHP Architect - GOTO в PHP 5.3: действительно ли это зло?

В этой статье приводится краткий обзор того, почему GOTO может быть полезным, почему мы имеем его в PHP (с 2004 года) и почему он был/противоречив. Общий ответ выглядит следующим образом: GOTO в основном бесполезен и его следует избегать, если только в очень узких пространствах приложений (например, создание компилятора):

Одно можно сказать наверняка: есть некоторые приложения, в которых хороший разработчик может эффективно использовать GOTO для создания более простого и эффективного кода, но они, вероятно, не являются основными программами, которые ваш средний разработчик будет писать; поэтому здесь есть законное беспокойство, что неопытные программисты будут использовать GOTO для общего вреда их кода.

Также см. некоторые из изначальных обсуждений/противоречий в списке новостей, упомянутых в статье:

Также см. этот подробный разговор об агностическом обсуждении GOTO считается вредным для C2 Wiki

Ответ 3

В одном случае, когда я использую это, когда я выполняю многоуровневую проверку и не хочу добавлять дополнительный код, когда я могу просто перейти к соответствующему разделу после моих проверок.

Например, существует эта система, которая проверяет состояние различных машин на складе и не выполняет весь склад в целом и отправляет предупреждение, если какая-либо часть какой-либо одной системы мертва, в псевдокоде она похожа это:

if(hsensor[status] != OK) {
    alert = Humidity sensor hsensor[fail_id] failed with error hsensor[fail_error]
    goto sendAlert;
}

if(cosensor[status] != OK) {
    alert = Co2 sensor cosensor[fail_id] failed with error cosensor[fail_error]
    goto sendAlert;
}

Таким образом, если что-то не удастся, я могу пропустить все другие проверки и перейти к оповещению. Тот, кто по вызову, получает предупреждение и вытаскивает полный результат любой функции, называемой предупреждением, чтобы они могли ее исправить.

Ответ 4

Оператор

goto может использоваться для прерывания многоуровневых циклов.

Этот пример приложения goto приведен ниже на странице руководства goto:

Вы также не можете переходить в какую-либо структуру цикла или коммутатора. Вы можете выскочить из них, и распространенное использование - использовать goto вместо многоуровневого разрыва.

Ответ 5

Goto был заменен большими словами специализированными операторами типа continue, break, try...catch. В те годы, когда я работаю с PHP, я не чувствовал, что это может помочь мне однажды. В таких языках, как С++, которые не имеют оператора break x, его можно использовать для выпрыгивания из вложенных циклов, но поскольку PHP имеет его, нет причин.

Code Complete содержит очень приятную и подробную главу о gotos. Цитирование двух последних абзацев:

Использование gotos - это вопрос религии. Моя догма заключается в том, что в современных языках вы можете легко заменить девять из десяти gotos эквивалентными последовательными конструкциями. В этих простых случаях вы должны заменить gotos по привычке. В тяжелых случаях вы все равно можете изгнать goto в девяти из десяти случаев: вы можете разбить код на более мелкие подпрограммы, использовать try-finally, использовать вложенные ifs, тестировать и повторно тестировать переменную состояния или реструктурировать условное выражение. Устранение goto в этих случаях сложнее, но это хорошие умственные упражнения, и методы, обсуждаемые в этом разделе, дают вам инструменты для этого.

В оставшемся случае из 100, в котором goto является законным решением проблемы, четко документируйте его и используйте. Если у вас есть ботинки дождя, не стоит ходить вокруг блока, чтобы избежать грязевой лужи. Но держите свой разум открытым, чтобы использовать менее простые подходы, предложенные другими программистами. Они могут видеть то, чего вы не делаете.

Мне очень сложно понять, почему команда PHP потрудилась добавить ее вообще (ведь все эти годы мы жили без мира).