Подтвердить что ты не робот

Доступ к константе класса с использованием простой переменной, которая содержит имя константы

Я пытаюсь получить доступ к константе класса в одном из моих классов:

const MY_CONST = "value";

Если у меня есть переменная, которая содержит имя этой константы, как это:

$myVar = "MY_CONST";

Можно ли каким-либо образом получить доступ к значению MY_CONST?

self::$myVar

не работает явно, потому что это для статических свойств. Переменные переменные также не работают.

4b9b3361

Ответ 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, не найденной.