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数据库密码的找回的步骤
Jan 12 PHP
深入PHP与浏览器缓存的分析
Jun 03 PHP
PHP操作MongoDB GridFS 存储文件的详解
Jun 20 PHP
PHP实现图片自动清理的方法
Jul 08 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
ThinkPHP数据操作方法总结
Sep 28 PHP
php while循环控制的简单实例
May 30 PHP
微信支付开发告警通知实例
Jul 12 PHP
PHP与SQL语句常用大全
Dec 10 PHP
PHP二维数组去重算法
Dec 17 PHP
PHP PDOStatement::setFetchMode讲解
Feb 03 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 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字符串 ==比较运算符的副作用
2009/10/21 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
2011/06/10 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
2012/01/10 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
2012年开发人员的16款新鲜的jquery插件体验分享
2012/12/28 Javascript
node中socket.io的事件使用详解
2014/12/15 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
解析js如何获取css样式
2016/12/11 Javascript
JS常用知识点整理
2017/01/21 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
[19:26]TNC vs EG (BO3)
2018/06/07 DOTA
python 算法 排序实现快速排序
2012/06/05 Python
以windows service方式运行Python程序的方法
2015/06/03 Python
python实现给数组按片赋值的方法
2015/07/28 Python
Python基础教程之if判断,while循环,循环嵌套
2019/04/25 Python
如何更优雅地写python代码
2019/07/02 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
利用python下载scihub成文献为PDF操作
2020/07/09 Python
8种常用的Python工具
2020/08/05 Python
详解CSS3:overflow属性
2020/11/17 HTML / CSS
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
ORACLE十问
2015/04/20 面试题
计算机专业应届毕业生自荐信
2013/09/26 职场文书
大学生年度自我鉴定
2013/10/31 职场文书
食品厂厂长岗位职责
2014/01/30 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
城市创卫标语
2014/06/17 职场文书
个人授权委托书范本
2014/09/14 职场文书
小学语文复习计划
2015/01/19 职场文书
2015年教师工作总结范文
2015/03/31 职场文书