【问题标题】:using variables for the cases and a function for a switch?使用案例变量和开关函数?
【发布时间】:2010-03-04 21:18:33
【问题描述】:

在 PHP 中我想这样做:

switch (function_foo($bar,$bar2)) {
case $fu:
    *Do Stuff*
    break;
case $fubar:
    *Do Other Stuff*
    break;
}

这是一个糟糕的主意吗?它会起作用吗?

【问题讨论】:

    标签: php case switch-statement


    【解决方案1】:

    switch 中使用函数是可以的:该函数将被调用,并返回一个值——该值将用于该案例。

    和写的一模一样:

    $my_var = function_foo($bar,$bar2);
    switch ($my_var) {
        // ...
    }
    

    即使我更喜欢使用变量,所以代码更容易阅读。


    case 中使用变量是您不经常看到的;但它也可以正常工作;-)

    引用the manual page of switch

    case 表达式可以是任何 计算结果为简单的表达式 类型,即整数或 浮点数和字符串。

    所以,只要$fu$fubar 包含简单类型值,您的代码就可以工作。


    使用变量作为case 值并不经常使用(据我从阅读的代码中可以看出),可能是因为其他一些语言不允许这样做(例如, C 不允许这样做;并且 switch/case 结构是从 C 中借用的) ;但它有效:

    $a = 1;
    $b = 2;
    switch (1) {
        case $a: echo 'a'; break;
        case $b: echo 'b'; break;
    }
    

    将输出:

    a
    

    【讨论】:

      【解决方案2】:

      从未尝试将函数作为switch 的参数,不确定(您应该尝试一下),但是您可以先将函数返回值存储在某个变量中,然后在switch 中使用它,例如:

      $return_value = function_foo($bar, $bar2);
      
      switch ($return_value) {
      case $fu:
          *Do Stuff*
          break;
      case $fubar:
          *Do Other Stuff*
          break;
      }
      

      【讨论】:

        【解决方案3】:

        根据the manual,PHP 的switch 语句与一系列if/else if 语句完全相同(如果每个case 都以break 结尾)。这意味着你的技术应该有效。只要函数名和变量名可读,我想不出有什么问题。

        在其他一些语言中,switch 语句实际上是对if/else if 语句的性能改进,因此您需要在编译时知道大小写值。看起来 PHP 不会做那种事情。

        【讨论】:

          【解决方案4】:

          它可能是yes和它称为lambda,它们是隐藏函数

          $lambda = function($a, $b) {
              return $a * $b;
          };
          
          
          $return_value = function foo($bar, $bar2){ return $logic }
          
          switch ($lambda(2,4)) {
          case $fu:
              *Do Stuff*
              break;
          case $fubar:
              *Do Other Stuff*
              break;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多