【问题标题】:Is it possible to use || in PHP switch?是否可以使用 ||在 PHP 开关?
【发布时间】:2009-11-01 23:52:03
【问题描述】:
switch ($foo)
    {
        case 3 || 5:
           bar();
        break;

        case 2:
          apple();
        break;
    }

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

【问题讨论】:

  • 我对 PHP 了解不多,但我认为 (3 || 5) 会转换为 TRUE。
  • 3 || 5 似乎在 switch 语句中仅被评估为 true,因此对于 $foo 的任何值总是会调用 bar()
  • @Mark Rushakoff - 不,在 switch 值和 case 值之间进行了松散的比较,例如,如果 $foo == 0 那么 3 || 5 case代码不会被执行。 (就像 if (0 == (3 || 5)) 会解析为 false。)
  • @GZipp:哎呀,你是对的。当我尝试运行代码时,我没有注意到这一点。

标签: php switch-statement fall-through


【解决方案1】:

你应该利用 switch 语句的失败:

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

        case 2:
          apple();
        break;
    }

PHP man page 有一些这样的例子。

【讨论】:

    【解决方案2】:

    我认为你需要的是:

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

    有趣的是,我听说 Perl 正在(或者甚至现在已经)引入了这种语法,类似于:

    if ($a == 3 || 5)
    

    我不是那种语法的粉丝,因为我不得不编写相当多的词法解析器并且相信语言应该尽可能明确。但是,Perl 已经解决了所有这些问题,之前用那些可怕的尾部 ifs 和 ors 所以我怀疑它不会有问题:-)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        是的,我认为你所拥有的相当于:

        case true : // Gzipp:进行 '==' 风格的比较 echo '第一个' ; // 在 $foo 和 case 中的值之间 休息; // 所以对于“真实”的 $foo 值 // 你总是得到这个。 案例2: echo '第二个'; 休息; 默认: 回声“都不是”; 休息; } ?>

        【讨论】:

        • case true: 行将始终不会被获取。每个 case 值都与 switch 值进行了松散的比较;如果它解析为 true,则执行代码。因此,如果 $foo 为 0,或 '',或任何其他松散解析为 false 的内容,则该案例将被绕过。
        【解决方案5】:

        不,如果你写了case 3 || 5:,那么你还不如写case True:,这肯定不是你想要的。但是,您可以将 case 语句直接放在彼此下方:

        开关 ($foo) { 案例3: 案例5: 酒吧(); 休息; 案例2: 苹果(); 休息; }

        【讨论】:

          猜你喜欢
          • 2010-11-26
          • 1970-01-01
          • 2011-10-16
          • 1970-01-01
          • 2011-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多