Php 通过变量进行命名空间实例化

Php 通过变量进行命名空间实例化,php,Php,为什么这不能像预期的那样工作 我使用变量的原因是b/c“someClass”事先不知道 代码如下所示: 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”事先不知道

代码如下所示:

namespace user;
use robot\r;

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

$namespace = '\robot\r\someClass';
$class = new $namespace();  // does work
这很容易解决,但我不明白为什么:

$class=new r\someClass()
将起作用 而
$class=new$namespace()
将不起作用。

更新:

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

因此,以下方法将起作用:

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

$class = new $namespace();
注意:前导斜杠不是必需的,因为在动态类名、函数名或常量名中,限定名和完全限定名之间没有区别

更新:

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

因此,以下方法将起作用:

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

$class = new $namespace();
注意:前导斜杠不是必需的,因为在动态类名、函数名或常量名中,限定名和完全限定名之间没有区别


应该能够使用@xdazz answer,但您也可以为名称空间别名。它失败的原因是您必须使用完全质量的命名空间路径

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();
没有

use robot\r as r;

$classname = 'r\someClass';

您以后必须完全限定路径。

应该能够使用@xdazz answer,但您也可以为名称空间别名。它失败的原因是您必须使用完全质量的命名空间路径

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();
没有

use robot\r as r;

$classname = 'r\someClass';

部分您必须稍后对路径进行完全限定。

几分钟前我偶然发现了相同的问题-应该早点查看这里:) 不幸的是,我还不能评论,所以这里有一个小小的提示,当类与当前名称空间相关时,您也可以使用
\uuuuuu名称空间\uuuuu
常量,而不是重新键入整个限定名称空间

就我而言,我有一个小工厂方法:

 as r

几分钟前,我偶然发现了同样的问题——我应该早点看看这里:) 不幸的是,我还不能评论,所以这里有一个小小的提示,当类与当前名称空间相关时,您也可以使用
\uuuuuu名称空间\uuuuu
常量,而不是重新键入整个限定名称空间

就我而言,我有一个小工厂方法:

 as r

或使用robot\r作为r;然后r\someClass$class=new r\someClass()将起作用,而无需向use关键字添加someClass@Rottingham,我相信robot\r作为r是隐含的。@JasonM是从什么或哪里隐含的?当您只指定robot\r->时,它意味着robot\r作为r。我必须仔细检查手册,但它会解释新的r\someClass()将起作用。只是当我尝试将其用作变量时,它才失败。@rottingham(手册中)://这与使用My\Full\NSname作为NSname使用My\Full\NSname相同;或使用robot\r作为r;然后r\someClass$class=new r\someClass()将起作用,而无需向use关键字添加someClass@Rottingham,我相信robot\r作为r是隐含的。@JasonM是从什么或哪里隐含的?当您只指定robot\r->时,它意味着robot\r作为r。我必须仔细检查手册,但它会解释新的r\someClass()将起作用。只是当我尝试将其用作变量时,它才失败。@rottingham(手册中)://这与使用My\Full\NSname作为NSname使用My\Full\NSname相同;谢谢你,迈克尔。是否有一个空格太短;-)谢谢你,迈克尔。是否有一个空格太短;-)