【问题标题】:Can a class property be initialized to an array of closures?可以将类属性初始化为闭包数组吗?
【发布时间】:2017-12-02 07:20:38
【问题描述】:

我正在尝试将一些验证函数存储在静态配置数组中。将函数存储在数组中似乎可行,但是,当我将相同的代码放入类中时,它会失败。有谁知道怎么回事?

$functions = array(
     'function1' => function($echo) {
           echo $echo;
      }
);

$functions['function1']("hello world");
// Works

//----------

class A {
    public static $functions = array(
        'function1' => function($echo) {
             echo $echo;
         }
    );
}

A::$functions['function1']("hello world");
//Parse error: syntax error, unexpected 'function' (T_FUNCTION)

【问题讨论】:

  • 在 Windows 或 Linux 上运行代码时出现相同的错误。 Windows 上的 PHP 版本 5.6.30 Linux 上的 PHP 版本 5.5.9
  • PHP 中不允许这样做。您只能将基本值分配给初始定义中的类变量。不过,您可以从函数中为其设置闭包,例如在A::prepare() 方法中,设置self::$functions['function1'] = function($echo) { echo $echo; };
  • 类变量必须初始化为 CONSTANT 表达式,至少在 5.x 中。

标签: php arrays closures class-properties


【解决方案1】:

当我使用 PHP 7 运行它时(PHP 5 也会出错),我收到一个错误,基本上是说不允许实例化类变量时的表达式。这就是它的工作方式:

$functions = array(
    'function1' => function($echo) {
        echo $echo;
    }
);

$functions['function1']("hello world");
// Works

//----------

class A {
    public static $functions = [];
}

A::$functions['function1'] = function($echo) {
    echo $echo;
};

A::$functions['function1']("hello world");

http://php.net/manual/en/language.oop5.properties.php

类成员变量称为“属性”。您可能还会看到它们 提及使用其他术语,例如“属性”或“字段”,但 出于本参考的目的,我们将使用“属性”。他们是 使用关键字 public、protected 或 private 之一定义, 然后是一个普通的变量声明。该声明可 包括一个初始化,但这个初始化必须是一个常量 价值——也就是说,它必须能够在编译时被评估,并且 不得依赖运行时信息来进行评估。

【讨论】:

  • 由于 PHP 的 OO 支持是基于类的,您应该在构造函数中实例化 A::$functions,而不是在类定义之后。
猜你喜欢
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 2016-12-18
  • 1970-01-01
  • 2018-05-09
相关资源
最近更新 更多