Я знаю, есть другие вопросы о инструкции goto
представленной в PHP 5.3.
Но я не мог найти достойного ответа там, все были типа «последнее средство», «xkcd», «зло», «плохое», «ЗЛО !!!». Но никакого действительного примера. Только утверждения о том, что они не используются. Или утверждения о наличии редких случаев использования (опять же без примеров).
Итак, возникает вопрос: «Каковы допустимые варианты использования goto
в PHP?». Ответы: «Есть ли зло?» не приветствуются и будут отменены. Благодаря 🙂
Или кто-то имеет ссылку на RFC, где объясняется это решение – я не мог найти его.
Одно возможное использование (которое может быть реализовано с использованием других средств) – это реализация конечного автомата .
См. PHP Architect – GOTO в PHP 5.3: действительно ли это зло?
В этой статье дается краткий обзор того, почему GOTO может быть полезным, почему мы имеем его в PHP (с 2004 года) и почему он был / противоречив. Как правило, общий ответ: GOTO в основном бесполезен и его следует избегать, если только в очень узких пространствах приложений (например, создание компилятора):
Одно можно сказать наверняка: есть некоторые приложения, в которых хороший разработчик может эффективно использовать GOTO для создания более простого и эффективного кода, но, вероятно, это не обычные программы, которые ваш средний разработчик будет писать; поэтому здесь есть законное беспокойство, что неопытные программисты будут использовать GOTO для общего ущерба их коду.
Также см. Некоторые из изначальных обсуждений / противоречий в списке новостей, упомянутых в статье:
Также см. Этот подробный языковой агностический разговор о GOTO, который считается вредным для C2 Wiki
Один случай, когда я использую его, – это когда у меня многоуровневая проверка, и я не хочу добавлять дополнительный код, когда я могу просто перейти к соответствующему разделу после моих проверок.
Например, существует такая система, которая проверяет состояние различных машин на складе и не выполняет весь склад в целом и отправляет предупреждение, если какая-либо часть какой-либо одной системы мертва, в псевдокоде это выглядит следующим образом:
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; }
Таким образом, если что-то не удастся, я могу пропустить все другие проверки и перейти к предупреждению. Тот, кто по вызову, получает предупреждение и вытаскивает полный результат любой функции, называемой предупреждением, чтобы они могли ее исправить.
Оператор goto
может использоваться для прерывания многоуровневых циклов.
Этот конкретный пример приложения goto
приведен на странице руководства goto :
Вы также не можете переходить в какую-либо петлю или структуру коммутатора. Вы можете выпрыгнуть из них, и обычным явлением является использование goto вместо многоуровневого перерыва.
Goto был в значительной степени заменен специальными заявлениями, такими как continue
, break
, try...catch
. В те годы, когда я работаю с PHP, я не чувствовал, что это может помочь мне однажды. В таких языках, как C ++, которые не имеют инструкции break x
ее можно использовать для выпрыгивания из вложенных циклов, но поскольку PHP имеет ее, нет никакой причины.
Code Complete имеет очень приятную и подробную главу о gotos. Цитируя последние два параграфа:
Использование gotos – это вопрос религии. Моя догма заключается в том, что в современных языках вы можете легко заменить девять из десяти gotos эквивалентными последовательными конструкциями. В этих простых случаях вы должны заменить gotos по привычке. В тяжелых случаях вы все равно можете изгнать goto в девяти из десяти случаев: вы можете разбить код на более мелкие подпрограммы, использовать try-finally, использовать вложенные ifs, тестировать и повторно тестировать переменную состояния или реструктурировать условное выражение. Исключение goto в этих случаях сложнее, но это хорошие умственные упражнения, и методы, обсуждаемые в этом разделе, дают вам инструменты для этого.
В оставшемся случае из 100, в которых goto является законным решением проблемы, четко документируйте ее и используйте. Если у вас есть ботинки дождя, вам не стоит ходить вокруг блока, чтобы избежать грязевой лужи. Но держите свой разум открытым, чтобы использовать менее простые подходы, предложенные другими программистами. Они могут видеть то, что у вас нет.
Мне очень сложно понять, почему команда PHP потрудилась добавить ее вообще (ведь в те годы мы жили без мира).