PHP三元运算符不解析类属性?

时间:2014-07-01 20:24:36

标签: php

我试图弄清楚为什么类中的三元运算符不会解析。我认为一个例子是展示这一点的最明确的方式。

这很好用:

$a = array(
    'a' => 'foo',
    'b' => 1 ? 'true' : 'false',
    'c' => 'baz',
);
print_r($a);

/* Array
   (
       [a] => foo
       [b] => true
       [c] => baz
    )
 */

但这甚至无法解析:

<?php

class Junk {
    private static $a = array(
        'a' => 'foo',
        'b' => 1 ? 'true' : 'false',
        'c' => 'baz',
    );

    public static function printA() {
        print_r(self::$a);
    }
}

Junk::printA();

我收到以下消息:

PHP Parse error:  syntax error, unexpected '?', expecting ')' in junk.php on line 6

对于记录,它在数组声明之外也不起作用:

private static $a = 1 ? 'true' : 'false';

给出了相同的错误消息。

为什么这不起作用?它只是解析引擎中的一些奇怪的错误吗?我完全不知所措。 manual on ternary operators表示运算符是一个表达式,它应始终在数组赋值的右侧。我在PHP 5.4.28上,如果这有任何区别。

1 个答案:

答案 0 :(得分:3)

类属性必须是常量表达式。

  

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

http://www.php.net/manual/en/language.oop5.properties.php