使用匿名函数初始化类属性

14

为什么在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";
      };
    }
  }
?>
2个回答

21
因为PHP语言本身没有实现这个功能。
根据http://www.php.net/manual/en/language.oop5.properties.php的说明:
属性(properties)可以使用public、protected或private关键字及普通变量声明来定义。这个声明可以包含初始化,但初始化必须是一个常量值--也就是说,它必须能在编译时计算,并且不能依赖于运行时信息才能进行评估。
你无法像这样初始化属性,因为函数不是常量值。因此我的最初答案是"它没有被实现"。
为什么没有被实现呢?我只能猜测——可能这是一个相当复杂的任务,没有人愿意来实现它。和/或者没有足够的需求来支持这样的功能。

不够有用或者信息量不足;为什么没有实现的背景是什么? - Ophidian
2
批评是应该的,我改变了答案,加入了稍微更多的细节。 - Anti Veeranna

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魔术方法中的属性)。 - Chris Gow
在 PHP 5.6 中,OP 中的语法不起作用,create_function() 不是同一件事。 - David Meister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接