Я пытаюсь получить доступ к константе класса в одном из моих классов:
const MY_CONST = "value";
Если у меня есть переменная, которая содержит имя этой константы, например:
$myVar = "MY_CONST";
Можно ли каким-либо образом получить доступ к значению MY_CONST?
self::$myVar
не работает явно, потому что это для статических свойств. Переменные переменные также не работают.
Существует два способа сделать это: использовать постоянную функцию или использовать отражение .
Постоянная функция работает с константами, объявленными через define
а также константами класса:
class A { const MY_CONST = 'myval'; static function test() { $c = 'MY_CONST'; return constant('self::'. $c); } } echo A::test(); // output: myval
Второй, более кропотливый путь – через размышление:
$ref = new ReflectionClass('A'); $constName = 'MY_CONST'; echo $ref->getConstant($constName); // output: myval
Для этого нет синтаксиса, но вы можете использовать явный поиск:
print constant("classname::$myConst");
Я считаю, что он также работает с self::
.
Можно ли каким-либо образом получить доступ к значению MY_CONST?
self::MY_CONST
Если вы хотите получить доступ, это динамически, вы можете использовать документы API отражения :
$myvar = 'MY_CONST'; $class = new ReflectionClass(self); $const = $class->getConstant($myVar);
Выгода от API отражения может заключаться в том, что вы можете получить все константы сразу ( getConstants
).
Если вам не нравится API отражения, потому что вы не хотите его использовать, альтернативой является constant
функция ( Demo ):
$myvar = 'MY_CONST'; class foo {const MY_CONST = 'bar';} define('self', 'foo'); echo constant(self.'::'.$myvar);
ты пробовал
$myVar = MY_CONST or $myVar = $MY_CONST
Просто примечание для Reflection: конструктор для ReflectionClass должен получить полный путь класса для его параметра. Это означает, что просто установка строки «A» в качестве параметра конструктора может не работать в некоторых случаях.
Чтобы избежать этой проблемы, при использовании ReflectionClass вам будет лучше, если вы это сделаете:
$classA = new A(); $name_classA = get_class($classA); $ref = new ReflectionClass(get_class($name_classA)); $constName = 'MY_CONST'; echo $ref->getConstant($constName);
Функция get_class даст вам полный путь к классу всякий раз, когда вы находитесь в коде. Отсутствие полного пути может привести к ошибке PHP, не найденной.