php switch语句返回无效输出


php switch statement returns invalid output

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的语句。但从逻辑上讲,代码应该能正常工作(我认为)。因为在2个第一个CCD_ 6之后没有CCD_。

但为什么当执行到达case "Morning"时,条件为真,而在现实中不为真?

你可以做得稍微不同一点——因为总会有一个good,你可以这样做:

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

由于您没有添加break第一种情况-后执行继续并中断

echo $name." Morning";

但是,即使您为第一种情况添加break语句,也无法到达最后一种情况:

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

因为执行已经超出CCD_ 11-块。

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

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

如果不指定breakswitch构造总是有点风险,因为执行将继续到下一个案例,而不测试这些条件。

正如文件中所述,我用粗体强调:

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

因此,需要明确的是:一旦PHP开始在case中执行语句,它就不再验证用例条件。如果没有break,它将只继续下一个案例的陈述,而不验证案例条件。因此,它会根据不同的情况执行所有语句,直到找到breakswitch的末尾。

所以下面的代码:

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

将输出:

一对二你好

PHP发现第一个case条件为true,并在不评估任何其他case条件的情况下开始执行语句。

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

如果您使用,这里的顺序似乎很重要

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

你会得到你所期望的。然而,正如你所看到的,无法轻易预测确切的结果,所以根据你的需求,我会用不同的方式来做,例如,我会使用两个开关:

$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;
}

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

为了保持事情的有序性,可以这样做。您将不需要switch

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

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

添加一个条目即可

如果您不中断;您的切换将继续,并进入下一个案例。

    $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,称为fall-through

试试这个代码。

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