Доступ к константе класса с помощью простой переменной, которая содержит имя константы - PullRequest
52 голосов
/ 22 сентября 2011

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

const MY_CONST = "value";

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

$myVar = "MY_CONST";

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

self::$myVar

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

Ответы [ 5 ]

119 голосов
/ 22 сентября 2011

Это можно сделать двумя способами: с помощью функции constant или отражением .

Постоянная функция

Функция константы работает с константами, объявленными через 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
28 голосов
/ 22 сентября 2011

Для этого нет синтаксиса, но вы можете использовать явный поиск:

print constant("classname::$myConst");

Я считаю, что это также работает с self::.

3 голосов
/ 22 сентября 2011

Могу ли я как-нибудь получить доступ к значению 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);
1 голос
/ 22 сентября 2011

вы пробовали

$myVar = MY_CONST or $myVar = $MY_CONST
0 голосов
/ 10 марта 2015

Просто примечание для 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 «Class not found».

...