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()
将无效。
答案 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();
}