利用php 实现插件式构架

这个话题源自最近工作中一个新项目的需求,该项目需要和数量不定的第三方平台进行对接,而这里提到的第三方平台会随着项目进度逐渐增加

站在程序构架的角度,对于这种类型需求如果可以符合“对增加开放,对修改封闭”的设计标准,对于日后的运行和维护无疑都是一件好事。

当然,第一步我们首先需要对第三方平台的对接接口和操作过程进行分析,并分解出统一调用时必要的接口。在php中我们即可以使用类的继承,也可以进行独立的interface设计,这里仅作示例:

[php] view plaincopy

  1. // 用作实现统一接口的父类,所以插件都需要继承自该类
  2. // 在调用时可用is_a,is_subclass_of,reflaction等进行检测
  3. class Plugin{
  4. protected function init(){
  5. }
  6. protected function run(){
  7. }
  8. }
  9. // 示例用的自建插件
  10. class TestPlugin1 extends Plugin{
  11. }
  12. class TestPlugin2 extends Plugin{
  13. }

当我们完成整个单个插件的接口设计后,下一步就需要一个对插件进行统一调用管理模块

先来考虑一下实现管理模块所面临的3个基本需求:如何检测到插件、如何验证插件有效性、如何加载插件、如何调用插件中的功能

1、如何检测到插件

通常情况下,在我们导入一个新的class时,我们就可以通过其类名对其进行实例化后的使用。但是在插件式的系统构架中,管理类所需要面对的是设计编码时各种未知的插件类名称,唯一的共同点只是这些类拥有共同的调用接口。于是,管理类如何检测插件就是我们需要面对的第一个问题。

其实,虽然我们在编码时并不知道插件的类名,但从根本上来说在php运行过程中,php解释器是必须实际知道每个插件的类名才能对其进行实例化和调用的。这就意味着,我们必须通过某种手段将需要调用的插件类引入,并获得其实际类名称。在这个配置过程中,我个人将其分为动态配置和静态配置2大类。

以静态配置为例,我们可以直接将所需引入的插件名称和其文件路径写入配置文件:

[php] view plaincopy

  1. // key为引入类的类名,value为该类所需include的文件路径
  2. $plugin_list = array(
  3. ‘TestPlugin1‘  => ‘inc/a.plugin.php‘,
  4. ‘TestPlugin2‘  => ‘inc/a.plugin.php‘
  5. )

如果觉得静态配置过于繁琐,也可以通过指定插件文件夹,自动载入插件,在此不再赘述。

2、验证插件有效性 以及 加载插件

当我们完成插件的检测后,就可以通过依次引入插件文件、实例化插件类来进行插件加载了。如果考虑到系统稳定性和安全性,也可以在加载前适当的加入插件有效性验证,示例代码如下:

