为什么我可以在php7中使用字符串文字作为类?

sec*_*clu 3 php php-7

请考虑以下代码:

class foo {
    static $bar = 'baz';
}
var_dump('foo'::$bar);
Run Code Online (Sandbox Code Playgroud)

它在PHP5中抛出一个错误(如预期的那样):

解析错误:语法错误,第4[...]中的意外'::'(T_PAAMAYIM_NEKUDOTAYIM)


但它在PHP7和输出中没有问题:

string(3) "baz"
Run Code Online (Sandbox Code Playgroud)

这是故意还是错误?

Dan*_* W. 7

我认为这是因为他们改写了有关评估的内容.

喜欢以下在PHP5中不可能但在PHP 7中:

echo (new X)->toString();
Run Code Online (Sandbox Code Playgroud)

同样的意思

echo ('X')::$bar
Run Code Online (Sandbox Code Playgroud)

请参阅更改间接变量,属性和方法的处理

这主要是关于从左到右的评估,但它也影响评估.

更多信息可以在PHP RFC上找到:统一变量语法(状态:已实现) - 感谢Nikic:

该RFC建议引入内部一致且完整的变量语法.为了实现这个目标,需要改变一些很少使用的变量结构的语义.


Bar*_*mar 5

PHP已经移动多年的总体方向是使用变量变量,变量函数和变量类更加灵活和通用.在PHP5中,当您想要使用变量类时,必须将类名放在变量中:

$class = 'foo';
echo $class::$foo;
Run Code Online (Sandbox Code Playgroud)

它看起来像PHP7使这更通用,允许任何表达式,而不是需要一个变量.例如,你可以写:

$c1 = 'f';
$c2 = 'oo';
echo ($c1 . $c2)::$foo;
Run Code Online (Sandbox Code Playgroud)