带有动态类名的PHP命名空间

时间:2010-12-22 20:22:43

标签: php namespaces

在使用PHP 5.3使用新的命名空间类功能时,想知道是否有其他人遇到过这个问题。

我正在使用一个单独的类生成一个动态类调用,用于在我的应用程序中定义用户类型。基本上类定义器采用类型的整数表示并解释它们,返回包含要被调用的类名的字符串作为该用户的模型。

我有一个用户类型的对象模型,在全局范围内定义了该名称,但是我在Editor命名空间中为用户编辑器创建了另一个具有相同名称的对象。出于某种原因,PHP不允许我按如下方式进行命名空间动态调用。

$definition = Definer::defineProfile($_SESSION['user']->UserType);
new \Editor\$definition();

相同的语法适用于在全局命名空间中调用全局基本对象模型,并且我在整个应用程序中以可靠的方式使用它。

$definition = Definer::defineProfile($_SESSION['user']->UserType);
new $definition();

这将正确调用动态所需的类。

有没有理由说这两个会有不同的行为,或者在这个庄园中没有实现动态调用命名空间,因为这是一个新功能?是否有另一种方法可以从另一个命名空间动态调用一个类,而无需在代码中明确地将其名称放在一个变量中?

1 个答案:

答案 0 :(得分:71)

好吧,只需拼出字符串中的命名空间:

$definition = Definer::defineProfile($_SESSION['user']->UserType);
$class = '\\Editor\\' . $definition;
$foo = new $class();

如果它是子命名空间(如注释中所示),只需在命名空间前加上__NAMESPACE__

$class = __NAMESPACE__ . '\\Editor\\' . $definition;

因此,如果当前名称空间为\Foo\Bar,而$definition为“Baz”,则生成的类将为\Foo\Bar\Editor\Baz