在PHP switch语句中使用||符号是否可行?

5
switch ($foo)
    {
        case 3 || 5:
           bar();
        break;

        case 2:
          apple();
        break;
    }

在上面的代码中,第一个 switch 语句是否有效?如果 $foo 的值为 3 或 5,我想调用函数 bar()

1
我对PHP不是很了解,但我认为(3 || 5)会被翻译成TRUE。 - Tamas Czinege
2
在 switch 语句中,3 || 5 似乎会被计算为 true,因此无论 $foo 的值是什么,它都将始终调用 bar() - Mark Rushakoff
@Mark Rushakoff - 不,它会在 switch 值和 case 值之间进行松散比较,如果,例如,$foo == 0,则不会执行 3 || 5 case 代码。 (就像 if (0 ==(3 || 5)) 将解析为 false 一样。) - GZipp
@GZipp:哎呀,你说得对。当我尝试运行代码时,我没有注意到这个问题。 - Mark Rushakoff
5个回答

24

你应该利用 switch 语句的“穿透”效果:

switch ($foo)
    {
        case 3:
        case 5:
           bar();
        break;

        case 2:
          apple();
        break;
    }

就像这样,PHP手册中也有一些类似的例子。


6
我认为你需要的是:

我认为你需要的是:

switch ($foo)
{
    case 3:
    case 5:
       bar();
    break;

    case 2:
      apple();
    break;
}

有趣的是,我听说Perl正在引入这种语法(也许现在已经有了),例如:

if ($a == 3 || 5)

我不是那种很喜欢这种语法的人,因为我写过很多词法解析器,而且我认为语言应该尽可能地不含歧义。但是,Perl以前已经用那些可怕的尾部ifor解决了所有这些问题,所以我猜这个也不会有问题 :-)


5

相反,使用switch语句的主要优势之一:

switch($foo) {
    case 3:
    case 5:
        bar();
        break;

    case 2:
        apple();
        break;
}

1

是的,我认为你那里的代码等同于:

    <?php

    $foo = 5000 ;
switch( $foo ) { case true : // Gzipp: 这里使用了“==”风格的比较 echo '第一个' ; // 比较 $foo 和 case 中的值 break; // 所以对于“真实”的 $foo 值,你总是会得到这个结果。
case 2: echo '第二个'; break;
default: echo '都不是' ; break; }
?>

case true: 这一行不总是会被执行。每个 case 值都会与 switch 值进行宽松比较;如果它解析为 true,则会执行代码。因此,如果 $foo 是 0、'' 或任何其他宽松解析为 false 的值,则该 case 将被跳过。 - GZipp

0
不,如果你写了case 3 || 5:,那么你最好直接写case True:,这肯定不是你想要的。但是你可以将case语句直接放在彼此下面:
switch ($foo)
    {
        case 3:
        case 5:
           bar();
        break;
case 2: apple(); break; }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接