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的FTP学习(二)
Oct 09 PHP
简单介绍下 PHP5 中引入的 MYSQLI的用途
Mar 19 PHP
php&amp;mysql 日期操作小记
Feb 27 PHP
ThinkPHP权限认证Auth实例详解
Jul 22 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
php常用文件操作函数汇总
Nov 22 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
php简单实现文件或图片强制下载的方法
Dec 06 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
浅谈Yii乐观锁的使用及原理
Jul 25 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 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实现与ASP Banner组件相似的类
2006/10/09 PHP
php中将一个对象保存到Session中的方法
2015/03/13 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
js控制框架刷新
2008/08/01 Javascript
JavaScript日历实现代码
2010/09/12 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
javascript中Number对象的toString()方法分析
2014/12/20 Javascript
javascript实用方法总结
2015/02/06 Javascript
nw.js实现类似微信的聊天软件
2015/03/16 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
总结JavaScript设计模式编程中的享元模式使用
2016/05/21 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
2020/03/08 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
python3 简单实现组合设计模式
2020/07/02 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
乐高积木玩具美国官网:LEGO Shop US
2016/09/16 全球购物
什么是岗位职责
2013/11/12 职场文书
计算机毕业大学生推荐信
2013/12/01 职场文书
幼儿教师工作感言
2014/02/14 职场文书
环保倡议书300字
2014/05/15 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis