没有“break”的开关/外壳,不能正确检查外壳
我遇到了开关盒conidtion的问题。
为什么在以下情况下:
$category = "A";
$offer = "none";
$discount = "none";
对于下面的代码:
switch (TRUE) {
case ($category == 'A') : / #1
$msg = "hello";
case ($offer == 'special') : / #2
$id = "123";
case ($discount == '50D') : / #3
$id = "999";
break;
echo $id;
}
尽管#2
和#3
没有满足,我获得999
输出为id
,尽管?
编辑:
例如$offer == 'special'
是一般情况下的私人案例,即$category == 'A'
。 这就是为什么我希望函数按照这个顺序走的原因。 如果开关/外壳不合适,我应该使用什么?
一旦switch
找到匹配的case
,它就会执行所有剩余的代码,直到它到达一个break
语句。 以下任何一种case
表达式都未经过测试,因此您不能拥有这样的依赖关系。 要实现子情况,你应该使用嵌套的switch
或if
语句。
switch ($category) {
case 'A':
$msg = 'hello';
if ($offer == 'special') {
$id = '123';
} elseif ($discount == '50D') {
$id = '999';
}
break;
...
}
echo $id;
如果您有两个应该完全相同的事件,那么最常使用的是无break
case
下的fallthrough功能。 所以第一个有一个没有中断的空代码,它只是通过。
switch ($val) {
case 'AAA':
case 'bbb':
// some code
break;
...
}
当两种情况相似时,它也可以使用,但其中一个需要先运行一些额外的代码:
switch ($val) {
case 'xxx':
echo 'xxx is obsolete, please switch to yyy';
case 'yyy':
// more code
break;
...
}
这就是switch-case语句的工作原理。 只要一个条件得到满足,只要没有休息,它就会经历所有的case
。 您可以在这里的手册中阅读它:PHP开关。
如果您想在案例结束时停止交换机的执行,只需添加一个break;
声明。
上一篇: Switch/Case without a `break`, doesn't check the cases properly