PHP и инструкция goto для добавления в PHP 5.3

Операция "goto" выводится прямо из ASM или любого другого языка ассемблера.

Здесь ссылка: http://be2.php.net/manual/en/control-structures.goto.php

Мне интересно: что это может сделать, чтобы сделать мой код более организованным? Как я могу реализовать это в крупных проектах, не прикручивая его. Поскольку goto позволит вам прыгать назад и вперед, случайные назначения и бесконечные циклы ждут, если вы используете это неправильно.

Может ли кто-нибудь дать мне пример хорошего использования этого?

EDIT: хорошо, я видел некоторые ответы и, по-видимому, существует широкий консенсус относительно использования заявления "goto", и это плохо.

Поэтому мне все еще интересно: почему PHP захочет добавить его на язык. Если бы они ничего не увидели, они бы этого не сделали... так почему?

Также: qaru.site/info/6802/...

EDIT2: Увидев, что этот вопрос вызвал много плохих вещей, которые были грустны относительно утверждения goto, я пошел и спросил моего отца. Он 52 года и является промышленным инженером.
Он сказал мне пару раз, что он делал хорошее программирование в свои дни и в основном в FORTRAN и COBOL. В настоящее время он занимается ИТ-услугами, сервером и сетевым агентством и т.д.

В любом случае, он сказал кое-что о "еще в свое время..."
Обсудив это немного, он вернулся к утверждению goto, сказав, что даже в свое время как студент, они все знали, что это не умная идея, чтобы использовать его, но тогда они не были намного лучше. Попробовать/поймать было еще много лет, и обработка ошибок практически не была реализована.
Итак, что вы сделали, чтобы проверить свою программу? Добавьте несколько строк в конец, которые позволяют печатать выходные данные и все, что вам нужно для проверки кода, а затем вы размещаете строку: "goto printing" или что-то в этом роде, чтобы начать печать ваших данных.

И таким образом вы постепенно отлаживаете свой код.

Он согласен с тем, что использование goto в современном мире программирования довольно бесполезно. Единственное, что он считает оправданным, - это "аварийный перерыв", который будет использоваться в экстремальных отладочных и непредвиденных ситуациях. Например, goto fatal_error;, а часть "fatal_error" вашего кода делает некоторые вещи, чтобы показать вам глубинные результаты. Но только во время создания чего-то. Конечный продукт не должен иметь операторов-операторов.

ПОСЛЕДНИЙ РЕДАКТИРОВАТЬ: Еще одна дискуссия о "goto" в PHP5.3/PHP6

Ответ 1

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

См

http://www.procata.com/blog/archives/2004/07/29/goto-in-php/

Для хорошего комментария о добавлении этого к PHP, а также, здесь, при переполнении стека,

GOTO по-прежнему считается вредным?

Ответ 2

Я только что нашел два использования для goto:

  • Чтобы выйти из вложенных циклов. Но у большинства более новых языков есть механизм для этого без goto в любом случае (break <number> в PHP или break <loop label> в Java и т.д.).
  • Перейдите в раздел очистки в конце функции. Но опять же, это не часто полезно на языке, собранном для мусора.

Другими словами, если вы не знаете, следует ли использовать goto для чего-то, вы не должны.

Ответ 3

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

Ответ 4

Основное использование, которое я вижу при использовании gotos на языке, - это возможность переноса через языки. Я написал генератор синтаксического анализатора в C, который сгенерировал парсеры с gotos (потому что было проще использовать gotos, чем использовать более строгие структуры управления), и теперь перенос его на PHP не так сильно болит.

Ответ 5

goto может помочь уменьшить дублирование кода для разворачивания стека, в псевдокоде ниже:

do A
if (error)
    goto out_a;
do B
if (error)
    goto out_b;
do C
if (error)
    goto out_c;
goto out;

out_c:
undo C

out_b:
undo B:

out_a:
undo A

out:
return ret;

(Псевдокод Роберта Лава, взятый из списка рассылки архива ядра Linux: https://lkml.org/lkml/2003/1/12/203)

Ответ 6

Нет такого понятия, как хорошее использование goto.

Может быть, может быть, может быть полезно выйти из нескольких вложенных циклов, но вы уже можете это сделать, используя "break 2" и т.д. Маркированные перерывы, как в Java, были бы лучше, чем goto для этой цели.

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

Ответ 7

Я признаю, что никогда не использовал goto в своих кодах.:)

