В документации по PHP.net для goto
, Eсть комментарий, цитируется ниже, что имеет -4 балла. Это похоже на правильное использование для меня. Других комментариев, объясняющих, почему это плохо, также нет.
Я нашел это полезным для операторов switch:
<?php
$action = $_GET['action'];
switch ($action){
case('a'):
mylabel: {
doStuff();
break;
}
case('b'):
if (true){
doAnotherStuff();
} else {
goto mylabel;
}
break;
}
?>
Несмотря на необычное case
использование ключевых слов и if (true)
что делает следующий goto
никогда не срабатывать, я не думаю, что есть что-то особенно неправильное в приведенном выше коде.
Я был бы очень признателен, если бы кто-то смог пролить свет на то, почему его код недооценивают / считают плохим.
(Более подробно, чем мой комментарий, укажите, если что-то упущено для вас.)
В случае, если вы разместили свой switch
может быть переписан как
<?php
$action = $_GET['action'];
switch ($action){
case('b'):
if (true){
doAnotherStuff();
break;
}
case('a'):
doStuff();
break;
}
?>
Теперь можно утверждать, что это не чище (читай лучше), это без goto
тем не мение. Вернуться к актуальной теме: Что касается комментария с -4
в счете. Это действительно не похоже на случай для switch
мне. Это мое предположение относительно того, почему это так плохо принято.
mylabel
только вызов doStuff()
здесь, почему бы просто не вызвать его напрямую? Не нужно использовать ни switch
ни goto
,
Теперь я понимаю, что это всего лишь пример, однако попробуйте обойти это. в общем-то плохой дизайн, когда ты необходимость goto
чтобы сделать его более понятным и / или более легким в управлении.
В рамках этого примера и не желая менять его за пределы исходного контекста, это:
<?php
$action = $_GET['action'];
switch ($action){
case('a'):
mylabel: {
doStuff();
break;
}
case('b'):
if (true){
doAnotherStuff();
} else {
goto mylabel;
}
break;
}
?>
должен быть заменен
<?php
$action = $_GET['action'];
switch ($action){
case('a'):
doStuff();
break;
case('b'):
if (true){
doAnotherStuff();
} else {
doStuff();
}
break;
}
?>
Назначение функций — избежать дублирования кода, и это все, что вам действительно нужно здесь. Также 2 разных случая и нет default
дело выглядит для меня, что вы должны использовать if then else
структура вместо.