首先是插件的管理类的实现:
	
| 
					 
						1
					 
					
						2
					 
					
						3
					 
					
						4
					 
					
						5
					 
					
						6
					 
					
						7
					 
					
						8
					 
					
						9
					 
					
						10
					 
					
						11
					 
					
						12
					 
					
						13
					 
					
						14
					 
					
						15
					 
					
						16
					 
					
						17
					 
					
						18
					 
					
						19
					 
					
						20
					 
					
						21
					 
					
						22
					 
					
						23
					 
					
						24
					 
					
						25
					 
					
						26
					 
					
						27
					 
					
						28
					 
					
						29
					 
					
						30
					 
					
						31
					 
					
						32
					 
					
						33
					 
					
						34
					 
					
						35
					 
					
						36
					 
					
						37
					 
					
						38
					 
					
						39
					 
					
						40
					 
					
						41
					 
					
						42
					 
					
						43
					 
					
						44
					 
					
						45
					 
					
						46
					 
					
						47
					 
					
						48
					 
					
						49
					 
					
						50
					 
					
						51
					 
					
						52
					 
					
						53
					 
					
						54
					 
					
						55
					 
					
						56
					 
					
						57
					 
					
						58
					 
					
						59
					 
					
						60
					 
					
						61
					 
					
						62
					 
					
						63
					 
					
						64
					 
					
						65
					 
					
						66
					 
					
						67
					 
					
						68
					 
					
						69
					 
					
						70
					 
					
						71
					 
					
						72
					 
					
						73
					 
					
						74
					 
					
						75
					 
					
						76
					 
					
						77
					 
					
						78
					 
					
						79
					 
					
						80
					 
					
						81
					 
					
						82
					 
					
						83
					 
					
						84
					 
					
						85
					 
					
						86
					 
					
						87
					 
					
						88
					 
					
						89
					 
					
						90
					 
					
						91
					 
					
						92
					 
					
						93
					 
					
						94
					 
					
						95
					 
					
						96
					 
					
						97
					 
					
						98
					 
					
						99
					 
					
						100
					 
					
						101
					 
					
						102
					 
					
						103
					 
					
						104
					 
					
						105
					 
					
						106
					 
					
						107
					 
					
						108
					 
					
						109
					 
					
						110
					 
					
						111
					 
					
						112
					 
					
						113
					 
					
						114
					 
					
						115
					 
					
						116
					 
					
						117
					 
					
						118
					 
					
						119
					 
					
						120
					 
					
						121
					 
					
						122
					 
					
						123
					 
					
						124
					 
					
						125
					 
					
						126
					 
					
						127
					 
					
						128
					 
					
						129
					 
				 | 
				
					 
							* @subpackage Libraries
						 
						
							* @category Libraries
						 
						
							* @author Saturn
						 
						
							* @link http://www.cnsaturn.com/
						 
						
							*/
						 
						
							classPluginManager
						 
						
							{
						 
						
							/**
						 
						
							* 监听已注册的插件
						 
						
							*
						 
						
							* @access private
						 
						
							* @var array
						 
						
							*/
						 
						
							private$_listeners=array();
						 
						
							/**
						 
						
							* 构造函数
						 
						
							*
						 
						
							* @access public
						 
						
							* @return void
						 
						
							*/
						 
						
							publicfunction__construct()
						 
						
							{
						 
						
							#这里$plugin数组包含我们获取已经由用户激活的插件信息
						 
						
							#为演示方便,我们假定$plugin中至少包含
						 
						
							#$plugin=array(
						 
						
							#'name'=>'插件名称',
						 
						
							#'directory'=>'插件安装目录'
						 
						
							#);
						 
						
							$plugins= get_active_plugins();#这个函数请自行实现
						 
						
							if($plugins)
						 
						
							{
						 
						
							foreach($pluginsas$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
						 
						
							*/
						 
						
							functionregister($hook, &$reference,$method)
						 
						
							{
						 
						
							//获取插件要实现的方法
						 
						
							$key= get_class($reference).'->'.$method;
						 
						
							//将插件的引用连同方法push进监听数组中
						 
						
							$this->_listeners[$hook][$key] =array(&$reference,$method);
						 
						
							#此处做些日志记录方面的东西
						 
						
							}
						 
						
							/**
						 
						
							* 触发一个钩子
						 
						
							*
						 
						
							* @param string $hook 钩子的名称
						 
						
							* @param mixed $data 钩子的入参
						 
						
							* @return mixed
						 
						
							*/
						 
						
							functiontrigger($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 
						 
						
							*/
						 
						
							/**
						 
						
							*需要注意的几个默认规则:
						 
						
							* 1. 本插件类的文件名必须是action
						 
						
							* 2. 插件类的名称必须是{插件名_actions}
						 
						
							*/
						 
						
							classDEMO_actions
						 
						
							{
						 
						
							//解析函数的参数是pluginManager的引用
						 
						
							function__construct(&$pluginManager)
						 
						
							{
						 
						
							//注册这个插件
						 
						
							//第一个参数是钩子的名称
						 
						
							//第二个参数是pluginManager的引用
						 
						
							//第三个是插件所执行的方法
						 
						
							$pluginManager->register('demo',$this,'say_hello');
						 
						
							}
						 
						
							functionsay_hello()
						 
						
							{
						 
						
							echo'Hello World';
						 
						
							}
						 
						
							}
						 
						
							?>
						 
					 | 
			
	
比如我要将say_hello放到我博客首页Index.php,那么你在index.php中的某个位置写下:代码如下:
$pluginManager->trigger('demo','');
转载请注明来源: php实现网站插件机制的方法
哈尔滨品用软件有限公司致力于为哈尔滨的中小企业制作大气、美观的优秀网站,并且能够搭建符合百度排名规范的网站基底,使您的网站无需额外费用,即可稳步提升排名至首页。欢迎体验最佳的哈尔滨网站建设。
