将PHP命名空间别名扩展为完整命名空间字符串

将PHP命名空间别名扩展为完整命名空间字符串,php,namespaces,Php,Namespaces,我想知道是否有一种方法可以扩展一个别名PHP名称空间令牌来获得完整的名称空间标识符。这样做的目的是,我们的对象创建工厂需要一个具有完整名称空间的字符串,以便可以自动加载它。下面是一个简单的例子: <?php use my\namespace\area as MyArea; $goodObject = MyApp::factory('my\namespace\area\ClassName'); $badObject = MyApp::factory('MyArea\ClassName')

我想知道是否有一种方法可以扩展一个别名PHP名称空间令牌来获得完整的名称空间标识符。这样做的目的是,我们的对象创建工厂需要一个具有完整名称空间的字符串,以便可以自动加载它。下面是一个简单的例子:

<?php

use my\namespace\area as MyArea;

$goodObject = MyApp::factory('my\namespace\area\ClassName');
$badObject = MyApp::factory('MyArea\ClassName');

如果有人已经解决了这个问题,我很想听听您是如何解决的。

我不知道如何解析字符串,但对象实例中的类:

use my\namespace\area as MyArea;

$b = new MyArea;
$c = get_class($b);
echo $c; # my\namespace\area

这个问题有点相关:。

因为PHP5.5,所以可以使用
MyArea::class
()


在PHP5.3+中,您可以使用
AliasExpander::expand('MyArea')
()。

直接构造类有点违背工厂的目的;)使用get_class()无法满足我的需要。我需要解析完整名称空间的原因是从我们的各种对象工厂获取这些对象的实例。我认为这不会回答你的问题,所以这不是一个真正的答案,这是我提出的最接近的答案。但是,您不能将字符串传递给具有自己别名的其他命名空间中的函数,然后期望它解析其他命名空间的别名,除非PHP本身提供了我不知道的此类函数,抱歉。我强烈认为PHP中还不存在这样的函数。我想可能有一种方法是通过
ReflectionClass
实现的,不过我也尝试过这种方法,我想通过创建对象的非构造实例并获取其类名,“从技术上”是可以做到的。唯一的问题是,由于命名空间别名在外部上下文中无效,因此无法将代码拆分到外部位置重复使用。这种方法完全错误。它的主要错误是静态的
MyApp::factory()
——全局静态工厂是一个巨大的反模式。更确切地说,实现这一点的唯一方法是使用下面链接的
AliasExpander
实用程序所使用的方法,即从调用的源文件中解析它,我希望您同意这是一种可怕的方法,实际上不用于生产。不可能的原因是,别名在编译时被解析为其完整路径,而信息在运行时被丢弃,而运行时正是您想要访问它的时候。alias expander实用程序使用了一种非常可怕的方法。我不会在生产中使用它,它会比在某些事情上使用反射更糟糕。
use my\namespace\area as MyArea;

$b = new MyArea;
$c = get_class($b);
echo $c; # my\namespace\area