我正在尝试访问其中一个类中的类常量:
const MY_CONST = "value";
如果我有一个变量,其中包含此常量的名称,如下所示:
$myVar = "MY_CONST";
我可以以某种方式访问MY_CONST的值吗?
self::$myVar
显然不起作用,因为它适用于静态属性。 变量变量也不起作用。
答案 0 :(得分:118)
有两种方法:使用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
答案 1 :(得分:28)
没有语法,但您可以使用显式查找:
print constant("classname::$myConst");
我相信它也适用于self::
。
答案 2 :(得分:3)
我可以以某种方式访问MY_CONST的值吗?
self::MY_CONST
如果您想动态访问,可以使用reflection 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);
答案 3 :(得分:1)
你试过吗
$myVar = MY_CONST or $myVar = $MY_CONST
答案 4 :(得分:0)
只是反思的注释: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错误。