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

时间:2015-04-24 12:26:36

标签: php oop syntax php-5.3

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

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

甚至这个更简单的版本?

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

抛出unexpected T_FUNCTION错误。

3 个答案:

答案 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中的标量。

  

值必须是常量表达式,而不是(例如)变量,属性,数学运算的结果或函数调用。