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.
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
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::
.
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);
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
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.
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