Получить значение динамически выбранной константы класса в PHP
Я хотел бы иметь возможность сделать что-то вроде этого:
class ThingIDs
{
const Something = 1;
const AnotherThing = 2;
}
$thing = 'Something';
$id = ThingIDs::$thing;
Это не сработает. Есть ли простой способ сделать что-то эквивалентное? Обратите внимание, что я застрял с классом; это в библиотеке, которую я не могу переписать. Я пишу код, который принимает аргументы в командной строке, и я бы действительно нравится принимать символические имена вместо идентификационных номеров.
6 ответов:
Если вы используете пространства имен, вы должны включить пространство имен с классом.
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');
вспомогательную функцию
вы можете использовать такую функцию:
function class_constant($class, $constant) { if ( ! is_string($class)) { $class = get_class($class); } return constant($class . '::' . $constant); }
Она принимает два аргумента:
- имя класса или экземпляра объекта
- имя константы класса
если передается экземпляр объекта, выводится его имя класса. Если вы используете PHP 7, вы можете использовать
::class
чтобы передать соответствующее имя класса без необходимости думать о пространствах имен.примеры
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'