一尘不染

使用简单表达式初始化PHP类属性声明会产生语法错误

php

根据PHP文档,可以在具有以下限制的类中初始化属性:

“此声明可以包括一个初始化,但是此初始化必须是一个常量值,也就是说,它必须能够在编译时进行评估,并且必须不依赖于运行时信息才能进行评估。”

我正在尝试初始化数组并遇到一些问题。虽然这很好用:

public $var = array(
    1 => 4,
    2 => 5,
);

这会产生语法错误:

public $var = array(
    1 => 4,
    2 => (4+1),
);

甚至不被接受:

public $var = 4+1;

这表明它不是array()语言构造的限制。

现在,我最后一次检查时,“ 4 + 1”等于一个常数值,不仅应该接受它,而且实际上应该对其进行优化。无论如何,它肯定可以在编译时进行评估。

那么这是怎么回事?相对于“可以在编译时求值”的任何表达式而言,限制是否真的遵循“根本不能有任何计算出的表达式”的思路?在文档语言中使用“求值”表示允许进行简单的计算,但是a。

如果这是PHP中的错误,是否有人有错误ID?我试图找到一个,但是没有任何运气。


阅读 212

收藏
2020-05-26

共1个答案

一尘不染

PHP在编译时不执行此类操作;即使所有运算符本身都是常量,也不能将计算值分配给常量。类成员的默认值的处理方式完全相同。我在尝试将2的幂分配给常量时遇到了这种现象:

class User {
    const IS_ADMIN = 1;
    const IS_MODERATOR1 = 1 << 1; // Won't work
    const IS_MODERATOR2 = 0x02;   // works
}
2020-05-26