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


Posted in PHP onNovember 02, 2012

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

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

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

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

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

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

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

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

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

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

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

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

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

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

PHP 相关文章推荐
用PHP 快速生成 Flash 动画的方法
Mar 06 PHP
PHP 单引号与双引号的区别
Nov 24 PHP
PHP取进制余数函数代码
Jan 19 PHP
PHP数组传递是值传递而非引用传递概念纠正
Jan 31 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
Jun 20 PHP
PHP生成随机密码方法汇总
Aug 27 PHP
PHP中Session和Cookie是如何操作的
Oct 10 PHP
Laravel的throttle中间件失效问题解决方法
Oct 09 PHP
详解yii2使用多个数据库的案例
Jun 16 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
thinkPHP框架RBAC实现原理分析
Feb 01 PHP
PHP基于面向对象封装的分页类示例
Mar 15 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中的正规表达式(一)
2006/10/09 PHP
PHP STRING 陷阱原理说明
2010/07/24 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
php出现web系统多域名登录失败的解决方法
2014/09/30 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
php中switch语句用法详解
2015/08/17 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
三级下拉菜单的js实现代码
2011/05/23 Javascript
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
Position属性之relative用法
2015/12/14 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
ES6之Proxy的get方法详解
2019/10/11 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
2019/11/18 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
python实现多线程的两种方式
2016/05/22 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
River Island美国官网:英国高街时尚品牌
2018/09/04 全球购物
请用用Java代码写一个堆栈
2012/01/26 面试题
竞聘上岗演讲稿范文
2014/01/10 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书
治庸问责工作总结
2015/08/11 职场文书
保险公司岗前培训工作总结
2015/10/24 职场文书
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL
利用uni-app生成微信小程序的踩坑记录
2022/04/05 Javascript
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript