• php实现网站插件机制的方法


    php实现网站插件机制的方法

     
    这些天想作一个在网站中实现插件的功能,谷歌了一下,发现一篇文章感觉对我帮助很大,帖出来和大家分享,废话不多说,直接帖出代码供大家分析.
     

    首先是插件的管理类的实现:

    复制代码 代码如下:

    <?
    /**
    * 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!

  • 相关阅读:
    【Python图像特征的音乐序列生成】解析ABC格式的文件(修改版)
    【Python图像特征的音乐序列生成】关于数据库到底在哪里下载
    假期周进度报告2
    假期周进度报告1
    河北省科技创新平台系统头脑风暴会
    问题账户需求分析
    2018年春季个人阅读计划
    软件需求与分析读后感
    《需求工程——软件建模与分析》读后感3
    《需求工程——软件建模与分析》读后感2
  • 原文地址:https://www.cnblogs.com/shsgl/p/4572993.html
Copyright © 2020-2023  润新知