在goto
的PHP.net文档中,有一个comment,引用如下,得分为-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 :(得分: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
以使其更清晰和/或更易于管理时,这是糟糕的设计。
答案 1 :(得分: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
结构。