命名空间实例化通过变量

时间:2014-01-03 01:55:45

标签: php

namespace user;
use robot\r;

$namespace = 'r\someClass';
$class = new $namespace();  // does not work

$namespace = '\robot\r\someClass';
$class = new $namespace();  // does work

为什么这不能按预期工作?

我使用变量的原因是b / c“someClass”未提前知道。

所以代码看起来像这样:

if ( $class == 'someClass' )
{
   $namespace = 'r\someClass';
}
elseif ( $class == 'someOtherClass' )
{
   $namespace = 'r\someOtherClass';
}

$class = new $namespace();

这很容易解决,但我不明白为什么:

$class = new r\someClass()会奏效 并且$class = new $namespace()将无效。

3 个答案:

答案 0 :(得分:4)

更新:

使用动态类名时,必须包含命名空间名称。

所以下面的内容可行:

namespace user;
use robot\r; // use is not necessary when you use dynamic class name.

$namespace = 'robot\r\someClass'; // for a dynamic class name, namespace is required.
$class = new $namespace();

请注意,不需要前导斜杠,因为动态类名,函数名或常量名中的限定名和完全限定名之间没有区别。

Check the document here.

答案 1 :(得分:1)

应该能够使用@xdazz答案,但您也可以使用别名命名空间。它失败的原因是你需要完整质量的命名空间路径。

use robot\r as r;

$classname = 'r\someClass';

没有

 as r

部分你必须在以后完全限定路径。

答案 2 :(得分:0)

几分钟前我偶然发现了同样的问题 - 应该在这里看到更早的:) 不幸的是我还没有发表评论所以这里有一个小小的提示,你可以使用__NAMESPACE__常量而不是在你的类相对于当前命名空间时重新输入整个限定命名空间...

在我的情况下,我有一个小工厂方法:

public function getService($name)
{
  $className = __NAMESPACE__ . '\Service\\' . $name;
  return new $className();
}