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中Session的概念
Oct 09 PHP
PHP下一个非常全面获取图象信息的函数
Nov 20 PHP
基于empty函数的输出详解
Jun 17 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
Jun 24 PHP
PHP 使用pcntl和libevent 实现Timer功能
Oct 27 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
php创建多级目录的方法
Mar 24 PHP
PHP多维数组元素操作类的方法
Nov 14 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
PHP设计模式之注册树模式分析
Jan 26 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
Nov 29 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音乐采集(部分代码)
2007/02/14 PHP
实测在class的function中include的文件中非php的global全局环境
2013/07/15 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
PHP制作用户注册系统
2015/10/23 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
纯JS实现轮播图
2017/02/22 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
javascript数据类型中的一些小知识点(推荐)
2019/04/18 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
python 获取微信好友列表的方法(微信web)
2019/02/21 Python
在服务器上安装python3.8.2环境的教程详解
2020/04/26 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
澳大利亚领先的在线药房:Pharmacy Online(有中文站)
2020/02/22 全球购物
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
秘书岗位职责
2013/11/18 职场文书
仓管岗位职责范本
2014/02/08 职场文书
自立自强的名人事例
2014/02/10 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
先进员工获奖感言
2014/08/14 职场文书
竞聘报告优秀范文
2014/11/06 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
使用Django实现商城验证码模块的方法
2021/06/01 Python
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python