78 votes

Accéder à une constante de classe en utilisant une simple variable qui contient le nom de la constante.

Je tente d'accéder à une constante de classe dans l'une de mes classes :

const MY_CONST = "valeur";

Si j'ai une variable qui contient le nom de cette constante comme ceci :

$myVar = "MY_CONST";

Puis-je accéder d'une manière ou d'une autre à la valeur de MY_CONST ?

self::$myVar

Cela ne fonctionne pas évidemment car c'est pour les propriétés statiques. Aussi, les variables variables ne fonctionnent pas non plus.

161voto

webbiedave Points 28781

Il existe deux façons de le faire: en utilisant la fonction constante ou en utilisant réflexion.

Fonction Constante

La fonction constante fonctionne avec les constantes déclarées avec définir 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(); // sortie: myval

Classe Reflection

Une deuxième façon, plus laborieuse, serait à travers la réflexion:

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

37voto

mario Points 76989

Il n'y a pas de syntaxe pour cela, mais vous pouvez utiliser une recherche explicite :

print constant("nomDeLaClasse::$maConst");

Je crois que cela fonctionne aussi avec self::.

2 votes

Utiliser "print" m'a perturbé pendant une seconde car ce n'est pas vraiment une partie de la solution, mais ouais, utiliser la fonction constant() semble être la meilleure façon de le faire.

2 votes

Il semble nécessaire de spécifier l'espace de noms de la classe si la classe se trouve sur un chemin différent.

3voto

hakre Points 102271

Puis-je accéder à la valeur de MY_CONST d'une manière ou d'une autre?

self::MY_CONST

Si vous voulez y accéder de manière dynamique, vous pouvez utiliser l'API de réflexion Docs:

$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 en une seule 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);

2voto

Fabiano Points 656

Juste une note pour la réflexion : le constructeur de ReflectionClass doit recevoir le chemin complet de la classe pour son paramètre. Cela signifie que définir simplement la chaîne 'A' en tant que paramètre du constructeur peut ne pas fonctionner dans certains cas.

Pour éviter ce problème, lors de l'utilisation de ReflectionClass, il sera préférable de faire ceci :

$classeA = new A();
$nom_classeA = get_class($classeA);
$ref = new ReflectionClass(get_class($nom_classeA));
$nomConst = 'MA_CONSTANTE';
echo $ref->getConstant($nomConst);

La fonction get_class vous donnera le chemin complet d'une classe à chaque fois que vous êtes dans le code. Le fait de manquer le chemin complet peut entraîner une erreur PHP "Classe non trouvée".

1voto

shawrie Points 75

As-tu essayé

$myVar = MY_CONST ou $myVar = $MY_CONST

0 votes

Je ne sais pas quelle constante j'accéderai. Le nom d'une constante est évalué au moment de l'exécution et placé dans $myVar. Ainsi cela ne fonctionnera pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X