Accediendo a constantes de clase PHP

El manual de PHP dice

Al igual que los miembros estáticos, no se puede acceder a los valores constantes desde una instancia del objeto.

lo que explica por qué no puedes hacer esto

$this->inst = new Classname(); echo $this->inst::someconstant; 

pero entonces, ¿por qué funciona esto?

 $this->inst = new Classname(); $inst = $this->inst; echo $inst::someconstant; 

Desde el shell interactivo de 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 

El motivo por el que falla la syntax anterior es que el analizador PHP no sabe cómo resolver el doble punto tras la referencia de la propiedad. Si esto es intencional o no es desconocido.

La última syntax funciona porque no está atravesando la propiedad directamente, sino a través de una variable local, que el analizador acepta como algo con lo que puede funcionar:

 php > $inst = $b->foo; php > echo $inst::A; a! 

(Por cierto, esta misma restricción existe para las funciones anónimas como propiedades. No se pueden llamar directamente usando parens, primero se deben asignar 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 syntax doble del colon).

Para citar el manual:

A partir de PHP 5.3.0, es posible hacer referencia a la clase utilizando una variable. El valor de la variable no puede ser una palabra clave (por ejemplo, self, parent y static).

Sigue usando este ejemplo:

 $class = new MyClass(); echo $class::constant."\n"; // As of PHP 5.3.0 

Entonces $inst::someconstant debería funcionar.

En cuanto a por qué $this->inst::someconstant da un error de análisis, no sé. PHP es divertido sobre algunas cosas.

Si estás dentro de la clase, puedes acceder a la constante de esta manera:

 self::MY_CONSTANT; 

Por ejemplo:

 class MyClass { const MY_CONSTANT = 'constant value'; function showConstant() { echo self::MY_CONSTANT; } } 

http://php.net/manual/en/language.oop5.constants.php

php admite acceder a las constantes de clase desde una instancia de objeto. El siguiente código está funcionando (marcado en phpv5.5.5) :

 < ?php class superheroes{ const kal_el = 'Superman'; } $instance = new superheroes; echo $instance::kal_el; 

Fuente: http://dwellupper.io/post/48/defining-class-constants-in-php