php switch语句返回无效输出

时间:2016-01-10 10:11:03

标签: php switch-statement

php switch语句返回无效输出:

$cond = "Night";

switch($cond){
    case "Morning":
    case "Night":
        $name = "Good";

    case "Morning" :
        echo $name." Morning";
        break;

    case "Night" :
        echo $name." Night";
        break;
}

输出:Good Morning

预期Good Night

编辑(阅读回复后):

感谢您的回答。 我没有得到一个明确的答案。

我知道我可以使用if else这样的另一个语句。 但逻辑上代码应该正常工作(我认为)。 因为在第一个break之后没有cases

但是为什么当执行到达case "Morning"时,条件为真,而实际上并非如此?

7 个答案:

答案 0 :(得分:2)

你可以稍微改变一下 - 因为总有一个good你可以做到这一点:

$cond = "Night";
$pre='Good ';

switch($cond){
    case "Morning" : echo $pre." Morning"; break;
    case "Night" : echo $pre." Night"; break;
}

答案 1 :(得分:1)

由于你没有添加break第一个案例 - 继续执行并在

之后中断
echo $name." Morning";

但即使您为第一个案例添加break声明 - 您也无法达到最后一个案例:

case "Night" :
    echo $name." Night";
    break;

已执行switch - 阻止。

所以你必须用另一个逻辑写一些其他代码。简单的一个是:

$cond = "Night";

switch($cond){
    case "Morning":
    case "Night":
        echo "Good" . $cond;
        break;
}

答案 2 :(得分:0)

如果你使用的话,这里的顺序似乎很重要:

$cond = "Night";

switch($cond){
    case "Morning":
    case "Night":
        $name = "Good";

    case "Night" :
        echo $name." Night";
        break;        

    case "Morning" :
        echo $name." Morning";
        break;
}

你会得到你所期望的。然而,正如您所看到的那样,无法轻易预测到什么是精确结果,因此根据您的需要,我会以不同的方式进行,例如我会使用2个开关:

$cond = "Night";
$name = '';
switch($cond){
    case "Morning":
    case "Night":
        $name = "Good";
        break;
}

switch ($cond) {
    case "Morning" :
        echo $name." Morning";
        break;    
    case "Night" :
        echo $name." Night";
        break;
}

甚至更简单:

$cond = "Night";
$name = '';
switch($cond){
    case "Morning":
    case "Night":
        $name = "Good";
        break;
}

switch ($cond) {
    case "Morning" :
    case "Night" :
        echo $name." ".$cond;
        break;
}

现在一切都很明显,没有人会很难理解这里发生了什么。

答案 3 :(得分:0)

为了保持井井有条,你可以做这样的事情。您不需要switch

$cond = "Night";
$name = array (
     'Morning' => 'Good',
     'Night' => 'Good'
     );
echo $name[ $cond ]." ".$cond;

在这种情况下,您不必为新情况添加另一个开关案例,只需在$ name数组中添加一个条目

答案 4 :(得分:0)

如果你不打破;你的开关它将继续并进入下一个案例。

    $cond = "Night";

switch($cond){
    case "Morning":
    case "Night":
        $name = "Good";
        break; // add this

    case "Morning" :
        echo $name." Morning";
        break;

    case "Night" :
        echo $name." Night";
        break;
}

这种情况也会发生在其他语言(例如java)中,称为“通过

答案 5 :(得分:0)

当您未指定switch时,break构造总是有点风险,因为执行将继续执行下一个案例而不测试这些条件。

docs所述,我用粗体强调:

  

了解如何执行switch语句以避免错误非常重要。 switch语句逐行执行(实际上是逐个语句)。一开始,没有代码被执行。只有当找到的case语句的值与switch表达式的值匹配时,PHP才会开始执行语句。 PHP继续执行语句,直到切换块结束,或者第一次看到break语句。如果你不在case语句列表的末尾写一个break语句,那么PHP将继续执行以下语句的语句

因此,需要明确的是:PHP开始在case内执行语句后, 不再验证案例条件。如果没有break,它将继续处理下一个案例的陈述而不验证案例条件。因此,它会逐个案例地执行所有语句,直到找到breakswitch的结尾。

以下代码:

switch (1) {
case 1:
    echo "one ";
case 2:
    echo "two ";
case "hello":
    echo "hello ";
}

将输出:

  

一两个你好

PHP发现第一个案例条件为true并开始执行语句而不评估任何其他案例条件。

这可能非常违反直觉,也会降低代码的可读性。最佳做法是在每个break的末尾添加case,以避免任何误解。

答案 6 :(得分:-1)

试试这段代码。

$cond = "Night";
$name = "Good ";
switch($cond){
    case "Morning":
        echo $name . $cond;
    break;
    case "Night":
        echo $name . $cond;
    break;
}