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 相关文章推荐
Adodb的十个实例(清晰版)
Dec 31 PHP
php str_pad 函数用法简介
Jul 11 PHP
php学习之 数组声明
Jun 09 PHP
php eval函数用法总结
Oct 31 PHP
PHP file_get_contents设置超时处理方法
Sep 30 PHP
详谈PHP文件目录基础操作
Nov 11 PHP
php绘图之生成饼状图的方法
Jan 24 PHP
PHP微信支付开发实例
Jun 22 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 PHP
PHP数组式访问接口ArrayAccess用法分析
Dec 28 PHP
php中青蛙跳台阶的问题解决方法
Oct 14 PHP
用Laravel轻松处理千万级数据的方法实现
Dec 25 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 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
Jquery性能优化详解
2014/05/15 Javascript
jQuery实现验证年龄简单思路
2016/02/24 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
微信小程序 开发之全局配置
2017/05/05 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
微信小程序入口场景的问题集合与相关解决方法
2019/06/26 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
Python中生成Epoch的方法
2017/04/26 Python
深入理解Python中的super()方法
2017/11/20 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
Python PO设计模式的具体使用
2019/08/16 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
Python matplotlib实时画图案例
2020/04/23 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
一个SQL面试题
2014/08/21 面试题
linux系统都有哪些运行级别
2012/04/15 面试题
2014年银行个人工作总结
2014/12/05 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
安全教育日主题班会
2015/08/13 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
React实现动效弹窗组件
2021/06/21 Javascript