web-dev-qa-db-fra.com

Accéder à une constante de classe à l'aide d'une simple variable qui contient le nom de la constante

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.

53
Adam Arold

Il y a deux façons de procéder: en utilisant la fonction constante ou en utilisant réflexion .

Fonction constante

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

Classe de réflexion

Une deuxième voie, plus laborieuse, serait la réflexion:

$ref = new ReflectionClass('A');
$constName = 'MY_CONST';
echo $ref->getConstant($constName); // output: myval
122
webbiedave

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

29
mario

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);
3
hakre

as-tu essayé

$myVar = MY_CONST or $myVar = $MY_CONST
1
shawrie

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.

0
Fabiano