假设您正在构建一个将成为打包产品的Web应用程序,用户希望能够扩展和自定义该应用程序.
它附带一个核心库,包含包含类的PHP文件:
/library/
/library/frontend.class.php
/library/filesystem.class.php
/library/backend.class.php
Run Code Online (Sandbox Code Playgroud)
现在,假设您希望保留一个用户无法修补的干净核心.不过,如果需要,您希望用户能够自定义每个螺母和螺栓.
我目前的想法是创建一个自动加载机制,当一个类被实例化时,首先加载核心包括:
/library/frontend.class.php
Run Code Online (Sandbox Code Playgroud)
然后,它切换到user
目录并查看是否存在相同名称的包含:
/user/library/frontend.class.php
Run Code Online (Sandbox Code Playgroud)
如果存在,它也包括它.
显然,用户include必须包含一个类定义,扩展了核心包含中的定义.
现在我的问题是,我将如何实例化这样的类?毕竟,我总能确定有一个定义:
class frontend_core
Run Code Online (Sandbox Code Playgroud)
但我无法确定是否有
class frontend_user extends frontend_core
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够依赖并实例化一个类名,无论是否有类的自定义扩展.
是否有一种聪明的方式,想法或模式如何实现这一目标?
当然,我可以编写一个简单的工厂辅助函数,首先查找user
该类,然后查找core
该类并返回一个初始化对象,但我真的希望尽可能保持简洁,因为正如我所说,它是将成为一个包装产品.
我正在寻找一种使用尽可能少的代码的智能技巧或模式,并尽可能少地引入新功能.
为什么不遵循 Propel 使用的方法呢?您生成基类并已经提供了一个空的 User 类(扩展基类),您的用户可以在其中放置他们的覆盖/特定实现细节,并且在您的代码中您始终引用 User 类。所以基本上你只需使用你所描述的逻辑的逆逻辑。
如果上面的解释不清楚,请查看http://propel.phpdb.org/trac/wiki/Users/Documentation/1.4/QuickStart#a6.UsingtheGeneeratedSQLandOMFiles并为小型数据库生成代码。基类位于 om 文件夹中,(默认为空)用户类位于根文件夹中。