web-dev-qa-db-fra.com

Obtenir la valeur de la constante de classe choisie dynamiquement dans 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 simple de faire quelque chose d’équivalent? Notez que je suis coincé avec la classe; c'est 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 bien que {vraiment} prenne des noms symboliques au lieu de numéros d'identification.

93
Ben

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

http://php.net/manual/en/function.constant.php

171
Dan Simon

Utilisez la réflexion

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

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

echo constant('My\Application\ThingClass::ThingConstant'); 
11
Jordi Kroon
<?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');
2
Josh

Fonction d'assistance

Vous pouvez utiliser une fonction comme celle-ci:

function class_constant($class, $constant)
{
    if ( ! is_string($class)) {
        $class = get_class($class);
    }

    return constant($class . '::' . $constant);
}

Il faut deux arguments:

  • Nom de classe ou instance d'objet
  • Nom de classe constant

Si une instance d'objet est transmise, son nom de classe est déduit. Si vous utilisez PHP 7, vous pouvez utiliser ::class pour passer le nom de classe approprié sans avoir à penser aux espaces de noms.

Exemples

class MyClass
{
    const MY_CONSTANT = 'value';
}

class_constant('MyClass', 'MY_CONSTANT'); # 'value'
class_constant(MyClass::class, 'MY_CONSTANT'); # 'value' (PHP 7 only)

$myInstance = new MyClass;
class_constant($myInstance, 'MY_CONSTANT'); # 'value'
2
Glutexo

Si vous avez une référence à la classe elle-même, vous pouvez procéder comme suit:

if (defined(get_class($course). '::COURSES_PER_INSTANCE')) {
   // class constant is defined
}
0
crmpicco