Единственная причина для меня, по-видимому, облегчает кратчайший маршрут миграции с других языков на PHP (практически только изменение языка без прикосновения к структурам управления) и рефакторинг кода на втором этапе портирования.

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

Ответ 8

В классическом кодировании VB использование goto удобно для эмуляции обработки ошибок try/catch, например:

Function MyFunction() as String

'-- start of error block
'
 On Error Goto Catch
   ' do something here that might cause an error
   MyFunction = "IT WORKED"
   Exit Function

 Catch:
   ' error occured - do something else
   MyFunction = Err.Description

 '
 '-- end of error block

End Function

... и вот способ эмуляции try/catch/finally..

Function MyFunction() as String

'-- start of error block
'
 On Error Goto Catch
   ' do something here that might cause an error
   MyFunction = "IT WORKED"
   Goto Finally

 Catch:
   ' error occured - do something else
   MyFunction = Err.Description
   Err.Clear

 Finally:
   ' put your finally code here

 '
 '-- end of error block

End Function

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

Честно говоря, у меня никогда не было случая на PHP, где я думал про себя: "Хм, мне жаль, что не было утверждения goto". Я не понял, почему они решили это сделать, но эти парни довольно умны и до сих пор использовали PHP в очень хороших направлениях, поэтому, возможно, мы ожидаем, что мы еще не осознаем.

Ответ 9

Goto в основном используется при написании конечных автоматов. При разборе контекстного свободного грамматика вам действительно понадобится один из них. Хотя мы могли бы жить без goto, если continue $case; является допустимым оператором в блоке коммутатора, чтобы перейти к другому случаю и без курса, имеющему диапазоны регистров, как и многие языки в настоящее время. До тех пор мы в значительной степени застряли с goto.

Ответ 10

Иногда я использую goto, чтобы избежать множественных вложенных ifs. Это не только о логике, структуре или потоке программы, иногда это может быть только о том, как выглядит код.

Ответ 11

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

Ответ 12

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

OTOH, я запрограммировал на языке, где единственными двумя структурами были функции и условные gotos: SNOBOL4. Поскольку риск спагетти-кода был настолько высоким, большинство программистов SNOBOL4 были/старались избегать этого. Но gotos действительно включали очень сложное программирование, творческие циклы и т.д. На самом деле несколько проще выполнять петли FSM-типа, если у вас есть gotos.

Ответ 13

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

Ответ 14

Большим преимуществом gotos является кривая обучения. Интересно, почему инструменты, такие как visual studia и macs, преуспевают. Причина в том, что люди хотят больше, чем отличный продукт; они хотят отличный продукт, который они могут научиться использовать всего за час или около того. Сейчас многие программисты в течение нескольких дней только одна из их рабочих мест. Я вижу, что многие книги говорят, что никогда не следует использовать goto, а затем дать пять или около того технологий, которые, как говорят, устраняют каждый потребность в нем. Я говорю, что именно тот факт, что они упомянули 5, является доказательством того, насколько хороши является!!!!! У меня нет времени учить пять вещей, которые включают в себя структуры исключений, которые возьмите целые главы, чтобы объяснить!!!!! когда все, что вам действительно нужно, - это простой переход, который может быть объяснено через 30 секунд. Конечно, вы можете создать с ними плохой код, если программист хочет --- но эй, большинство программистов не хотят писать плохой код, и если они они все равно могли. Большинство gotos в нашей лаборатории сделали код очень простым для понимать и учиться; гораздо больше, чем чтение 2000 страниц книги.

Ответ 15

GOTO, структура управления ограниченным исполнением, может использоваться вместо петель, но это очень не рекомендуется. Его использование имеет тенденцию поощрять создание неструктурированного кода, что является ужасной практикой. Скорее всего, это лучше всего использовать только в разработке, для отладки (пропускать большие объемы кода для доступа к конкретной проблемной области) и тестирования. Единственная другая цель для GOTO, возможно, для написания ассемблера; скорее всего, не. GOTO, если используется вне разработки, следует использовать экономно и только в крайнем случае. Если возможно, замените GOTO на применимую структуру контура.

Что касается последнего связанного потока (команда GOTO в PHP?):

Как сказано Ишмаэлем (под редакцией Гордона, безусловно лучший ответ):

GOTO - это просто расширенный BREAK, с возможностью "использовать статические метки". "В принципе, это улучшит возможность выхода из вложенных операторов if".

Ответ 16

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

В более чем 2 миллионах строк кода я написал на всех языках, исключая машинный код:-). Только два раза его использование было необходимо, и оба из-за проверки\сортировки больших наборов данных дерева.