【问题标题】:Can I put anonymous functions in arrays in PHP? [duplicate]我可以在 PHP 中将匿名函数放入数组中吗? [复制]
【发布时间】:2012-02-24 01:59:05
【问题描述】:

可能重复:
Workaround for basic syntax not being parsed
Why don't PHP attributes allow functions?

我来了

解析错误:语法错误,第 87 行 /home/codemonkey/dev/broadnet/bito.api2/broadnet/resources/broadmapresource.php 中的意外 T_FUNCTION

从此代码:

private $debugFunctions = array(
    "testing" => function() // Line 87
    {
        return "I'm a test function!";
    },
    "foo" => function()
    {
        return "bar";
    }
);

我的印象是我可以在任何可以使用$variables 的地方使用匿名 PHP 函数。这是一个例外,还是我做错了什么?

我使用的是 PHP 5.3.9

【问题讨论】:

  • 我猜是因为它在一个类中,并且与此相关:Why don't PHP attributes allow functions? 它是否在类外的普通数组中工作?这散发着 PHP 设计缺陷的味道……但是,函数还不是 PHP 中真正的一等公民
  • 你试过在构造函数中而不是直接在类定义中做这个赋值吗?
  • 像往常一样:运行时信息不能在运行前分配给属性。 Lambda 是 Closure 类的实例。您也不能将实例作为声明的属性。如果你想要 lambdas,你必须从 ctor 中添加它们。
  • @Czech 这肯定会奏效,但他展示的方式可以说会更好。真糟糕,不能这样做
  • 我认为有人在跟踪我并否决我所有的问题。他们没有那么愚蠢。

标签: php anonymous-function


【解决方案1】:

你不能用类属性做这个,属性初始化必须是一个常量值。

初始化必须是一个常量值——也就是说,它必须能够 在编译时进行评估,并且不能依赖于运行时 信息以便进行评估。

【讨论】:

    【解决方案2】:

    不是这样,看看create_function。 它在当前范围内创建一个新函数并返回函数名。

    private $debugFunctions = array(
        "testing" => create_function('', 'return "I\'m a test function!";'),
        "foo" => create_function('', 'return "bar";');
    );
    

    但不确定上述示例是否有效。我没有时间测试它。

    另请注意,使用 create_function 会显着降低应用程序的速度,具体取决于您使用它的频率。

    【讨论】:

      【解决方案3】:

      使用构造函数:

      class TestClass {
          private $debugFunctions;
      
          public function __construct() {
              $this->debugFunctions = array(
                  "testing" => function()
                  {
                      return "I'm a test function!";
                  },
                  "foo" => function()
                  {
                      return "bar";
                  }
              );
          }
      }
      

      有关原因,请参阅xdazz's answer:类属性必须是常量并且在编译时已知。如果您需要它是动态的或更复杂的,您可以在实例初始化期间(在构造函数中)填充它。

      【讨论】:

        【解决方案4】:

        你可以这样做。

        只需在 costructor 中初始化它:

        function __construct() {
            $debugFunctions = array(
                "testing" => function() // Line 87
                {
                    return "I'm a test function!";
                },
                "foo" => function()
                {
                    return "bar";
                }
            );
        }
        

        【讨论】:

          猜你喜欢
          • 2023-03-25
          • 1970-01-01
          • 1970-01-01
          • 2014-09-11
          • 2014-02-27
          • 1970-01-01
          • 2014-09-01
          • 2023-03-19
          • 2018-05-02
          相关资源
          最近更新 更多