精华内容
下载资源
问答
  • php插件机制

    2016-05-23 17:14:14
    插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现),它的特点是:当你需要它的时候激活它,不需要它的时候禁用/删除它;且无论是激活还是禁用都不影响系统核心模块的运行,也...一个健壮的插件机制

    插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现),它的特点是:当你需要它的时候激活它,不需要它的时候禁用/删除它;且无论是激活还是禁用都不影响系统核心模块的运行,也就是说插件是一种非侵入式的模块化设计,实现了核心程序与插件程序的松散耦合。一个典型的例子就是Wordpress中众多的第三方插件,比如Akimet插件用于对用户的评论进行Spam过滤。

    一个健壮的插件机制,我认为必须具备以下特点:

    • 插件的动态监听和加载(Lookup)
    • 插件的动态触发
    • 以上两点的实现均不影响核心程序的运行

    要在程序中实现插件,我们首先应该想到的就是定义不同的钩子(Hooks);“钩子”是一个很形象的逻辑概念,你可以认为它是系统预留的插件触发条件。它的逻辑原理如下:当系统执行到某个钩子时,会判断这个钩子的条件是否满足;如果满足,会转而先去调用钩子所制定的功能,然后返回继续执行余下的程序;如果不满足,跳过即可。这有点像汇编中的“中断保护”逻辑。

    某些钩子可能是系统事先就设计好的,比如之前我举的关于评论Spam过滤的钩子,通常它已经由核心系统开发人员设计进了评论的处理逻辑中;另外一类钩子则可能是由用户自行定制的(由第三方开发人员制定),通常存在于表现层,比如一个普通的PHP表单显示页面中。

    可能你感觉上面的话比较无聊,让人昏昏欲睡;但是要看懂下面我写的代码,理解以上的原理是必不可少的。

    下面进行PHP中插件机制的核心实现,整个机制核心分为三大块:

    • 一个插件经理类:这是核心之核心。它是一个应用程序全局Global对象。它主要有三个职责: 
    • 负责监听已经注册了的所有插件,并实例化这些插件对象。
    • 负责注册所有插件。
    • 当钩子条件满足时,触发对应的对象方法。
    • 插件的功能实现:这大多由第三方开发人员完成,但需要遵循一定的规则,这个规则是插件机制所规定的,因插件机制的不同而不同,下面的显示代码你会看到这个规则。
    • 插件的触发:也就是钩子的触发条件。具体来说这是一小段代码,放置在你需要插件实现的地方,用于触发这个钩子。


    原理讲了一大堆,下面看看我的实现方案:


    <?
    /** 
     * 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; 
        } 
    } 
    ?>
    
    以上代码加上注释不超过100行,就完成了整个插件机制的核心。需要再次说明的是,你必须将它设置成全局类,在所有需要用到插件的地方,优先加载。用#注释的地方是你需要自行完成的部分,包括插件的获取和日志记录等等。

    下面是一个简单插件的实现。

    <?
    /** 
     * 这是一个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','');

    展开全文
  • PHP插件机制写法

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

    PHP插件机制写法



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


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


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


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


    三、插件运行(插件功能的实现)


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


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


    二、插件的动态触发(插件的运行


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


    一、插件安装及卸载


    二、插件打开与关闭


    三、插件信息获取


    四、插件调度(插件经理)


    五、插件主体


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


    一、插件的注册和初始化


    二、判断激活条件


    三、钩子激活


    四、运行插件


    代码就不先写了,以后会贴上来,今天到此结束吧。

    展开全文
  • php插件机制实现原理

    2019-10-05 06:26:05
    插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者...一个健壮的PHP插件机制,我认为必须具备以下特点:1. 插件的动态监听和加载(Lookup)2. 插件的动态触发以上两点的PHP插件机制实现均不影响核心...

    插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现)

    它的特点: 
    1. 随时安装、卸载、激活、禁用
    2. 无论什么状态都不影响系统核心模块的运行,
    3. 是一种非侵入式的模块化设计,实现了核心程序与插件程序的松散耦合。

    一个健壮的PHP插件机制,我认为必须具备以下特点: 
    1. 插件的动态监听和加载(Lookup)
    2. 插件的动态触发 
    以上两点的PHP插件机制实现均不影响核心程序的运行

    钩子(Hooks) 
    要在程序中实现插件,我们首先应该想到的就是定义不同的钩子(Hooks);“钩子”是一个很形象的逻辑概念,你可以认为它是系统预留的插件触发条件。
    它的逻辑原理如下:

    当系统执行到某个钩子时,会判断这个钩子的条件是否满足;

    如果满足,会转而先去调用钩子所制定的功能,然后返回继续执行余下的程序;

    如果不满足,跳过即可。这有点像汇编中的“中断保护”逻辑。

    某些钩子可能是系统事先就设计好的,比如之前我举的关于评论Spam过滤的钩子,通常它已经由核心系统开发人员设计进了评论的处理逻辑中;另外一类钩子则可能是由用户自行定制的(由第三方开发人员制定),通常存在于表现层,比如一个普通的PHP表单显示页面中。

    整个机制核心分为三大块:

    1.一个插件经理类:

    这是核心之核心。它是一个应用程序全局Global对象。它主要有三个职责: 
    负责监听已经注册了的所有插件,并实例化这些插件对象。 
    负责注册所有插件。 
    当钩子条件满足时,触发对应的对象方法。

    2.插件的功能实现:

    这大多由第三方开发人员完成,但需要遵循一定的规则,这个规则是插件机制所规定的,因插件机制的不同而不同,下面的显示代码你会看到这个规则。

    3.插件的触发:

    也就是钩子的触发条件。具体来说这是一小段代码,放置在你需要插件实现的地方,用于触发这个钩子。

     

    插件经理PluginManager类:
     1 <?php
     2 
     3 class PluginManager {
     4 
     5     private $_listeners = array();
     6 
     7     public function __construct() {
     8         //这里$plugin数组包含我们获取已经由用户
     9         //激活的插件信息
    10         //为演示方便,我们假定$plugin中至少包含  
    11         //$plugin = array(  
    12         // 'name' => '插件名称',  
    13         // 'directory'=>'插件安装目录'  
    14         //);  
    15         $plugins = array(
    16             array(
    17                 'name' => '插件名称',
    18                 'directory' => '插件安装目录'
    19             )
    20         );
    21         //这个函数请自行实现  
    22         if ($plugins) {
    23             foreach ($plugins as $plugin) {
    24                 ////假定每个插件文件夹中包含一个actions.
    25                 //php文件,它是插件的具体实现
    26                 if (@file_exists(STPATH . 'plugins/' . $plugin['directory'] . '/actions.php')) {
    27                     include_once(STPATH . 'plugins/' . $plugin['directory'] . '/actions.php');
    28                     $class = $plugin['name'] . '_actions';
    29                     if (class_exists($class)) {
    30                         //初始化所有插件
    31                         new $class($this);
    32                     }
    33                 }
    34             }
    35         }
    36         //此处做些日志记录方面的东西  
    37     }
    38 
    39     function register($hook, &$reference, $method) {
    40         //获取插件要实现的方法  
    41         $key = get_class($reference) . '->' . $method;
    42         //将插件的引用连同方法push进监听数组中  
    43         $this->_listeners[$hook][$key] =
    44                 array(&$reference, $method);
    45         //此处做些日志记录方面的东西  
    46     }
    47 
    48     function trigger($hook, $data = '') {
    49         $result = '';
    50         //查看要实现的钩子,是否在监听数组之中  
    51         if (isset($this->_listeners[$hook]) && is_array($this->_listeners[$hook]) && count($this->_listeners[$hook]) > 0) {
    52             // 循环调用开始  
    53             foreach ($this->_listeners[$hook] as $listener) {
    54                 // 取出插件对象的引用和方法  
    55                 $class = & $listener[0];
    56                 $method = $listener[1];
    57                 if (method_exists($class, $method)) {
    58                     // 动态调用插件的方法  
    59                     $result .= $class->$method($data);
    60                 }
    61             }
    62         }
    63         //此处做些日志记录方面的东西  
    64         return $result;
    65     }
    66 
    67 }
    68 
    69 ?>

     

    转载于:https://www.cnblogs.com/lujiang/p/7350704.html

    展开全文
  • php插件机制开发模式实现方法!
  • 深入解读PHP插件机制原理 PHP插件机制是指一类特定的功能模块,主要特点有:可以随时激活删除使用,灵活性较强。大家可以在文章中获得这一机制的相关知识。 AD:51CTO移动APP安全沙龙!马上要爆满,手慢没座位!...

    深入解读PHP插件机制原理

    PHP插件机制是指一类特定的功能模块,主要特点有:可以随时激活删除使用,灵活性较强。大家可以在文章中获得这一机制的相关知识。

    我们在这篇文章中主要向大家讲了一些PHP插件机制的实现方法。希望大家可以通过本问介绍的内容初步了解对PHP插件机制的认识。

    插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现),它的特点是:当你需要它的时候激活它,不需要它的时候禁用/删除 它;且无论是激活还是禁用都不影响系统核心模块的运行,也就是说插件是一种非侵入式的模块化设计,实现了核心程序与插件程序的松散耦合。一个典型的例子就 是Wordpress中众多的第三方插件,比如Akimet插件用于对用户的评论进行Spam过滤。

    一个健壮的PHP插件机制,我认为必须具备以下特点:

    插件的动态监听和加载(Lookup)

    插件的动态触发

    以上两点的PHP插件机制实现均不影响核心程序的运行

    要在程序中实现插件,我们首先应该想到的就是定义不同的钩子(Hooks);“钩子”是一个很形象的逻辑概念,你可以认为它是系统预留的插件触发条 件。它的逻辑原理如下:当系统执行到某个钩子时,会判断这个钩子的条件是否满足;如果满足,会转而先去调用钩子所制定的功能,然后返回继续执行余下的程 序;如果不满足,跳过即可。这有点像汇编中的“中断保护”逻辑。

    某些钩子可能是系统事先就设计好的,比如之前我举的关于评论Spam过滤的钩子,通常它已经由核心系统开发人员设计进了评论的处理逻辑中;另外一类钩子则可能是由用户自行定制的(由第三方开发人员制定),通常存在于表现层,比如一个普通的PHP表单显示页面中。

    可能你感觉上面的话比较无聊,让人昏昏欲睡;但是要看懂下面我写的代码,理解以上PHP插件机制的原理是必不可少的。

    下面进行PHP中插件机制的核心实现,整个机制核心分为三大块:

    一个插件经理类:这是核心之核心。它是一个应用程序全局Global对象。它主要有三个职责:

    负责监听已经注册了的所有插件,并实例化这些插件对象。

    负责注册所有插件。

    当钩子条件满足时,触发对应的对象方法。

    插件的功能实现:这大多由第三方开发人员完成,但需要遵循一定的规则,这个规则是插件机制所规定的,因插件机制的不同而不同,下面的显示代码你会看到这个规则。

    插件的触发:也就是钩子的触发条件。具体来说这是一小段代码,放置在你需要插件实现的地方,用于触发这个钩子。

    PHP插件机制原理讲了一大堆,下面看看我的实现方案:

    插件经理PluginManager类:

    以下为PHP插件机制引用的内容:

    1. < ?  
    2. class PluginManager  
    3. {  
    4. private $_listeners = array();  
    5. public function __construct()  
    6. {  
    7. #这里$plugin数组包含我们获取已经由用户
      激活的插件信息  
    8. #为演示方便,我们假定$plugin中至少包含  
    9. #$plugin = array(  
    10. # 'name' => '插件名称',  
    11. # 'directory'=>'插件安装目录'  
    12. #);  
    13. $plugins = get_active_plugins();
      #这个函数请自行实现  
    14. if($plugins)  
    15. {  
    16. foreach($plugins as $plugin)  
    17. {//假定每个插件文件夹中包含一个actions.
      php文件,它是插件的具体实现  
    18. if (@file_exists(STPATH .'plugins/'.
      $plugin['directory'].'/actions.php'))  
    19. {  
    20. include_once(STPATH .'plugins/'.
      $plugin['directory'].'/actions.php');  
    21. $class = $plugin['name'].'_actions';  
    22. if (class_exists($class))   
    23. {  
    24. //初始化所有插件  
    25. new $class($this);  
    26. }  
    27. }  
    28. }  
    29. }  
    30. #此处做些日志记录方面的东西  
    31. }  
    32. function register($hook, &$reference,
       $method)  
    33. {  
    34. //获取插件要实现的方法  
    35. $key = get_class($reference).'->'.$method;  
    36. //将插件的引用连同方法push进监听数组中  
    37. $this->_listeners[$hook][$key] = 
      array(&$reference, $method);  
    38. #此处做些日志记录方面的东西  
    39. }  
    40. function trigger($hook, $data='')  
    41. {  
    42. $result = '';  
    43. //查看要实现的钩子,是否在监听数组之中  
    44. if (isset($this->_listeners[$hook]) 
      && is_array($this->_listeners[$hook]) 
      && count($this->_listeners[$hook]) > 0)  
    45. {  
    46. // 循环调用开始  
    47. foreach ($this->_listeners[$hook] as $listener)  
    48. {  
    49. // 取出插件对象的引用和方法  
    50. $class =& $listener[0];  
    51. $method = $listener[1];  
    52. if(method_exists($class,$method))  
    53. {  
    54. // 动态调用插件的方法  
    55. $result .= $class->$method($data);  
    56. }  
    57. }  
    58. }  
    59. #此处做些日志记录方面的东西  
    60. return $result;  
    61. }  
    62. }  
    63. ?> 

    以上代码加上注释不超过100行,就完成了整个插件机制的核心。需要再次说明的是,你必须将它设置成全局类,在所有需要用到插件的地方,优先加载。用#注释的地方是你需要自行完成的部分,包括PHP插件机制的获取和日志记录等等。

    转载于:https://www.cnblogs.com/shsgl/p/4572998.html

    展开全文
  • PHP插件机制原理

    2011-08-25 18:06:38
    我们在这篇文章中主要向大家讲了一些PHP插件机制的实现方法。希望大家可以通过本问介绍的内容初步了解对PHP插件机制的认识。 插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现),它的特点是...
  • php 插件机制原理

    2018-03-13 06:31:29
    当然php插件机制的实现不仅仅是这一种方法。关于此函数的运用,请去看手册吧。 一个插件需要三个条件: 插件的支持函数,进行插件的功能实现 插件的Hook点,我们称为钩子埋入点,就是在什么地方这个插件要执行。 ...
  • php插件机制原理

    千次阅读 2016-09-27 10:35:13
    最近在找关于插件相关的资料,但是网上少有关于详细解释插件如何写的书,零散的找了些资料,先存这里。 插件很多从事互联网行业或者开发的人员来不是很陌生,wordpress之所以为什么那么受欢迎,很大部分...
  • PHP插件机制的一种实现方案. 这篇文章的出发点是我对插件机制的理解,及其在PHP中的实现。此方案仅是插件机制PHP中的
  • 主要介绍了php利用反射实现插件机制的方法,涉及php反射机制与插件的实现技巧,需要的朋友可以参考下
  • /** * STBLOG PluginManager Class * * 插件机制的实现核心类 * * @package STBLOG * @subpackage Libraries * @category Libraries * @author Saturn * @link http://www.cnsaturn.com/ */ class PluginManager { ...
  • PHP项目中很多用到插件的地方,更尤其是基础程序写成之后很多功能由第三方完善开发的时候,更能用到插件机制,现在说一下插件的实现。特点是无论你是否激活,都不影响主程序的运行,即使是删除也不会影响。 从一个...
  • 一篇不错的关于php插件机制原理文章 这篇文章的出发点是我对插件机制的理解,及其在PHP中的实现。此方案仅是插件机制在PHP中的实现方案之一,写下来和大家分享,欢迎大家一起讨论。 插件,亦即Plug-in,是指一...
  • PHP反射API实现插件机制interface Iplugin{public static function getName();}class ContactPlugin implements Iplugin{public static function getName(){return __class__;}public static function getMenu(){...
  • PHP中的插件机制原理和实例 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了PHP中的插件机制原理和实例,文中例子主要借鉴了网上一些网友的方式做了稍微的改造,需要的朋友可以参考下 PHP项目中很...
  • php中的钩子,hook插件机制 对"钩子"这个概念其实不熟悉,最近看到一个php框架中用到这种机制来扩展项目,所以大概来了解下。 hook插件机制的基本思想: 在项目代码中,你认为要...
  • 插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现),它的特点是:当你需要它的时候激活它,不需要它的时候禁用/删除它;且无 论是激活还是禁用都不影响系统核心模块的...一个健壮的插件机制,我...
  • hook插件机制的基本思想: 在项目代码中,你认为要扩展(暂时不扩展)的地方放置一个钩子函数,等需要扩展的时候,把需要实现的类和函数挂载到这个钩子上,就可以实现扩展了。 思想就是这样听起来比较笼统,看一个...
  • 这篇文章主要介绍了PHP基于反射机制实现插件的可插拔设计,结合实例形式较为详细的分析了插件的功能、反射机制原理与实现可插拔设计的操作步骤,需要的朋友可以参考下本文实例讲述了PHP基于反射机制实现插件的可插拔...
  • 这篇文章的出发点是我对插件机制的理解,及其在PHP中的实现。此方案仅是插件机制PHP中的实现方案之一,写下来和大家分享,欢迎大家一起讨论。 插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 766
精华内容 306
热门标签
关键字:

php插件机制