125 votes

Obtenir la valeur d'une constante de classe choisie dynamiquement en PHP

J'aimerais pouvoir faire quelque chose comme ça :

class ThingIDs
{
    const Something = 1;
    const AnotherThing = 2;
}

$thing = 'Something';
$id = ThingIDs::$thing;

Ça ne marche pas. Existe-t-il un moyen direct de faire quelque chose d'équivalent ? Notez que je suis coincé avec la classe ; elle se trouve dans une bibliothèque que je ne peux pas réécrire. J'écris du code qui prend des arguments sur la ligne de commande, et je voudrais realmente j'aimerais qu'il prenne des noms symboliques au lieu de numéros d'identification.

0 votes

Pouvez-vous essayer ThingIDs::{$thing} ?

0 votes

Déjà essayé. J'obtiens une erreur d'analyse au lieu d'une erreur d'exécution fatale.

205voto

Dan Simon Points 5408

Utilisez le constant() fonction :

$id = constant("ThingIDs::$thing");

1 votes

Remarque : si vous voulez d'abord vérifier si la constante est définie ou non, c'est defined("ThingIDs::$thing");

3 votes

Ou $id = constant("self::$thing") ;

5 votes

Similaire à ceci, $id = constant(sprintf('%s::%s', ThingIDs::class, $thing));

30voto

Phil Points 48960

Utiliser la réflexion

$r = new ReflectionClass('ThingIDs');
$id = $r->getConstant($thing);

3 votes

Les réflexions permettent vraiment de comprendre les classes, les méthodes et bien d'autres choses encore, et il semble que beaucoup de gens aient peur de faire le pas pour les comprendre. Excellente réponse.

2 votes

@mikemackintosh J'ai pris des mesures pour les comprendre, mais je n'ai pas vu beaucoup en termes d'impact sur les performances par rapport à la réponse acceptée. C'est quelque chose que j'aimerais savoir. L'instanciation d'une nouvelle classe semble avoir un impact plus important sur les performances que le simple appel statique d'une constante. Qu'en pensez-vous ?

15voto

Jordi Kroon Points 1138

Si vous utilisez des espaces de noms, vous devez inclure l'espace de noms avec la classe.

echo constant('My\Application\ThingClass::ThingConstant');

3voto

Josh Points 8217
<?php

class Dude {
    const TEST = 'howdy';
}

function symbol_to_value($symbol, $class){
    $refl = new ReflectionClass($class);
    $enum = $refl->getConstants();
    return isset($enum[$symbol])?$enum[$symbol]:false;
}

// print 'howdy'
echo symbol_to_value('TEST', 'Dude');

-1voto

David Rodrigues Points 2448

Vous pouvez essayer de jeter un coup d'œil à cette réponse :

Accès à une variable statique par $var::$reference

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