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.
$id = constant("ThingIDs::$thing");
Utilisez la réflexion
$r = new ReflectionClass('ThingIDs');
$id = $r->getConstant($thing);
Si vous utilisez des espaces de noms, vous devez inclure l'espace de noms avec la classe.
echo constant('My\Application\ThingClass::ThingConstant');
<?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');
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:
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.
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'
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
}