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

Утверждение «goto» происходит прямо из ASM или любого другого языка ассемблера.

Вот ссылка: http://be2.php.net/manual/en/control-structures.goto.php

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

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

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

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

    Также: обсуждение здесь о StackOverflow о «goto» в целом

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

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

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

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

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

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

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

    Видеть

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

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

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

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

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

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

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

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

    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 )

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

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

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

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

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

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

    В классическом кодировании 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 / наконец ..

     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 в очень хороших направлениях, поэтому, возможно, они ожидают, что мы еще не осознаем.

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

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

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

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

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

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

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

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

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

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

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

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

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