php实现网站插件机制的方法


Posted in PHP onNovember 10, 2009

首先是插件的管理类的实现:

<? 
/** 
* STBLOG PluginManager Class 
* 
* 插件机制的实现核心类 
* 
* @package STBLOG 
* @subpackage Libraries 
* @category Libraries 
* @author Saturn 
* @link http://www.cnsaturn.com/ 
*/ 
class PluginManager 
{ 
/** 
* 监听已注册的插件 
* 
* @access private 
* @var array 
*/ 
private $_listeners = array(); 
/** 
* 构造函数 
* 
* @access public 
* @return void 
*/ 
public function __construct() 
{ 
#这里$plugin数组包含我们获取已经由用户激活的插件信息 
#为演示方便,我们假定$plugin中至少包含 
#$plugin = array( 
# 'name' => '插件名称', 
# 'directory'=>'插件安装目录' 
#); 
$plugins = get_active_plugins();#这个函数请自行实现 
if($plugins) 
{ 
foreach($plugins as $plugin) 
{//假定每个插件文件夹中包含一个actions.php文件,它是插件的具体实现 
if (@file_exists(STPATH .'plugins/'.$plugin['directory'].'/actions.php')) 
{ 
include_once(STPATH .'plugins/'.$plugin['directory'].'/actions.php'); 
$class = $plugin['name'].'_actions'; 
if (class_exists($class)) 
{ 
//初始化所有插件 
new $class($this); 
} 
} 
} 
} 
#此处做些日志记录方面的东西 
} /** 
* 注册需要监听的插件方法(钩子) 
* 
* @param string $hook 
* @param object $reference 
* @param string $method 
*/ 
function register($hook, &$reference, $method) 
{ 
//获取插件要实现的方法 
$key = get_class($reference).'->'.$method; 
//将插件的引用连同方法push进监听数组中 
$this->_listeners[$hook][$key] = array(&$reference, $method); 
#此处做些日志记录方面的东西 
} 
/** 
* 触发一个钩子 
* 
* @param string $hook 钩子的名称 
* @param mixed $data 钩子的入参 
* @return mixed 
*/ 
function trigger($hook, $data='') 
{ 
$result = ''; 
//查看要实现的钩子,是否在监听数组之中 
if (isset($this->_listeners[$hook]) && is_array($this->_listeners[$hook]) && count($this->_listeners[$hook]) > 0) 
{ 
// 循环调用开始 
foreach ($this->_listeners[$hook] as $listener) 
{ 
// 取出插件对象的引用和方法 
$class =& $listener[0]; 
$method = $listener[1]; 
if(method_exists($class,$method)) 
{ 
// 动态调用插件的方法 
$result .= $class->$method($data); 
} 
} 
} 
#此处做些日志记录方面的东西 
return $result; 
} 
} 
?>

然后是插件的具体实现方法:
<? 
/** 
* 这是一个Hello World简单插件的实现 
* 
* @package DEMO 
* @subpackage DEMO 
* @category Plugins 
* @author Saturn 
* @link http://www.cnsaturn.com/ 
*/ 
/** 
*需要注意的几个默认规则: 
* 1. 本插件类的文件名必须是action 
* 2. 插件类的名称必须是{插件名_actions} 
*/ 
class DEMO_actions 
{ 
//解析函数的参数是pluginManager的引用 
function __construct(&$pluginManager) 
{ 
//注册这个插件 
//第一个参数是钩子的名称 
//第二个参数是pluginManager的引用 
//第三个是插件所执行的方法 
$pluginManager->register('demo', $this, 'say_hello'); 
} function say_hello() 
{ 
echo 'Hello World'; 
} 
} 
?>

比如我要将say_hello放到我博客首页Index.php,那么你在index.php中的某个位置写下:(作者原话)
$pluginManager->trigger('demo','');

以上就是一个插件机制的实现,over!
PHP 相关文章推荐
PHP 和 MySQL 基础教程(二)
Oct 09 PHP
php结合飞信 免费天气预报短信
May 07 PHP
php函数array_merge用法一例(合并同类数组)
Feb 03 PHP
php获取本地图片文件并生成xml文件输出具体思路
Apr 27 PHP
浅谈php错误提示及查错方法
Jul 14 PHP
PHP 绘制网站登录首页图片验证码
Apr 12 PHP
php pdo oracle中文乱码的快速解决方法
May 16 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
PHP7基于curl实现的上传图片功能
May 11 PHP
php命令行写shell实例详解
Jul 19 PHP
Laravel框架Request、Response及Session操作示例
May 06 PHP
Laravel框架处理用户的请求操作详解
Dec 20 PHP
php 向访客和爬虫显示不同的内容
Nov 09 #PHP
php 将excel导入mysql
Nov 09 #PHP
PHP CKEditor 上传图片实现代码
Nov 06 #PHP
PHP 压缩文件夹的类代码
Nov 05 #PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 #PHP
网页游戏开发入门教程三(简单程序应用)
Nov 02 #PHP
网页游戏开发入门教程二(游戏模式+系统)
Nov 02 #PHP
You might like
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
Javascript基础_嵌入图像的简单实现
2016/06/14 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
angular仿支付宝密码框输入效果
2017/03/25 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
深入理解 ES6中的 Reflect用法
2020/07/18 Javascript
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
python文件和目录操作方法大全(含实例)
2014/03/12 Python
Python中的with...as用法介绍
2015/05/28 Python
简介Python设计模式中的代理模式与模板方法模式编程
2016/02/02 Python
JSON Web Tokens的实现原理
2017/04/02 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
pytorch permute维度转换方法
2018/12/14 Python
python图形工具turtle绘制国际象棋棋盘
2019/05/23 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
python绘制趋势图的示例
2020/09/17 Python
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
一套中级Java程序员笔试题
2015/01/14 面试题
法律六进活动方案
2014/03/13 职场文书
党课培训心得体会
2014/09/02 职场文书
护理医院见习报告
2014/11/03 职场文书
行政司机岗位职责
2015/04/10 职场文书
穆斯林的葬礼读书笔记
2015/06/26 职场文书
2016年端午节红领巾广播稿
2015/12/18 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python