Php 开关/外壳不带“断开”,不带';I don’我没把箱子检查好
我的开关箱有问题 为什么会出现以下情况:Php 开关/外壳不带“断开”,不带';I don’我没把箱子检查好,php,switch-statement,Php,Switch Statement,我的开关箱有问题 为什么会出现以下情况: $category = "A"; $offer = "none"; $discount = "none"; 对于以下代码: switch (TRUE) { case ($category == 'A') : / #1 $msg = "hello"; case ($offer == 'special') : / #2 $id = "123"; case ($discount == '50D') : / #3
$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;
}
我得到id
的999
输出,即使#2
和#3
未满
编辑:
像$offer=='special'
这样的案例是一般案例的私人案例,即$category=='A'
。
这就是为什么我希望函数按这个顺序运行。
如果switch/case不合适,我应该使用什么?switch-case语句就是这样工作的。一旦满足一个条件,只要没有中断,它将经历所有的
情况。您可以在此处的手册中阅读:
如果要在案例结束时停止开关的执行,只需添加一个break代码>语句。一旦开关
找到匹配的案例
,它只会执行所有剩余的代码,直到到达中断
语句。下面的case
表达式都没有经过测试,因此不能有这样的依赖关系。要实现子用例,应该使用嵌套的开关
或if
语句
switch ($category) {
case 'A':
$msg = 'hello';
if ($offer == 'special') {
$id = '123';
} elseif ($discount == '50D') {
$id = '999';
}
break;
...
}
echo $id;
当您有两个案例应该做完全相同的事情时,最常用的是不带break
的case
的故障排除功能。所以第一个代码是空的,没有中断,它只是失败了
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;
...
}
为什么会有这么多的反对票?这不是函数应该如何工作吗?我认为这是因为人们不清楚问题是什么。不要从中间开始。描述问题时从头开始。可能重复使用、条件,而不是开关。具体来说,PHP将继续执行这些语句,直到switch块结束,或者第一次看到break语句。如果您没有在案例语句列表的末尾编写break语句,PHP将继续执行以下案例的语句
——我不想停止死刑。由于其他案例,如$offer==“special”
是一般案例的私有案例,即$category==“A”
,因此在失败时不会测试其他案例。一旦找到一个匹配的案例,它就会执行所有的操作,直到break
。什么是“私有案例”?如果您只想在$category
匹配时检查$offer
和$discount
的值,请使用内部开关
或if
语句。我被建议在中使用开关/case,那么考虑到其他线程,您建议怎么做?@rockyraw IMHO,使用开关
的风格是不正确的。好吧,那么在什么情况下,如果所有其他情况都没有任何意义的话,人们会希望在两种不同情况之间使用开关而不使用中断
。所以大写和小写都属于同一组。@rockyraw我添加了一些可能使用fallthrough的示例。