PHP и оператор goto будут добавлены в PHP 5.3 - PullRequest
18 голосов
/ 07 апреля 2009

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

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

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

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

РЕДАКТИРОВАТЬ: хорошо, я видел некоторые ответы, и, видимо, существует широкий консенсус по поводу использования выражения "goto", и оно является плохим.

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

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

РЕДАКТИРОВАТЬ 2: Видя, как этот вопрос вызвал много плохих вещей, чтобы быть грустным по поводу заявления goto, я пошел и спросил моего отца. Ему 52 года и он инженер-технолог.
Он пару раз говорил мне, что в свое время занимался программированием, в основном на фортране и коболе. В настоящее время он занимается ИТ-сервисами, управлением серверами и сетью и т. Д.

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

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

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

LATE EDIT: Еще одно обсуждение "goto" в PHP5.3 / PHP6

Ответы [ 16 ]

14 голосов
/ 07 апреля 2009

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

См

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

За хороший комментарий о добавлении этого в PHP, а также о переполнении стека,

GOTO все еще считается вредным?

11 голосов
/ 07 апреля 2009

Я только когда-либо нашел два варианта использования goto:

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

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

3 голосов
/ 16 июля 2011

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)

3 голосов
/ 31 мая 2010

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

2 голосов
/ 07 апреля 2009

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

2 голосов
/ 07 апреля 2009

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

1 голос
/ 31 августа 2017

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

1 голос
/ 28 сентября 2010

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

1 голос
/ 07 апреля 2009

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

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

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

1 голос
/ 07 апреля 2009

Хорошего использования goto не существует.

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

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

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