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

Dea*_*ado 36 php namespaces

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

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

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

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

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

$definition = Definer::defineProfile($_SESSION['user']->UserType);
new $definition();
Run Code Online (Sandbox Code Playgroud)

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

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

irc*_*ell 75

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

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

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

$class = __NAMESPACE__ . '\\Editor\\' . $definition;
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案很好,但不适用于不完全限定的命名空间 - 即如果原始问题在编辑器之前不想要前导反斜杠(例如,如果他想在当前命名空间中引用子命名空间),然后应用此答案但没有前导反斜杠将无法正确解析命名空间.仍然试图找到一个解决方案,这不涉及我将整个完全限定的名称空间加上类名称作为字符串. (5认同)
  • 工作得很完美.我没有想到只是将其附加到字符串,我得到了一个史诗般的失败.谢谢! (4认同)
  • @Ruddie:我更喜欢总是逃避反斜杠.这样,任何时候你看到双反斜杠,你知道这是一个字面上的反斜杠,任何时候你看到一个单独的反斜杠你知道它正在逃避其他东西...只是我的经验和偏好...... (3认同)