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"
时,条件为真,而实际上并非如此?
答案 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
,它将继续处理下一个案例的陈述而不验证案例条件。因此,它会逐个案例地执行所有语句,直到找到break
或switch
的结尾。
以下代码:
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;
}