为什么PHP中不允许使用此代码?
const VALIDATOR = array(
'field' => array(
'type' => 'string',
'custom' => function() {
return true;
}));
甚至这个更简单的版本?
const MY_FUN = function($param) {
echo $param;
};
抛出unexpected T_FUNCTION
错误。
答案 0 :(得分:9)
因为它必须是常量值,因为你定义了一个常量!因此,您不能将“动态”值分配给常量,否则它将不会是常量。
您还可以在manual:
中阅读/查看此内容在PHP 5.6之前的常量中只能包含标量数据(布尔,整数,浮点数和字符串)。从PHP 5.6开始,可能将常量定义为标量表达式,并且还可以定义数组常量。可以将常量定义为资源,但应该避免,因为它可能会导致意外结果。
答案 1 :(得分:2)
其他答案仅复制手册。我将尝试解释函数常量思想的真正问题。
PHP无法引入函数常量,即使函数的行为可以在编译时确定。这是因为PHP允许函数和const具有SAME名称,这意味着如果PHP允许函数不变,这样的代码
RecipientList.limit(100).order("recipient_lists.created_at DESC").each do |recipient|
@message = Message.find(recipient.message_id)
@video = Video.find(@message.video_id)
@video_activity = @video.video_activities.where(user_id: recipient.id)
end
对于function test() {}
const test = function () {};
调用,将不明确。
常量和功能可以有相同的名字是非常奇怪的,在我看来肯定是WRONG设计,但它们已经从第一天开始就存在,并且无法删除或者会破坏兼容性。
注意,理论上,引入函数常量可能不会破坏兼容性。 PHP可以添加一个不允许相同名称函数和const的异常规则,只有它是一个函数常量(过去没有函数常量,因此不会破坏兼容性)。但它仍然不够。
需要另一个例外规则test()
如果B \ test是函数常数。
但是引擎永远都不知道B \ test是否是函数常量,直到B \ test的代码被包含/自动加载。推迟命名空间解析到运行时在任何方面都是不可接受的,因此唯一的可能性是抛出运行时异常。但是我们大多数人将名称空间视为静态功能,并且永远不会期望这样的运行时异常。
所以我认为PHP永远不会允许函数不变。
答案 2 :(得分:0)
const
应该是PHP中的标量。
值必须是常量表达式,而不是(例如)变量,属性,数学运算的结果或函数调用。