为什么 PHP 不允许在 CONST 中使用匿名函数?

Why PHP doesn't allow anonymous functions inside CONST?

为什么 PHP 中不允许使用此代码?

const VALIDATOR = array(
    'field' => array(
        'type' => 'string',
        'custom' => function() {
            return true;
    }));

或者更简单的版本?

const MY_FUN = function($param) {
            echo $param;
    };

抛出 unexpected T_FUNCTION 错误。

const 应该是 PHP 中的标量。

The value must be a constant expression, not (for example) a variable, a property, a result of a mathematical operation, or a function call.

因为它必须是一个常量值,因为你定义了一个常量!所以你不能将 "dynamic" 值赋给一个常量,否则它就不是常量了。

您也可以 read/see 在 manual:

Only scalar data (boolean, integer, float and string) can be contained in constants prior to PHP 5.6. From PHP 5.6 onwards, it is possible to define a constant as a scalar expression, and it is also possible to define an array constant. It is possible to define constants as a resource, but it should be avoided, as it can cause unexpected results.

其他答案只是照抄说明书。我将尝试解释函数常量思想的真正问题。

PHP 即使函数的行为可以在编译时确定,也不能引入函数常量。这是因为 PHP 允许函数和 const 具有相同的名称,这意味着如果 PHP 允许函数常量,这样的代码

function test() {}

const test = function () {};

对于 test() 调用是不明确的。

常量和函数可以同名是很奇怪的,在我看来绝对是错误的设计,但它们从第一天就已经存在了,不能删除或者会破坏兼容性。

注意,理论上,引入函数常量可能不会破坏兼容性。 PHP 可以添加一个例外规则,不允许同名函数和const,只有它是一个函数常量(以前没有函数常量,所以不会破坏兼容性)。但这还不够。

需要另一个例外规则
use function A\test;
use const B\test;

如果 B\test 是函数常量。

但是引擎永远不知道B\test是否是一个函数常量,直到B\test的代码是included/autoloaded。推迟命名空间解析到运行时在任何方面都是不可接受的,所以唯一的可能性是抛出运行时异常。但是我们大多数人都将命名空间视为静态功能,永远不会想到这样的运行时异常。

所以我认为 PHP 永远不允许函数常量。