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


Posted in PHP onNovember 02, 2012

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

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

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

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

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

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

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

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

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

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

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

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

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

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

PHP 相关文章推荐
PHP mkdir()定义和用法
Jan 14 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
Sep 20 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
Nov 10 PHP
php实现文件下载功能的几个代码分享
May 10 PHP
php限制文件下载速度的代码
Oct 20 PHP
php删除数组中重复元素的方法
Dec 22 PHP
php实现scws中文分词搜索的方法
Dec 25 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
Mar 21 PHP
PHP封装的验证码工具类定义与用法示例
Aug 22 PHP
php+lottery.js实现九宫格抽奖功能
Jul 21 PHP
对laravel的session获取与存取方法详解
Oct 08 PHP
Laravel Reponse响应客户端示例详解
Sep 03 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 数组入门教程小结
2009/05/20 PHP
php实现购物车功能(上)
2020/07/23 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
一些易混淆且不常用的属性,希望有用
2007/01/29 Javascript
在模板页面的js使用办法
2010/04/01 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
jQuery获取(选中)单选,复选框,下拉框中的值
2014/02/21 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
js对象的复制继承实例
2015/01/10 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
Angular6封装http请求的步骤详解
2018/08/13 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
Python正则表达式匹配ip地址实例
2014/10/09 Python
Python实现把回车符\r\n转换成\n
2015/04/23 Python
详解Django框架中用context来解析模板的方法
2015/07/20 Python
python实现淘宝秒杀脚本
2020/06/23 Python
Python基础之文件读取的讲解
2019/02/16 Python
树莓派实现移动拍照
2019/06/22 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
2020/05/25 Python
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
Perfumetrader荷兰:香水、化妆品和护肤品在线商店
2017/09/15 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
2014年向国旗敬礼活动方案
2014/09/27 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
网络管理员岗位职责
2015/02/12 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书