当前位置:首页 > PHP教程 > php应用 > 列表

PHP中的插件机制原理和实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-03-14 14:18:39 浏览: 评论:0 

这篇文章主要介绍了PHP中的插件机制原理和实例,文中例子主要借鉴了网上一些网友的方式做了稍微的改造,需要的朋友可以参考下

PHP项目中很多用到插件的地方,更尤其是基础程序写成之后很多功能由第三方完善开发的时候,更能用到插件机制,现在说一下插件的实现。特点是无论你是否激活,都不影响主程序的运行,即使是删除也不会影响。

从一个插件安装到运行过程的角度来说,主要是三个步骤:

1.插件安装(把插件信息收集进行采集和记忆的过程,比如放到数据库中或者XML中)

2.插件激活(打开插件,让监听插件的地方开始进行调用)

3.插件运行(插件功能的实现)

从一个插件的运行上来说主要以下几点:

1.插件的动态监听和加载(插件的信息获取)

2.插件的动态触发(插件的运行)

一个完善的插件系统主要包括以下:

1.插件安装及卸载

2.插件打开与关闭

3.插件信息获取

4.插件调度(插件经理)

5.插件主体

在程序的编写上主要实现以下:

1.插件的注册和初始化

2.判断激活条件

3.钩子激活

4.运行插件

实例代码:

  1. <?php 
  2. /**  
  3. * PluginManager Class  
  4.  
  5. * 插件机制的实现核心类  
  6.  
  7. * @link https://www.jb51.net/  
  8. */ 
  9. class PluginManager  
  10. {  
  11.   /**  
  12.    * 监听已注册的插件  
  13.    *  
  14.    * @access private  
  15.    * @var array  
  16.    */ 
  17.   private $_listeners = array();  
  18.    /**  
  19.    * 构造函数  
  20.    *  
  21.    * @access public  
  22.    * @return void  
  23.    */ 
  24.   public function __construct()  
  25.   {  
  26.     #这里$plugin数组包含我们获取已经由用户激活的插件信息  
  27.    #为演示方便,我们假定$plugin中至少包含  
  28.    #$plugin = array(  
  29.     #  'name' => '插件名称',  
  30.     #  'directory'=>'插件安装目录' 
  31.     #);  
  32.      
  33.    
  34.    // $plugins = get_active_plugins();#这个函数请自行实现  
  35.    
  36.     //函数实现后的最终数据结构效果如下 
  37.     $plugins=array(array("directory"=>"demo"
  38.     "name"=>"DEMO")); 
  39.    
  40.    
  41.     if($plugins)  
  42.     {  
  43.       foreach($plugins as $plugin)  
  44.    
  45.       {//假定每个插件文件夹中包含一个actions.php文件,它是插件的具体实现  
  46.         if (@file_exists(STPATH .'plugins/'.$plugin['directory'].'/actions.php'))  
  47.         {  
  48.           include_once(STPATH .'plugins/'.$plugin['directory'].'/actions.php');  
  49.           $class = $plugin['name'].'_actions';  
  50.           if (class_exists($class))  
  51.           {  
  52.             //初始化所有插件  
  53.             //$this 是本类的引用 
  54.             new $class($this);  
  55.           }  
  56.         }  
  57.       }  
  58.     }  
  59.     #此处做些日志记录方面的东西  
  60.   }  
  61.    
  62.   /**  
  63.    * 注册需要监听的插件方法(钩子)  
  64.    *  
  65.    * @param string $hook  
  66.    * @param object $reference  
  67.    * @param string $method  
  68.    */ 
  69.   function register($hook, &$reference$method)  
  70.   {  
  71.     //获取插件要实现的方法  
  72.     $key = get_class($reference).'->'.$method;  
  73.     //将插件的引用连同方法push进监听数组中  
  74.     $this->_listeners[$hook][$key] = array(&$reference$method);  
  75.     #此处做些日志记录方面的东西  
  76.   }  
  77.   /**  
  78.    * 触发一个钩子  
  79.    *  
  80.    * @param string $hook 钩子的名称  
  81.    * @param mixed $data 钩子的入参  
  82.    *  @return mixed  
  83.    */ 
  84.   function trigger($hook$data='')  
  85.   {  
  86.     $result = '';  
  87.     //查看要实现的钩子,是否在监听数组之中  
  88.     if (isset($this->_listeners[$hook]) && is_array($this->_listeners[$hook]) && count($this->_listeners[$hook]) > 0)  
  89.     {  
  90.       // 循环调用开始  
  91.       foreach ($this->_listeners[$hookas $listener)  
  92.       {  
  93.         // 取出插件对象的引用和方法  
  94.         $class =& $listener[0];  
  95.         $method = $listener[1];  
  96.         if(method_exists($class,$method))  
  97.         {  
  98.           // 动态调用插件的方法  
  99.           $result .= $class->$method($data);  
  100.         }  
  101.       }  
  102.     }  
  103.     #此处做些日志记录方面的东西  
  104.     return $result;  
  105.   }  
  106. }  
  107.    
  108. define(STPATH, "./"); 
  109.    
  110. $pluginManager=new PluginManager(); 
  111.    
  112. $pluginManager->trigger("demo"); 

demo插件文件:

  1. <?php 
  2. /** 
  3.  * 这是一个Hello World简单插件的实现 
  4.  * 
  5.  * @link    https://www.phpfensi.com/ 
  6.  */ 
  7. /** 
  8.  *需要注意的几个默认规则: 
  9.  *  1. 本插件类的文件名必须是action 
  10.  *  2. 插件类的名称必须是{插件名_actions} 
  11.  */ 
  12. class DEMO_actions 
  13.   //解析函数的参数是pluginManager的引用 
  14.   function __construct(&$pluginManager
  15.   { 
  16.     //注册这个插件 
  17.     //第一个参数是钩子的名称 
  18.     //第二个参数是pluginManager的引用 
  19.     //第三个是插件所执行的方法 
  20.     $pluginManager->register('demo'$this'say_hello'); 
  21.   } 
  22.    
  23.   function say_hello() 
  24.   { 
  25.     echo 'Hello World'
  26.   } 

Tags: PHP插件机制

分享到: