如果开关匹配多个案例,所有匹配的案例都会运行吗?

时间:2013-09-20 15:54:42

标签: php switch-statement bit-manipulation

我正在尝试通过大量的按位测试,确切地说是32,可能存在多个匹配。我能想到的唯一方法就是使用一长串if语句,例如

$test = 3;
if(($test & 1) == 1) {
    do something...
}
if(($test & 2) == 2) {
    do something else...
}

我正在考虑减少代码的另一种可能性,尽管可能不是很多,只是一个switch语句。也就是说,我甚至不确定我的想法是否会起作用:

$test = 3;
switch($test) {
    case ((1 & $test) == 1):
        do something...
        break;
    case ((2 & $test) == 2):
        //Will this run?
        do something else...
        break;
}

break会结束切换吗?或者,交换机是否会继续,并且每个案例运行,按位操作返回true?

我问,因为我的实际程序将有32个不同的测试,而且我不想写所有32个只是为了发现它不起作用而谷歌没有发现任何关于此。

如果这不起作用是否有解决方案,或者我是否会降级为大量的if语句?

2 个答案:

答案 0 :(得分:1)

不是不是这样。在您的示例中只会运行其中一个开关案例。一旦遇到break,交换机处理就会结束。只有一个分支匹配。在PHP中,我认为(但您可能需要仔细检查)第一个匹配的案例将会运行。

有多个可能的匹配项,您需要使用一组if语句(注意不要使用if ... elseif)

我会转换为

if($test & 1) {
    // do stuff
}

if(test & 2) {
    // do stuff
}

答案 1 :(得分:0)

首先,不建议以这种方式使用int切换。这不是一个好习惯/不可读/不舒服。我会说它甚至不起作用,虽然我现在有疑问......根据版本和东西,我不太了解这些东西。

然后,为了回答你的问题,你只进入第一个匹配的情况......然后休息让你离开开关。但是,您可以省略中断,它将通过第二种情况。

无论如何,你应该更多地使用OOP来更好地描述你打算做什么,事情可能会变得更简单和清晰。