如何替换已经加载的类?


How can I replace a class that's already loaded?

我有一个使用自动加载器加载类的系统。我能够编辑自动加载器,但我希望人们能够扩展我的一个类,并使我的系统仍然运行。

假设类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 {}