it-swarm.cn

使用包含常量名称的简单变量访问类常量

我正试图在我的一个类中访问一个类常量:

const MY_CONST = "value";

如果我有一个变量,其中包含此常量的名称,如下所示:

$myVar = "MY_CONST";

我可以以某种方式访问​​MY_CONST的值吗?

self::$myVar

显然不起作用,因为它是静态属性。变量变量也不起作用。

51
Adam Arold

有两种方法可以做到这一点:使用 constant function或使用 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
118
webbiedave

没有语法,但您可以使用显式查找:

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

我相信它也适用于self::

28
mario

我可以以某种方式访问​​MY_CONST的值吗?

self::MY_CONST

如果要动态访问,可以使用 reflection 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);
3
hakre

你有没有尝试过

$myVar = MY_CONST or $myVar = $MY_CONST
1
shawrie

只是反射的注释: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错误。

0
Fabiano