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

use*_*929 6 php syntax properties class

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

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

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

public $var = array(
    1 => 4,
    2 => 5,
);
Run Code Online (Sandbox Code Playgroud)

这会产生语法错误:

public $var = array(
    1 => 4,
    2 => (4+1),
);
Run Code Online (Sandbox Code Playgroud)

即使这不被接受:

public $var = 4+1;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

sou*_*rge 9

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

class User {
    const IS_ADMIN = 1;
    const IS_MODERATOR1 = 1 << 1; // Won't work
    const IS_MODERATOR2 = 0x02;   // works
}
Run Code Online (Sandbox Code Playgroud)

  • 好吧,至少我知道我并不疯狂.虽然支持非常简单的表达式会很好,但只要文档清楚,我就不介意任何一种方式.而且,他们不是.当我有机会时,我会提交一个错误.谢谢! (2认同)

Jon*_*Jon 8

从PHP 5.6开始,此限制不再存在

启用以前不允许的语法的新功能称为常量标量表达式:

现在可以在上下文中提供涉及数字和字符串文字和/或常量的标量表达式,其中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; ?>
Run Code Online (Sandbox Code Playgroud)

上面的例子将输出:

4 The value of THREE is 3
Run Code Online (Sandbox Code Playgroud)


goa*_*oat 6

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

但是,你是对的,手册中的引用确实说"评估".也许你应该打开一张文件票.


编辑2014年3月

看起来php现在支持php 5.6中的常量标量表达式: