Доступ к константе класса с использованием простой переменной, которая содержит имя константы
Я пытаюсь получить доступ к константе класса в одном из моих классов:
const MY_CONST = "value";
Если у меня есть переменная, которая содержит имя этой константы, как это:
$myVar = "MY_CONST";
Можно ли каким-либо образом получить доступ к значению MY_CONST?
self::$myVar
не работает явно, потому что это для статических свойств.
Переменные переменные также не работают.
Ответы
Ответ 1
Есть два способа сделать это: используя функцию constant или используя reflection.
Постоянная функция
Постоянная функция работает с константами, объявленными через 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
Ответ 2
Для этого нет синтаксиса, но вы можете использовать явный поиск:
print constant("classname::$myConst");
Я считаю, что он также работает с self::
.
Ответ 3
Можно ли каким-либо образом получить доступ к значению MY_CONST?
self::MY_CONST
Если вы хотите получить доступ динамически, вы можете использовать отражение API Docs:
$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);
Ответ 4
Вы пробовали
$myVar = MY_CONST or $myVar = $MY_CONST
Ответ 5
Просто примечание для 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, не найденной.