我可以让客户端覆盖类吗?

时间:2012-02-29 18:23:49

标签: php oop class

我在PHP中有一个简化的MVC类型结构的应用程序。此应用程序将用于我公司和其他人运营的十几个站点。该结构包含一个控制器文件,一个名为application的文件夹,其中包含app类,以及一个名为site的文件夹,其中包含特定于站点的代码,例如模板。我们会定期分发修补程序,以便在分发更改时更新控制器和应用程序文件夹。因此,客户端无法真正更改应用程序文件夹中的核心代码,而不会在更新代码时丢失这些更改。

我告诉你,所以我可以解释客户想要什么 - 他们希望能够扩展现有的类。是否有允许这样的设计模式?现在,我已经让用户能够替换整个类:

spl_autoload_register('loadSiteClass');
spl_autoload_register('loadCoreClass');

这使用自动加载器在查看类的应用程序文件夹之前检查类的站点文件夹。我希望找到一种替代方案,允许我自动检测,加载和使用扩展现有类的类,而不是强制完全替换类。任何建议都会受到欢迎。提前谢谢。

如果有帮助,站点文件夹中还有一个站点特定的配置文件,站点管理员可以在其中添加配置设置,告诉我正在扩展一个类,但是我仍然不确定如何使用该信息它被提供了。

1 个答案:

答案 0 :(得分:1)

codeigniter执行此操作的方式是在系统类的“client”/“application”文件夹中具有镜像目录结构。然后你可以在一个与系统类相同的位置创建一个文件,然后简单地扩展系统类,它们的加载类将首先查找覆盖,然后再回退。

点击此处查看一些代码示例:https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/Loader.php#L277

他们documentation可能更有助于理解他们的模式。

我确信有更多的方法可以做到这一点......但是通常会对目录结构进行约定,而简单的PHP“extends”关键字对我来说是有意义的。