可以选择自定义类,但可以选择统一的类名

Pek*_*ica 6 php oop

假设您正在构建一个将成为打包产品的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该类并返回一个初始化对象,但我真的希望尽可能保持简洁,因为正如我所说,它是将成为一个包装产品.

我正在寻找一种使用尽可能少的代码的智能技巧或模式,并尽可能少地引入新功能.

wim*_*vds 3

为什么不遵循 Propel 使用的方法呢?您生成基类并已经提供了一个空的 User 类(扩展基类),您的用户可以在其中放置他们的覆盖/特定实现细节,并且在您的代码中您始终引用 User 类。所以基本上你只需使用你所描述的逻辑的逆逻辑。

如果上面的解释不清楚,请查看http://propel.phpdb.org/trac/wiki/Users/Documentation/1.4/QuickStart#a6.UsingtheGeneeratedSQLandOMFiles并为小型数据库生成代码。基类位于 om 文件夹中,(默认为空)用户类位于根文件夹中。