无法使用命名空间从动态类获取常量

时间:2011-10-05 14:51:55

标签: php oop namespaces constants

我无法从使用字符串变量和PHP 5.3定义的类中获取常量。命名空间。例如:

use \Some\Foo\Bar;

$class = 'Bar';
echo $class::LOCATION;

其中LOCATION是一个正确定义的常量。我得到的错误说类Bar是未定义的。

如果我改为

$class = "\Some\Foo\Bar";
一切正常。

有没有让第一个例子有效?

1 个答案:

答案 0 :(得分:4)

使用$class::CONST获取类常量,$class必须包含独立于当前名称空间的完全限定类名。

use语句对此没有帮助,即使您在命名空间\Some\Foo中,以下操作也无效:

namespace \Some\Foo;

$class = 'Bar';
echo $class::LOCATION;

正如您在问题中所写,您已通过提供完全限定的类名找到了“解决方案”:

use \Some\Foo\Bar;

$class = "\Some\Foo\Bar";
echo $class::LOCATION;

但是,你不喜欢这个。我不知道你的具体问题,但一般看起来很好。如果要在当前命名空间中解析Bar的完全限定类名,可以实例化其对象并访问常量:

use \Some\Foo\Bar;

$class = new Bar;
echo $class::LOCATION;

在这个阶段,您甚至不需要关心自己的名称空间。

但是,如果由于某种原因需要在全局命名空间中有一个名为Bar的类,则可以使用class_alias使其工作。用它代替use \Some\Foo\Bar以获得您想要的行为:

class_alias('\Some\Foo\Bar', 'Bar');

$class = 'Bar';
echo $class::LOCATION;

但无论如何,我可能不会得到你的问题,因为你已经拥有的解决方案对我来说很好。也许你可以写出你的具体问题。