【问题标题】:Initialize class property with an anonymous function使用匿名函数初始化类属性
【发布时间】:2014-09-14 17:10:39
【问题描述】:

为什么在php中声明属性时无法将属性初始化为函数?以下代码段导致解析错误:语法错误,意外的 T_FUNCTION

<?php
  class AssignAnonFunction {
    private $someFunc = function() {
      echo "Will Not work";
    };
  }
?>

但是您可以将属性初始化为字符串、数字或其他数据类型吗?

编辑:

但我可以在 __construct() 方法中将函数分配给属性。以下确实有效:

<?php
  class AssignAnonFunctionInConstructor {
    private $someFunc;

    public function __construct() {
      $this->someFunc = function() {
        echo "Does Work";
      };
    }
  }
?>

【问题讨论】:

    标签: php


    【解决方案1】:

    因为它没有在 PHP 中实现。

    http://www.php.net/manual/en/language.oop5.properties.php。引用:

    它们(属性)是通过使用以下之一来定义的 关键字 public、protected 或 私有的,后跟一个普通变量 宣言。该声明可 包括初始化,但这 初始化必须是常量 价值——也就是说,它必须能够 在编译时评估,不得 依赖于运行时信息 要评估的顺序。

    你不能像这样初始化属性,函数不是常量值。因此我最初的回答是“它没有实现”。

    为什么没有实施?我只能猜测 - 这可能是一项相当复杂的任务,没有人加紧实施它。和/或可能对这样的功能没有足够的需求。

    【讨论】:

    • 没有帮助或提供信息;没有实施的背景是什么?
    • 批评是当之无愧的,我更改了答案以提供更多细节。
    【解决方案2】:

    在 PHP 5.3(最新版本)之前,PHP 中不存在闭包。如果你想这样做,请确保你有 PHP 5.3。

    在早期版本中,您可以使用 create_function() 函数复制此功能,有点像这样:

    $someFunc = create_function($args,$code);
    $someFunc();
    

    其中 $args 是格式为 "$x,$y,$z" 的字符串,$code 是 PHP 代码的字符串。

    【讨论】:

    • 这是在 php 5.3 中。我已经用一个有效的案例更新了我的问题(我可以在 __construct 魔术方法中为属性分配一个函数)
    • 在 php 5.6 中,OP 中的语法不起作用,create_function() 不是一回事
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多