php教程 插件机制在PHP中实现方案


Posted in PHP onNovember 02, 2012

提示:PHP中插件机制的一种实现方案.

这篇文章的出发点是我对插件机制的理解,及其在PHP中的实现。此方案仅是插件机制在PHP中的实现方案之一,写下来和大家分享,欢迎大家一起讨论。

插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现),它的特点是:当你需要它的时候激活它,不需要它的时候禁用/删除它;且无论是激活还是禁用都不影响系统核心模块的运行,也就是说插件是一种非侵入式的模块化设计,实现了核心程序与插件程序的松散耦合。一个典型的例子就是Wordpress中众多的第三方插件,比如Akimet插件用于对用户的评论进行Spam过滤。

一个健壮的插件机制,我认为必须具备以下特点:

插件的动态监听和加载(Lookup)
插件的动态触发

以上两点的实现均不影响核心程序的运行

要在程序中实现插件,我们首先应该想到的就是定义不同的钩子(Hooks);“钩子”是一个很形象的逻辑概念,你可以认为它是系统预留的插件触发条件。它的逻辑原理如下:当系统执行到某个钩子时,会判断这个钩子的条件是否满足;如果满足,会转而先去调用钩子所制定的功能,然后返回继续执行余下的程序;如果不满足,跳过即可。这有点像汇编中的“中断保护”逻辑。

某些钩子可能是系统事先就设计好的,比如之前我举的关于评论Spam过滤的钩子,通常它已经由核心系统开发人员设计进了评论的处理逻辑中;另外一类钩子则可能是由用户自行定制的(由第三方开发人员制定),通常存在于表现层,比如一个普通的PHP表单显示页面中。

可能你感觉上面的话比较无聊,让人昏昏欲睡;但是要看懂下面我写的代码,理解以上的原理是必不可少的。

下面进行PHP中插件机制的核心实现,整个机制核心分为三大块:

一个插件经理类:这是核心之核心。它是一个应用程序全局Global对象。它主要有三个职责:

负责监听已经注册了的所有插件,并实例化这些插件对象。
负责注册所有插件。
当钩子条件满足时,触发对应的对象方法。

插件的功能实现:这大多由第三方开发人员完成,但需要遵循一定的规则,这个规则是插件机制所规定的,因插件机制的不同而不同,下面的显示代码你会看到这个规则。

插件的触发:也就是钩子的触发条件。具体来说这是一小段代码,放置在你需要插件实现的地方,用于触发这个钩子。

PHP 相关文章推荐
PHP+Tidy-完美的XHTML纠错+过滤
Apr 10 PHP
解析PHP多种序列化与反序列化的方法
Jun 06 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
php中运用http调用的GET和POST方法示例
Sep 29 PHP
学习php设计模式 php实现抽象工厂模式
Dec 07 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
May 31 PHP
PHP获取路径和目录的方法总结【必看篇】
Mar 04 PHP
php封装的mongodb操作类代码
Aug 06 PHP
ThinkPHP5框架实现简单的批量查询功能示例
Jun 07 PHP
PDO::rollBack讲解
Jan 29 PHP
php日志函数error_log用法实例分析
Sep 23 PHP
PHP fopen中文文件名乱码问题解决方案
Oct 28 PHP
PHP类与对象中的private访问控制的疑问
Nov 01 #PHP
php类中private属性继承问题分析
Nov 01 #PHP
用php实现百度网盘图片直链的代码分享
Nov 01 #PHP
php curl 伪造IP来源的实例代码
Nov 01 #PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
Nov 01 #PHP
php eval函数用法 PHP中eval()函数小技巧
Oct 31 #PHP
php eval函数用法总结
Oct 31 #PHP
You might like
通过具体程序来理解PHP里面的抽象类
2010/01/28 PHP
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
php中一个完整表单处理实现代码
2011/11/10 PHP
七款最流行的PHP本地服务器分享
2013/02/19 PHP
php防止网站被攻击的应急代码
2015/10/21 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
JavaScript之引用类型介绍
2012/08/10 Javascript
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
jQuery中Ajax的get、post等方法详解
2015/01/20 Javascript
js的toLowerCase方法用法实例
2015/01/27 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
微信小程序开发之toast提示插件使用示例
2017/06/08 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
如何基于JavaScript判断图片是否加载完成
2019/12/28 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
[01:11:08]Winstrike vs NB 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python中title()方法的使用简介
2015/05/20 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
2018/10/23 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
个人自荐书
2013/12/20 职场文书
CAD制图人员的自荐信
2014/02/07 职场文书
初中军训感想
2015/08/07 职场文书