Использование goto в блоке PHP Switch. Плохая идея?

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

Я был бы очень признателен, если бы кто-то смог пролить свет на то, почему его код недооценивают / считают плохим.

0

Решение

(Более подробно, чем мой комментарий, укажите, если что-то упущено для вас.)

В случае, если вы разместили свой 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 чтобы сделать его более понятным и / или более легким в управлении.

0

Другие решения

В рамках этого примера и не желая менять его за пределы исходного контекста, это:

<?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 структура вместо.

0

По вопросам рекламы [email protected]