从PHP交互shell:
php > class Foo { const A = 'a!'; }
php > class Bar { public $foo; }
php > $f = new Foo;
php > $b = new Bar;
php > $b->foo = $f;
php > echo $b->foo::A;
PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM, expecting ',' or ';' in php shell code on line 1
前一个语法失败的原因是PHP解析器不知道如何在属性引用之后解析双冒号.这是否是故意的是未知的.
后一种语法的作用是因为它不直接通过属性,而是通过一个局部变量,解析器接受它作为可以使用的东西:
php > $inst = $b->foo;
php > echo $inst::A;
a!
(顺便说一句,匿名函数作为属性也是一样的限制,你不能直接使用括号来调用它们,你必须首先将它们分配给另一个变量,然后从那里调用它们,这已经在PHP的trunk中修复了,但是我不知道他们是否也修复了双冒号语法.)