在PHP Switch块中使用goto。馊主意?

时间:2015-11-26 22:07:51

标签: php switch-statement goto

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永远不会触发,但我认为上面的代码中没有任何特别的错误。

如果有人能说清楚为什么他的代码被低估/被认为是坏事,我将非常感激。

2 个答案:

答案 0 :(得分:0)

比我的评论更详细,请指出是否遗漏了某些内容。

如果您发布了switch,则可以重写为

<?php
$action = $_GET['action'];
switch ($action){
    case('b'):
        if (true){
            doAnotherStuff();
            break;
        }       
    case('a'):
        doStuff();
        break;
}
?>

现在有人可能认为这不是更清洁(更好阅读),但它没有goto。回到实际主题:关于评分-4的评论。对于switch来说,这看起来并不像我的情况。我猜这是为什么它如此不受欢迎。

mylabel这里只调用doStuff(),为什么不直接调用呢?无需使用switchgoto

现在我明白这只是一个例子,但试图绕过它。 通常当您需要 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结构。