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作为Shell脚本语言使用
Oct 09 PHP
模拟OICQ的实现思路和核心程序(三)
Oct 09 PHP
discuz安全提问算法
Jun 06 PHP
基于PHP magic_quotes_gpc的使用方法详解
Jun 24 PHP
PHP zip扩展Linux下安装过程分享
May 05 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
PHP在线打包下载功能示例
Oct 15 PHP
PHP全功能无变形图片裁剪操作类与用法示例
Jan 10 PHP
php使用PDO执行SQL语句的方法分析
Feb 16 PHP
深入解析PHP中SESSION反序列化机制
Mar 01 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
May 09 PHP
laravel实现前后台路由分离的方法
Oct 13 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 获取MSN好友列表的代码(2009-05-14测试通过)
2009/09/09 PHP
php smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
PHP经典面试题集锦
2015/03/19 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
2019/10/18 PHP
文本框的字数限制功能jquery插件
2009/11/24 Javascript
jQuery源码分析之Event事件分析
2010/06/07 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
js删除局部变量的实现方法
2016/06/25 Javascript
关于JavaScript中事件绑定的方法总结
2016/10/26 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
微信小程序  checkbox组件详解及简单实例
2017/01/10 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
2017/05/03 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
django2 快速安装指南分享
2018/01/05 Python
python的socket编程入门
2018/01/29 Python
Python continue继续循环用法总结
2018/06/10 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
python能在浏览器能运行吗
2020/06/17 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
阿里巴巴Oracle DBA笔试题答案-备份恢复类
2013/11/20 面试题
公务员转正鉴定材料
2014/02/11 职场文书
电子商务实训报告总结
2014/11/05 职场文书
优秀班集体申报材料
2014/12/25 职场文书
英语教师个人总结
2015/02/09 职场文书
趣味运动会口号
2015/12/24 职场文书