Desde el shell interactivo PHP:
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
La razón por la que la sintaxis anterior falla es que el intérprete PHP no sabe cómo resolver el doble de colon después de la referencia de la propiedad. Si esto es intencional o no es desconocido.
Este último sintaxis funciona porque no está pasando por la propiedad directamente, sino a través de una variable local, que el analizador acepta como algo que puede trabajar con:
php > $inst = $b->foo;
php > echo $inst::A;
a!
(Por cierto, esta misma restricción está en su lugar para funciones anónimas como propiedades. No puedes llamarlas directamente usando parens, primero debes asignarlas a otra variable y luego llamarlas desde allí. Esto se ha corregido en el tronco de PHP, pero no sé si también arreglaron la sintaxis de dos puntos).
'$ inst :: someconstant' es válido * * sintaxis, pero es lo que realmente funciona? – deceze
En mis pruebas lo hace. – pettazz