切换/案例没有'break`,不能正确检查案例

时间:2016-01-02 17:01:20

标签: 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

        $id = "999";


break;

echo $id;

}

即使999id未填满,我的#2的{​​{1}}输出也是如此?

修改

#3等案例是一般案例$offer == 'special'的私人案件。 这就是为什么我希望函数按此顺序排列。 如果开关/箱子不合适,我该怎么用?

2 个答案:

答案 0 :(得分:2)

一旦switch找到匹配的case,它就会执行所有剩余的代码,直到它到达break语句。以下case表达式均未经过测试,因此您无法获得此类依赖关系。要实现子案例,您应该使用嵌套的switchif语句。

switch ($category) {
case 'A':
    $msg = 'hello';
    if ($offer == 'special') {
        $id = '123';
    } elseif ($discount == '50D') {
        $id = '999';
    }
    break;
...
}
echo $id;

当你有两个应该完全相同的情况时,最常使用case没有break的穿透功能。所以第一个有一个没有中断的空代码,它就会失败。

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;
...
}

答案 1 :(得分:0)

这是switch-case语句的工作原理。只要没有中断,只要满足一个条件,它就会经历所有case es。您可以在手册中阅读:PHP switch

如果您想在案例结束时停止执行交换机,只需添加break;语句。