【问题标题】:Shorthand if else and anonymous functionsif else 和匿名函数的简写
【发布时间】:2017-08-04 16:00:15
【问题描述】:

我正在尝试在 if else 语句的简写中使用匿名函数。

$str = (true) ? function() { 
    //do something
    return $result;
}
:
function() {
    //do something else
    return $result;
};
echo $str;

这会引发Object of class Closure could not be converted to string 错误,因为速记 if/else 将函数存储在 $str 变量中。

如何让函数执行,然后将 $str 设置为函数返回的值?

我知道肯定有更简单的方法可以做到这一点。但我很固执,我只想满足我的好奇心。

【问题讨论】:

    标签: php


    【解决方案1】:

    你可以使用 call_user_func

    $str = true ? call_user_func( function(){ return "123"; } ) : 
                  call_user_func( function(){ return "321"; } ); 
    

    【讨论】:

      【解决方案2】:

      这不是“if/else”,而是ternary operator。其次,您实际上并没有调用您的函数,只是将一个或另一个分配给变量$str。您需要实际调用生成的函数。

      你为什么要这么做,我不知道...

      【讨论】:

      • “你为什么要这样做,我不知道......” +1
      • 我也没有。我只是喜欢它。这是为了一些非常简单的东西,很多 if/else 附加到一个字符串。想看看能不能一口气写完$str = ...
      • @VitaliyIsikov 然后就写吧。这些函数只会增加开销和视觉噪音。
      • @meagar 它可能有一个很好的用例......闭包可以超出范围并归还内存,而函数是永远的(至少在请求结束之前)
      • @Orangepill 我会争辩说,任何问题空间如果这是一个合适的解决方案,你已经选择了一种不合适的 PHP 语言。
      【解决方案3】:

      如果有人发现它很有用,因为 PHP 7 可以在声明后立即使用类似于以下的语法调用函数:

      $result = (function () { return "Something"; })();
      

      在这种情况下,你会这样做:

      $str = (true) ? (function() { 
          //do something
          return $result;
      })()
      :
      (function() {
          //do something else
          return $result;
      })();
      

      【讨论】:

        【解决方案4】:

        您将$str 设置为函数,而不是其返回值。您需要实际调用该函数。

        echo $str();
        

        【讨论】:

          【解决方案5】:

          三元运算符最终将匿名函数分配给变量$str,而不是函数执行的结果。所以你需要执行这个函数。

          <?php
          $str = (true) ? function () { return '123'; } : function () { return 'abc'; };
          echo $str();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-12-25
            • 2012-10-23
            • 2014-09-22
            • 1970-01-01
            • 1970-01-01
            • 2014-11-04
            • 1970-01-01
            相关资源
            最近更新 更多