为什么 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 永远不允许函数常量。
为什么 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 永远不允许函数常量。