Acceder a una constante de clase usando una variable simple que contiene el nombre de la constante


Estoy tratando de acceder a una constante de clase en una de mis clases:

const MY_CONST = "value";

Si tengo una variable que contiene el nombre de esta constante como esta:

$myVar = "MY_CONST";

¿Puedo acceder al valor de MY_CONST de alguna manera?

self::$myVar

No funciona obviamente porque es para propiedades estáticas. Variables variables tampoco funciona.

Author: Adam Arold, 2011-09-22

5 answers

Hay dos maneras de hacer esto: usando la función constante o usando reflexión.

Función constante

La función constant trabaja con constantes declaradas a través de define así como con constantes de clase:

class A
{
    const MY_CONST = 'myval';

    static function test()
    {
        $c = 'MY_CONST';
        return constant('self::'. $c);
    }
}

echo A::test(); // output: myval

Clase de reflexión

Una segunda manera, más laboriosa, sería a través de la reflexión:

$ref = new ReflectionClass('A');
$constName = 'MY_CONST';
echo $ref->getConstant($constName); // output: myval
 105
Author: webbiedave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-20 15:39:27

No hay sintaxis para eso, pero puedes usar una búsqueda explícita:

print constant("classname::$myConst");

Creo que también funciona con self::.

 25
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-21 21:03:14

¿Puedo acceder al valor de MY_CONST de alguna manera?

self::MY_CONST

Si desea acceder es dinámicamente, puede usar la API de reflexión Docs:

$myvar = 'MY_CONST';
$class = new ReflectionClass(self);
$const = $class->getConstant($myVar);

El beneficio con la API de reflexión puede ser que puede obtener todas las constantes a la vez (getConstants).

Si no te gusta la API de reflexión porque no quieres usarla, una alternativa es la función constant (Demo):

$myvar = 'MY_CONST';    
class foo {const MY_CONST = 'bar';}    
define('self', 'foo');    
echo constant(self.'::'.$myvar);
 3
Author: hakre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-21 21:16:01

¿has probado

$myVar = MY_CONST or $myVar = $MY_CONST
 1
Author: shawrie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-17 06:23:39

Solo una nota para la Reflexión: el constructor para ReflectionClass debe recibir la ruta completa de la clase para su parámetro. Esto significa que simplemente establecer la cadena ' A ' como un parámetro constructor puede no funcionar en algunos casos.

Para evitar este problema, al usar ReflectionClass, será mejor si hace esto:

$classA = new A();
$name_classA = get_class($classA);
$ref = new ReflectionClass(get_class($name_classA));
$constName = 'MY_CONST';
echo $ref->getConstant($constName);

La función get_class te dará la ruta completa de una clase siempre que estés en el código. Perder la ruta completa puede resultar en una " Clase no encontrada" Error de PHP.

 0
Author: Fabiano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-09 23:29:21