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

2022-08-30 12:01:00

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

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

我有一个用户类型的对象模型,其名称在全局范围内定义,但我在 Editor 命名空间中为用户的编辑器提供了另一个具有相同名称的对象。由于某种原因,PHP不允许我进行命名空间的动态调用,如下所示。

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

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

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

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

是否有原因两者的行为不同,或者由于这是一项新功能,因此尚未在此庄园中实现对命名空间的动态调用?有没有另一种方法可以从另一个命名空间动态调用类,而无需将其名称显式放在代码中,而是从变量中?


答案 1

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

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

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

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

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


答案 2

推荐