【问题标题】:Why PHP doesn't allow anonymous functions inside CONST?为什么 PHP 不允许在 CONST 中使用匿名函数?
【发布时间】:2015-04-24 12:26:36
【问题描述】:

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

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

甚至是这个更简单的版本?

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

抛出unexpected T_FUNCTION 错误。

【问题讨论】:

  • A constant is an identifier (name) for a __simple value__ 数组或匿名函数简单
  • 另一个问题在这里导致,所以我在这里发布一些可以工作的东西(在这里也可以工作) 我得到了:从 8.0.0 再次向你问好,或者从 8.1.0alpha3 再次向你问好

标签: php oop syntax php-5.3


【解决方案1】:

因为它必须是一个常量值,因为你定义了一个常量!因此,您不能将“动态”值分配给常量,否则它不会是常量。

您也可以在manual 中阅读/查看此内容:

只有标量数据(布尔值、整数、浮点数和字符串)可以包含在 PHP 5.6 之前的常量中。从 PHP 5.6 起,可以将常量定义为标量表达式,也可以定义数组常量。可以将常量定义为资源,但应避免使用,因为它会导致意外结果。

【讨论】:

    【解决方案2】:

    其他答案只复制手册。我将尝试解释函数常量思想的真正问题。

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

    function test() {}
    
    const test = function () {};
    

    对于test() 调用将是模棱两可的。

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

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

    use function A\test;
    use const B\test;
    

    如果 B\test 是一个函数常量。

    但是引擎永远不知道 B\test 是否是一个函数常量,直到 B\test 的代码被包含/自动加载。推迟命名空间解析到运行时在任何情况下都是不可接受的,因此唯一的可能性是抛出运行时异常。但我们大多数人将命名空间视为静态特性,绝不会期望出现这种运行时异常。

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

    【讨论】:

      【解决方案3】:

      const 在 PHP 中应该是一个标量。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        • 2010-12-10
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多