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

我想在我的一个类中访问类常量:

const MY_CONST = "value"; 

如果我有一个variables,它包含这个常量的名字,如下所示:

 $myVar = "MY_CONST"; 

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

 self::$myVar 

不明显,因为它是静态属性。 variablesvariables也不起作用。

有两种方法可以做到这一点:使用常量函数或使用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 

没有这个语法,但你可以使用一个明确的查找:

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

我相信它也适用于self::

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

 self::MY_CONST 

如果要dynamic访问,则可以使用reflectionAPI Docs

 $myvar = 'MY_CONST'; $class = new ReflectionClass(self); $const = $class->getConstant($myVar); 

reflectionAPI的好处是可以一次获得所有的常量( getConstants )。

如果你不喜欢reflectionAPI,因为你不想使用它,另一种方法是constant函数( Demo ):

 $myvar = 'MY_CONST'; class foo {const MY_CONST = 'bar';} define('self', 'foo'); echo constant(self.'::'.$myvar); 

你有没有尝试过

 $myVar = MY_CONST or $myVar = $MY_CONST 

只需要注意Reflection:ReflectionClass的构造函数必须为其参数接收类的完整path 。 这意味着在某些情况下,将string“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将给你一个类的完整path,只要你在代码中。 缺less完整path可能会导致“未find类”PHP错误。

 A class { const MY_CONST = 'hello world'; echo self::MY_CONST; } echo A::MY_CONST;