lif*_*foo -1 php oop syntax php-5.3
为什么PHP中不允许使用此代码?
const VALIDATOR = array(
'field' => array(
'type' => 'string',
'custom' => function() {
return true;
}));
Run Code Online (Sandbox Code Playgroud)
甚至这个更简单的版本?
const MY_FUN = function($param) {
echo $param;
};
Run Code Online (Sandbox Code Playgroud)
一个unexpected T_FUNCTION错误被抛出.
其他答案只是复制手册。我将尝试解释函数常数思想的真正问题。
PHP 不能引入函数常量,即使函数的行为可以在编译时确定。这是因为PHP允许函数和const具有相同的名称,这意味着如果PHP允许函数常量,这样的代码
function test() {}
const test = function () {};
Run Code Online (Sandbox Code Playgroud)
对于调用来说将是不明确的test()。
常量和函数可以具有相同的名称是非常奇怪的,在我看来绝对是错误的设计,但它们从第一天起就已经存在,并且不能删除或会破坏兼容性。
注意,理论上,引入函数常量可能不会破坏兼容性。PHP可以添加一个例外规则,不允许同名函数和const,只有当它是函数常量时(过去没有函数常量,所以不会破坏兼容性)。但这还不够。另一个例外规则是需要
use function A\test;
use const B\test;
Run Code Online (Sandbox Code Playgroud)
如果 B\test 是函数常数。
但引擎永远不知道 B\test 是否是函数常量,直到 B\test 的代码被包含/自动加载。推迟命名空间解析到运行时在任何方面都是不可接受的,因此唯一的可能性是抛出运行时异常。但我们大多数人将命名空间视为静态功能,并且永远不会想到这样的运行时异常。
所以我认为PHP永远不会允许函数常量。