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的示例。