Каковы действительные варианты использования goto в PHP? - PullRequest
14 голосов
/ 30 января 2011

Я знаю, есть другие вопросы об утверждении goto, введенном в PHP 5.3.

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

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

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

Ответы [ 5 ]

6 голосов
/ 30 января 2011

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

5 голосов
/ 30 января 2011

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

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

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

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

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

4 голосов
/ 26 мая 2014

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

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

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;
}

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

2 голосов
/ 30 января 2011

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

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

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

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

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

2 голосов
/ 30 января 2011
Оператор

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...