请考虑以下代码:
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)
这是故意还是错误?
我认为这是因为他们改写了有关评估的内容.
喜欢以下在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建议引入内部一致且完整的变量语法.为了实现这个目标,需要改变一些很少使用的变量结构的语义.
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)