3

所以,

我在使用命名空间创建动态对象时遇到问题。这是命名空间代码:

namespace Foo
{
   class Bar
   {
   }
}

现在,我正在尝试使用以下方法创建类对象Bar

include('namespace.php');
$sName  = 'Bar';
$sClass = '\\Foo\\'.$sName;
$rObj   = new $sClass; //correct object

一切顺利。但是,现在我想使用别名并执行以下操作:

include('namespace.php');
use Foo as Baz;
$sName  = 'Bar';
$sClass0= '\\Foo\\'.$sName;
$sClass1= '\\Baz\\'.$sName;
$rObj   = new $sClass0; //correct object
$rObj   = new $sClass1; //Fatal error

而且我无法以这种方式实例化对象(并且通过全名访问仍然可以正常工作)。所以,我的问题是 - 是否可以通过别名以某种方式访问​​该类,如果可以,如何访问?我也尝试在使用时访问$sClass1='Baz\\'.$sName- 没有成功。另外,我通过get_declared_classes()函数检查了声明的类,它表明我只有\Foo\Bar类(没有引用别名)。

我不确定这是否重要,但我使用的是 PHP 5.5 版本。

4

1 回答 1

6

只有解析器使用您的命名空间别名来规范化每个文件中的类引用。

换句话说,它没有引入其他代码可以使用的某种全局别名。解析脚本后,不再使用别名。

手册中也描述了这种行为:

导入是在编译时执行的,因此不会影响动态类、函数或常量名称。

于 2013-08-20T07:15:13.243 回答