[php] view plaincopy

  1. foreach($plugin_list as $name => $path){
  2. @include_once(PATH . $path);
  3. // 确保类的引入无误
  4. if(!class_exists($name)){
  5. continue;
  6. }
  7. // 实例化插件
  8. $plugin = new $name();
  9. // 检测插件是否继承自指定接口类
  10. // 也可以通过反射机制的has_Methods对指定接口进行验证
  11. if(!is_a($plugin, ‘Plugin‘){
  12. continue;
  13. }
  14. // 验证通过,存储实例化后的插件对象
  15. $my_plugins[$name] = $plugin;
  16. }

3、调用插件接口

在完成以上2步之后,调用插件接口已经是易如反掌了:

[php] view plaincopy

  1. foreach($my_plugins as $name=>$plugin){
  2. $plugin->init();
  3. $plugin->run();
  4. }

利用php 实现插件式构架

时间: 2024-10-10 09:51:26

利用php 实现插件式构架的相关文章

mysql的插件式的存储引擎

转载 https://www.zhihu.com/question/19866767/answer/14942009 http://whuai.blog.51cto.com/3539000/862197 Oracle: 数据文件包括:控制文件.数据文件.重做日志文件.参数文件.归档文件.密码文件.这是根据文件功能行进行划分,并且所有文件都是二进制编码后的文件,对数据库算法效率有极大的提高.由于Oracle文件管理的统一性,就可以对SQL执行过程中的解析和优化,指定统一的标准:RBO(基于规则的优

探讨插件式GIS框架的设计

三年前,听当时的师兄推荐,买了蒋波涛的一本关于GIS插件框架的书.当时一边看书一边将其中的例子完整的实现了一遍,收益匪浅.后来由于项目需要,也做过一个插件的C/S系统,用的是微软提供的MEF框架.在这个系统中,把蒋波涛在他的书中没有涉及到的插件和插件的通信完成了.不过,蒋波涛的那本书,涉及到了插件系统的很多底层内容,其中关于插件引擎的设计尤其值得学习.近来,我将自己当年实现的那个例子进行了一个总结,和大家一起分享. 1.插件式框架的组成 (1).框架分为宿主程序和插件对象两部分 (2).两部分交

基于AppDomain的"插件式"开发

很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统,这个WinService系统管理的形形色色各种各样的服务,这些服务也是各个"插件式"的类库,例如: public interface IJob { void Run(DateTime time); } public class CollectUserInfo : IJob { public

基于Python的插件式系统结构试验

由于Python支持运行时动态载入,设计一个插件式结构是比较简单的.如果使用PyQt的话,可以轻松地创建出一个插件式的UI结构.不过,在很多时候,主程序使用C++/STL编写,通过Python来实现插件扩展.这里主要探讨"纯Python"实现的插件结构.C++Python的模式后面再说(可参考,C++嵌入Python: http://www.vckbase.com/index.php/wv/1258,C++嵌入Python要点:http://blog.chinaunix.net/uid

C#实现插件式架构的方法

插件式架构,一种全新的.开放性的.高扩展性的架构体系.插件式架构设计近年来非常流行,基于插件的设计好处很多,把扩展功能从框架中剥离出来,降低了框架的复杂度,让框架更容易实现.扩展功能与框架以一种很松的方式耦合,两者在保持接口不变的情况下,可以独立变化和发布.基于插件设计并不神秘,相反它比起一团泥的设计更简单,更容易理解.下面已C# .Net简要介绍一下插件式架构的方法. 定义插件接口,将其编译成dll namespace PluginInterface { public interface IP

使用 SailingEase WinForm 框架构建复合式应用程序(插件式应用程序)

对于一些较小的项目,具备一定经验的开发人员应该能够设计和构建出便于进行维护和扩展的应用程序.但是,随着功能模块数量(以及开发维护这些部件的人员)的不断增加,对项目实施控制的难度开始呈指数级增长. SailingEase WinForm 框架为您提供了针对此问题提出的解决方案.在本文中,将对基于SailingEase WinForm 框架的复合应用程序的定义进行解释,并简要说明如何才能构建一个基于 SailingEase WinForm 框架功能的复合应用程序. 传统的单一应用程序 传统的单一应用

C#学习笔记-----基于AppDomain的"插件式"开发

很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统,这个WinService系统管理的形形色色各种各样的服务,这些服务也是各个"插件式"的类库,例如: public interface IJob { void Run(DateTime time); } public class CollectUserInfo : IJob { public

ctkPlugin插件系统实现项目插件式开发

插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有挑战性的,为了这周总还专门找我谈了谈,算是“安抚”民心吧.正式谈话过后,我才决定接手渲染客户端的开发. 渲染客户端的所有构成均是采用开源框架拼凑起来的整体,细分它的组成大致包含以下开源模块,简单描述: 1> CTKPlugin插件系统框架.负责整个项目的架构,决定了项目采用插件形式开发维护. 2>

也来学学插件式开发

上一家公司有用到插件式开发来做一个工具箱,类似于QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了.可惜在那家公司待的时候有点短,没有好好研究一下.现在有空,自己在网上找了些资料,也来试试. 主要思路:公开一个插件接口,如果.DLL或.EXE的代码中有继承这个接口就将其示为插件,并将这些插件放在同一目录.运行程序的时候扫描目录并通过反射判断.DLL或.EXE中是否存在该接口,若存在,则当作插件加载进来. 我们来做一个示例看看.例子也是在园子里找的,自己改了一下,详见:http://w