我有一个使用自动加载器加载类的系统。我能够编辑自动加载器,但我希望人们能够扩展我的一个类并使我的系统仍然运行。
假设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() - 但我真的很讨厌这样做。
答案 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 {}