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

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

投稿:junjie 字体:[增加 减小] 类型:转载

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

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

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

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

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

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

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

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

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

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

1.插件安装及卸载

2.插件打开与关闭

3.插件信息获取

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

5.插件主体

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

1.插件的注册和初始化

2.判断激活条件

3.钩子激活

4.运行插件

实例代码:

?


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

<?php

/**

* PluginManager Class

*

* 插件机制的实现核心类

*

* @link http://www.jb51.net/

*/

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();#这个函数请自行实现

 

    //函数实现后的最终数据结构效果如下

    $plugins=array(array("directory"=>"demo",

    "name"=>"DEMO"));

 

 

    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))

          {

            //初始化所有插件

            //$this 是本类的引用

            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;

  }

}

 

define(STPATH, "./");

 

$pluginManager=new PluginManager();

 

$pluginManager->trigger("demo");

demo插件文件:

?


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

<?php

/**

 * 这是一个Hello World简单插件的实现

 *

 * @link    http://www.jb51.net/

 */

/**

 *需要注意的几个默认规则:

 *  1. 本插件类的文件名必须是action

 *  2. 插件类的名称必须是{插件名_actions}

 */

class DEMO_actions

{

  //解析函数的参数是pluginManager的引用

  function __construct(&$pluginManager)

  {

    //注册这个插件

    //第一个参数是钩子的名称

    //第二个参数是pluginManager的引用

    //第三个是插件所执行的方法

    $pluginManager->register(‘demo‘, $this, ‘say_hello‘);

  }

 

  function say_hello()

  {

    echo ‘Hello World‘;

  }

}

时间: 2024-08-07 04:33:24

php中的插件机制原理和实例的相关文章

Atitit&#160;插件机制原理与设计微内核&#160;c#&#160;java&#160;的实现attilax总结

Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结 1. 微内核与插件的优点1 2. 插件的注册与使用2 2.1. Ioc容器中注册插件2 2.2. 启动器微内核启动3 3. 插件的俩种执行策略3 3.1. 必须手动接续,否则自动终止(推荐)3 3.2. 必须手动throw  stop ex终止,负责自动接续..4 4. 插件链的生成原理4 5. -------code4 6. 参考7 1. 微内核与插件的优点 但凡有生命力的产品,都是在扩展性方面设计的比较好的,因

深入解读PHP插件机制原理

深入解读PHP插件机制原理 PHP插件机制是指一类特定的功能模块,主要特点有:可以随时激活删除使用,灵活性较强.大家可以在文章中获得这一机制的相关知识. AD:51CTO移动APP安全沙龙!马上要爆满,手慢没座位! 我们在这篇文章中主要向大家讲了一些PHP插件机制的实现方法.希望大家可以通过本问介绍的内容初步了解对PHP插件机制的认识. PHP函数restore()重置PHP配置环境 PHP数据缓存类必要性分析 PHP创建PPT文档范例解析 总结各种不同PHP控制语句 PHP INCLUDE语句

mybatis插件机制原理

mybatis插件机制及分页插件原理 参考链接:mybatis插件机制及分页插件原理 如何编写一个自定义mybatis插件 参考链接:mybatis 自定义插件的使用 原文地址:https://www.cnblogs.com/jxxblogs/p/12150439.html

ExtJS中DragDrop插件的一些使用实例

DragDrop这个插件为GridView提供了拖放功能,另外一个插件TreeViewDragDrop为TreeView提供拖拽功能,这里主要是对DragDrop插件的使用做一些说明. 使用这个插件源于目前在做的一个项目:需求方要求新增一个可以在页面上通过拖拽对数据进行排序的功能,因之前数据需要用户手动输入一个序号来完成数据的排序. 目前官方文档中对该插件的使用,有在两个列表页之间拖拽数据和对列表页某一单元格中的数据的拖拽的实例.没有在同一列表页中拖拽一行数据的实例. 直接代码: Ext.onR

MyBatis 源码分析 - 插件机制

1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 MyBatis 为例,我们可基于 MyBatis 插件机制实现分页.分表,监控等功能.由于插件和业务无关,业务也无法感知插件的存在.因此可以无感植入插件,在无形中增强功能. 开发 MyBatis 插件需要对 MyBatis 比较深了解才行,一般来说最好能够掌握 MyBatis 的源码,门槛相对较高.本篇

Android 插件化原理解析——插件加载机制

上文 Activity生命周期管理 中我们地完成了『启动没有在AndroidManifest.xml中显式声明的Activity』的任务:通过Hook AMS和拦截ActivityThread中H类对于组件调度我们成功地绕过了AndroidMAnifest.xml的限制. 但是我们启动的『没有在AndroidManifet.xml中显式声明』的Activity和宿主程序存在于同一个Apk中:通常情况下,插件均以独立的文件存在甚至通过网络获取,这时候插件中的Activity能否成功启动呢? 要启动

Qt5的插件机制(1)--Qt 框架中的插件加载机制概述

概述 Qt的源码中通过 Q<pluginType>Factory.Q<pluginType>Plugin 和 Q<pluginType> 这三个类实现了Qt的插件加载机制, 这个机制可用于加载特定种类的插件.比如通过 QPlatformIntegrationFactory\QPlatformIntegrationPlugin\QPlatformIntegration 三个类可以实现平台类QPA插件(PlatformIntegration)的加载,通过QPlatformI

typecho流程原理和插件机制浅析(第二弹)

typecho流程原理和插件机制浅析(第二弹) 兜兜 393 2014年04月02日 发布 推荐 1 推荐 收藏 14 收藏,3.7k 浏览 上一次说了 Typecho 大致的流程,今天简单说一下插件机制和插件的编写方法. 还是先上index.php if ([email protected]include_once 'config.inc.php') { file_exists('./install.php') ? header('Location: install.php') : print

WordPress 插件机制的简单用法和原理(Hook 钩子)

WordPress 的插件机制实际上只的就是这个 Hook 了,它中文被翻译成钩子,允许你参与 WordPress 核心的运行,是一个非常棒的东西,下面我们来详细了解一下它. PS:本文只是简单的总结一下,更多用法还是要参考文中给出的函数. 钩子分类 钩子分为两种,一种叫做动作(action),还有一种叫做过滤器(filter).这两种钩子实现原理基本一样,后边会讲到,使用上的区别在于过滤器有返回值,而动作没有. 动作的理念是让你在一种情况或者一个特别的位置执行一些函数,比如发送一封邮件等:过滤