J'essaie d'accéder à une constante de classe dans l'une de mes classes:
const MY_CONST = "value";
Si j'ai une variable qui contient le nom de cette constante comme ceci:
$myVar = "MY_CONST";
Puis-je accéder à la valeur de MY_CONST d'une manière ou d'une autre?
self::$myVar
ne fonctionne évidemment pas car il s'agit de propriétés statiques. Les variables variables ne fonctionnent pas non plus.
Il y a deux façons de procéder: en utilisant la fonction constante ou en utilisant réflexion .
La fonction constante fonctionne avec les constantes déclarées via define
ainsi que les constantes de classe:
class A
{
const MY_CONST = 'myval';
static function test()
{
$c = 'MY_CONST';
return constant('self::'. $c);
}
}
echo A::test(); // output: myval
Une deuxième voie, plus laborieuse, serait la réflexion:
$ref = new ReflectionClass('A');
$constName = 'MY_CONST';
echo $ref->getConstant($constName); // output: myval
Il n'y a pas de syntaxe pour cela, mais vous pouvez utiliser une recherche explicite:
print constant("classname::$myConst");
Je pense que cela fonctionne aussi avec self::
.
Puis-je accéder à la valeur de MY_CONST d'une manière ou d'une autre?
self::MY_CONST
Si vous souhaitez accéder de manière dynamique, vous pouvez utiliser l'API réflexion Documents :
$myvar = 'MY_CONST';
$class = new ReflectionClass(self);
$const = $class->getConstant($myVar);
L'avantage de l'API de réflexion peut être que vous pouvez obtenir toutes les constantes à la fois (getConstants
).
Si vous n'aimez pas l'API de réflexion parce que vous ne voulez pas l'utiliser, une alternative est la fonction constant
( Demo ):
$myvar = 'MY_CONST';
class foo {const MY_CONST = 'bar';}
define('self', 'foo');
echo constant(self.'::'.$myvar);
as-tu essayé
$myVar = MY_CONST or $myVar = $MY_CONST
Juste une note pour Reflection: le constructeur de ReflectionClass doit recevoir le chemin complet de la classe pour son paramètre. Cela signifie que le simple fait de définir la chaîne "A" comme paramètre constructeur peut ne pas fonctionner dans certains cas.
Pour éviter ce problème, lors de l'utilisation de ReflectionClass, vous serez mieux si vous faites ceci:
$classA = new A();
$name_classA = get_class($classA);
$ref = new ReflectionClass(get_class($name_classA));
$constName = 'MY_CONST';
echo $ref->getConstant($constName);
La fonction get_class vous donnera le chemin complet d'une classe chaque fois que vous êtes dans le code. Manquer le chemin complet peut entraîner une "classe non trouvée" PHP.