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 开发的 8 个技巧
Jan 02 PHP
php flush类输出缓冲剖析
Oct 19 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
Apr 07 PHP
php设计模式 Prototype (原型模式)代码
Jun 26 PHP
php 启动时报错的简单解决方法
Jan 27 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
Oct 20 PHP
PHP判断浏览器、判断语言代码分享
Mar 05 PHP
php实现兼容2038年后Unix时间戳转换函数
Mar 18 PHP
PHP中余数、取余的妙用
Jun 29 PHP
crontab无法执行php的解决方法
Jan 25 PHP
php中strtotime函数性能分析
Nov 20 PHP
Laravel框架路由设置与使用示例
Jun 12 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/03/10 PHP
php 缩略图实现函数代码
2011/06/23 PHP
PHP动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
yii框架中的Url生产问题小结
2012/01/16 PHP
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
2016/02/23 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
javascript结合CSS实现苹果开关按钮特效
2015/04/07 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
2016/12/08 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
Python 抓取微信公众号账号信息的方法
2019/06/14 Python
如何用css3实现switch组件开关的方法
2018/02/09 HTML / CSS
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
工程业务员岗位职责
2013/12/31 职场文书
个性与发展自我评价
2014/02/11 职场文书
精彩的广告词
2014/03/19 职场文书
村干部培训方案
2014/05/02 职场文书
法人授权委托书范本
2014/09/17 职场文书
离职报告范文
2014/11/04 职场文书
产品质量保证书范本
2015/02/27 职场文书