加载一个名称与传递给自动加载器的名称不同的类作为参数

时间:2011-05-28 13:39:06

标签: php namespaces autoload spl-autoload-register

基本上,我有以下问题:我想利用PHP的新命名空间功能。不幸的是,我正在运行一个PHP版本(5.3.2),其中对linux的namespace-autoload-support仍然看起来有些错误并且不起作用(PHP应该能够通过其命名空间自动加载类文件而无需使用自定义自动加载器,但这不起作用。)

我想要实现的是编写一个自动加载器,只要php的命名空间功能正常工作(不使用自定义自动加载器时似乎有速度优势),我就可以简单地删除它,而不得不像以下那样更改代码事后可能。

所以我有这样的电话:

$filereader = new system\libraries\file\XML();

作为字符串“system \ libraries \ file \ XML”正确传递给我的自动加载功能。我可以加载相应的文件“system / libraries / file / XML.class.php”。但是,那里的类将被命名为

class XML { ... }

(或者与“system \ libraries \ file \ XML”不同的东西),因此具有与PHP尝试加载它的名称不同的名称。那么是否有一种简单的方法来加载该类(“XML”),该类的名称与我传递给自动加载器函数的名称不同?我可以在自动加载器中做一些事情来实现这种行为吗? (我正在使用spl_autoload_register)。

我知道即使它成功了,我仍然无法使用命名空间的所有功能,因为(简单的)自动加载器不会尊重“使用命名空间”指令,我仍然需要使用相当长的名称加载一个类。但是,如果我正确理解了PHP的命名空间功能,那么当我稍后切换到使用本机命名空间支持而不是自动加载器时,我可以保留代码。

如果我尝试做的事情在您看来根本没有意义或者我误解了命名空间,请告诉我( - 我还没有使用过PHP的命名空间功能)。

1 个答案:

答案 0 :(得分:3)

我会加载文件(创建XML类),然后将XML类别名为正确命名空间的system\libraries\file\XML类:

class_alias('XML', 'system\libraries\file\XML');

更一般地说:

class_alias(basename($class), $class));

虽然我不太确定class_alias是否可以为命名空间类设置别名......