带别名的动态命名空间类

时间:2013-08-19 16:24:34

标签: php namespaces

SO,

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

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版本。

1 个答案:

答案 0 :(得分:5)

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

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

the manual

中也描述了此行为
  

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