如何替换已加载的类?

时间:2014-08-03 01:28:23

标签: php class override

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

假设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() - 但我真的很讨厌这样做。

1 个答案:

答案 0 :(得分:0)

好的,我发现了一个很好的方法。

系统将查找的类是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 {}