我有一个使用自动加载器加载类的系统。我能够编辑自动加载器,但我希望人们能够扩展我的一个类,并使我的系统仍然运行。
假设类A是原来的类B是扩展类A的新类。
我:
A.php
namespace Core;
class A{}
B.php
namespace Core;
class B extends OverriddenA{} ( Explained below )
当自动加载器加载A时-而不是实际加载A,我希望它加载B,这需要加载真正的A。所以它应该是这样的:
include 'A.php';
class_alias('A', 'OverriddenA');
include 'B.php';
class_alias('B', 'A');
问题是第二个class_alias()
错误,因为A已经被加载为A。
目前我能想到的唯一解决方案是执行file_read_contents(),替换类名并运行eval() -但我真的很讨厌这样做
我找到了一个很好的方法。
系统要查找的类是Core'A
所以这个文件实际上被创建为Overridable'A
当它被加载时,类加载器看到它是可重写的,所以它会查看它是否被重写了。如果是,它将加载已经声明自己为Core'A extends Overridable'A
如果没有重写,但它在Overridable命名空间中,它创建一个别名:class_alias(Overridable'A, Core'A);
为了让IDE还能引用所有内容,我创建了一个文件overrides。php这是不包含的它写着:
namespace: Core;
class A overrides 'Overridable'A {}