Я хотел бы иметь возможность сделать что-то вроде этого:
class ThingIDs { const Something = 1; const AnotherThing = 2; } $thing = 'Something'; $id = ThingIDs::$thing;
Это не работает. Есть ли простой способ сделать что-то эквивалентное? Обратите внимание, что я застрял в классе; это в библиотеке, которую я не могу переписать. Я пишу код, который принимает аргументы в командной строке, и мне бы очень хотелось, чтобы вместо символических имен вместо символьных чисел использовались символические имена.
$id = constant("ThingIDs::$thing");
Использовать отражение
$r = new ReflectionClass('ThingIDs'); $id = $r->getConstant($thing);
Если вы используете пространства имен, вы должны включить пространство имен с классом.
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');
Если у вас есть ссылка на сам класс, вы можете сделать следующее:
if (defined(get_class($course). '::COURSES_PER_INSTANCE')) { // class constant is defined }