【问题标题】:PHP ternary operator doesn't parse inside class property?PHP三元运算符不解析内部类属性?
【发布时间】:2014-07-01 20:24:36
【问题描述】:

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

这很好用:

$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,如果这有什么不同的话。

【问题讨论】:

    标签: php


    【解决方案1】:

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

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

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

    【讨论】:

    • 还不错;这只是一个非常无用的错误消息。是否有任何地方可以准确定义常量值是什么?我知道它“必须不依赖于运行时信息”,但它是在哪里定义的? static $a = 1; 有效,但 static $a = (1) 无效。同样,我的原始代码将始终评估为“真”(其他语言的编译器能够解决这个问题,但我猜 PHP 不会)。
    猜你喜欢
    • 2020-10-30
    • 2011-09-10
    • 2016-07-18
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多