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;
}
如果不指定break
,switch
构造总是有点风险,因为执行将继续到下一个案例,而不测试这些条件。
正如文件中所述,我用粗体强调:
为了避免错误,了解switch语句是如何执行的非常重要。switch语句逐行执行(实际上是逐语句执行)。一开始,没有执行任何代码。只有当case语句的值与switch表达式的值匹配时,PHP才会开始执行这些语句PHP继续执行这些语句,直到切换块结束,或者第一次看到break语句。如果您没有在案例的语句列表末尾编写break语句,PHP将继续执行以下案例的语句。
因此,需要明确的是:一旦PHP开始在case
中执行语句,它就不再验证用例条件。如果没有break
,它将只继续下一个案例的陈述,而不验证案例条件。因此,它会根据不同的情况执行所有语句,直到找到break
或switch
的末尾。
所以下面的代码:
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;
}