2010-03-11 91 views
6

假设您正在构建一个将在一天内成为打包产品的Web应用程序,用户希望能够扩展和自定义该应用程序。可以选择自定义类别但统一类名称

它配备了包括含类PHP文件核心库:

/library/ 
/library/frontend.class.php 
/library/filesystem.class.php 
/library/backend.class.php 

现在,假设你要保持干净核心用户无法修补。但是,您希望用户能够根据需要定制每个螺母和螺栓。

我现在的想法是创建一个自动加载机制,当一个类实例化,首先加载核心包括:

/library/frontend.class.php 

然后,它切换到user目录,看起来是否有包括相同的名称:

/user/library/frontend.class.php 

如果存在,它也包括这一点。

显然,用户include必须包含一个类定义,它扩展了core include中的定义。

现在我的问题是,我将如何实例化这样一个类?毕竟,我总是可以肯定有一个定义:

class frontend_core 

,但我不能肯定是有

class frontend_user extends frontend_core 

不过,我想能够依靠的,实例化,一个类名称,无论是否存在该类的自定义扩展。

有没有一个聪明的方法,想法或模式如何实现这一目标?

当然,我可以写一个简单的工厂辅助函数,看起来对user类,然后再为core类,并返回一个初始化的对象,但我真的想保持这个干净和简单越好,因为正如我所说,它将成为一种包装产品。

我正在寻找一种巧妙的技巧或模式,它尽量少用代码,并尽可能少地引入新的功能。

回答

3

你为什么不采取的办法是使用波轮的核心是什么?您生成您的基类,并且已经提供了一个空的User类(扩展基类),用户可以在其中放置覆盖/特定实现细节,并且在您的代码中始终引用User类。所以基本上你只是使用你描述的逻辑的逆。

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

+0

如果没有自定义,我想保留用户目录为空,但另一方面,这是个不错的主意。它为用户提供了简单的入门点,甚至可以在空的类文件中使用代码示例和解释。我会考虑的。 – 2010-03-11 13:20:15

+0

但是,当用户不使用它时,它也增加了多余的类以供加载,例如,当用户选择使用默认值时,User_Frontend加上Core_Frontend而不是Core_Frontend。 – Gordon 2010-03-14 12:45:11

0

我将实现在核心挂钩,因此用户不必须破解的核心,但仍然能够延长使用挂钩

+1

@streetparade。覆盖或扩展核心类对于更深入的自定义仍然是必需的。我想提供两种可能性。 – 2010-03-11 13:19:00

0

我认为当你想使用继承以及单个文件名时它更复杂。基本上class user_frontend extends core_frontend必须知道在哪里可以找到这两个类。两者都必须包括在内。

如果你只想做new Frontend你可以使用PHP5.3的class_alias指向前端到主要的类使用。低于5.3。您可以使用ServiceFinder,它知道如何将服务名称映射到类,然后使用$service->get('frontend')或使用Dependency Injection framework获得前端。

编辑我删除了之前给出的Loader代码,因为它遭受了这个问题。

0

我会使用核心类的构造函数来确定要加载的用户类,然后在核心类中实现工厂方法以生成用户类的实例。通过使用户类的构造函数受到保护,并让用户类扩展核心类,可以确保其他地方的代码不能实例化用户类。

C.

0

你可以有一个装载器类,将决定哪些类的实例:我用一个钩子系统已经在应用的各个地方

Loader::instance()->load('Frontend') 
相关问题