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实现的随机广告显示代码
Jun 14 PHP
调试一段PHP程序时遇到的三个问题
Jan 17 PHP
基于php伪静态的实现详细介绍
Apr 28 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
Jun 09 PHP
你应该知道PHP浮点数知识
May 13 PHP
ThinkPHP数据操作方法总结
Sep 28 PHP
PHP编程中尝试程序并发的几种方式总结
Mar 21 PHP
各种快递查询--Api接口
Apr 26 PHP
php使用正则表达式去掉html中的注释方法
Nov 03 PHP
常用PHP封装分页工具类
Jan 14 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
May 17 PHP
php设计模式之工厂模式用法经典实例分析
Sep 20 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/08/20 PHP
ezSQL PHP数据库操作类库
2010/05/16 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
2015/10/13 PHP
PHP控制前台弹出对话框的实现方法
2016/08/21 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
event.srcElement+表格应用
2006/08/29 Javascript
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
2010/03/05 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
jquery iframe操作详细解析
2013/11/20 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
2016/01/24 Javascript
jquery实现网站列表切换效果的2种方法
2016/08/12 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
实例讲解React 组件
2020/07/07 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
Python内置类型性能分析过程实例
2020/01/29 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
护理专业自荐信
2013/12/03 职场文书
信息科学与技术专业求职信范文
2014/02/20 职场文书
养生餐厅创业计划书范文
2014/03/26 职场文书
运动会表扬稿范文
2015/05/05 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
vue封装数字翻牌器
2022/04/20 Vue.js