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加密解密的代码
Oct 09 PHP
PHP制作图型计数器的例子
Oct 09 PHP
与文件上传有关的php配置参数总结
Jun 14 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
Jun 28 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
Jul 05 PHP
PHP读取RSS(Feed)简单实例
Jun 12 PHP
php将数组转换成csv格式文件输出的方法
Mar 14 PHP
PHP中使用curl入门教程
Jul 02 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
Nov 18 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
Nov 19 PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 PHP
PHP is_array() 检测变量是否是数组的实现方法
Jun 13 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读取xml方法介绍
2013/01/12 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
javascript 函数式编程
2007/08/16 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
2014/05/05 Python
Python3基础之输入和输出实例分析
2014/08/18 Python
Python的Flask框架与数据库连接的教程
2015/04/20 Python
python开发中module模块用法实例分析
2015/11/12 Python
python win32 简单操作方法
2017/05/25 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
Python 正则表达式爬虫使用案例解析
2019/09/23 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
HTML5的hidden属性兼容老浏览器的方法
2014/04/23 HTML / CSS
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
四川成都导游欢迎词
2014/01/18 职场文书
最新离婚协议书范本
2014/08/19 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书
Python基础之条件语句详解
2021/06/16 Python