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

时间:2010-04-24 01:41:12

标签: php class syntax properties

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

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

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

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

这会产生语法错误:

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

即使这不被接受:

public $var = 4+1;

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

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

那么这里发生了什么?限制是否真的沿着“根本不能是任​​何计算表达式”,而不是任何“能够在编译时评估”的表达式?在文档的语言中使用“已评估”表明允许进行简单的计算,但唉......

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

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:7)

自PHP 5.6

起,此限制不再存在

启用以前不允许的语法的新功能称为constant scalar expressions

  

现在可以提供涉及数字的标量表达式   PHP之前的上下文中的字符串文字和/或常量   期望一个静态值,例如常量和属性声明   和默认函数参数。

class C {
    const THREE = TWO + 1;
    const ONE_THIRD = ONE / self::THREE;
    const SENTENCE = 'The value of THREE is '.self::THREE;

    public function f($a = ONE + self::THREE) {
        return $a;
    }
}

echo (new C)->f()."\n"; echo C::SENTENCE; ?>
     

以上示例将输出:

4 The value of THREE is 3

答案 2 :(得分:6)

在你为此举起手臂之前,请考虑一下执行模型。在php通常用于(实际上是为其设计)的环境中,所有内容都会被构建,执行,然后被丢弃......直到下一个http请求进入。它没有多大意义在解析/编译阶段浪费时间进行计算。在一般情况下,引擎需要非常迅速。

但是,你是对的,手册中的引用确实说“评价”。也许你应该打开一张文件票。


2014年3月编辑

看起来php现在支持php 5.6中的Constant Scalar Expressions