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 相关文章推荐
如何给phpadmin一个保护
Oct 09 PHP
PHP中实现生成静态文件的方法缓解服务器压力
Jan 07 PHP
php中的静态变量的基本用法
Mar 20 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 PHP
PHP简单实现数字分页功能示例
Aug 24 PHP
php实现压缩合并js的方法【附demo源码下载】
Sep 22 PHP
php  单例模式详细介绍及实现源码
Nov 05 PHP
Laravel学习基础之migrate的使用教程
Oct 11 PHP
PHP测试框架PHPUnit组织测试操作示例
May 28 PHP
php函数式编程简单示例
Aug 08 PHP
Laravel定时任务的每秒执行代码
Oct 22 PHP
thinkphp5 路由分发原理
Mar 18 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
咖啡与水的关系
2021/03/03 冲泡冲煮
?繁体转换的class
2006/10/09 PHP
一些php项目中比较通用的php自建函数的详解
2013/06/06 PHP
PHP中通过trigger_error触发PHP错误示例
2015/06/23 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
php结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
javascript html实现网页版日历代码
2016/03/08 Javascript
浅谈JS使用[ ]来访问对象属性
2016/09/21 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
vue中v-model的应用及使用详解
2018/06/27 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
Python设计模式之策略模式实例详解
2019/01/21 Python
python变量命名的7条建议
2019/07/04 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
浅析PEP572: 海象运算符
2019/10/15 Python
Nike香港官网:Nike HK
2019/03/23 全球购物
平面设计岗位职责
2013/12/14 职场文书
班级入场式解说词
2014/02/01 职场文书
工程师岗位职责规定
2014/02/26 职场文书
项目建议书模板
2014/05/12 职场文书
爱与责任演讲稿
2014/05/20 职场文书
个人委托书范文
2015/01/28 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
Python字符串格式化方式
2022/04/07 Python