Heim > php教程 > php手册 > CodeIgniter源码阅读(6)Hook.php 扩展框架的实现原理

CodeIgniter源码阅读(6)Hook.php 扩展框架的实现原理

WBOY
Freigeben: 2016-06-06 19:52:08
Original
1042 Leute haben es durchsucht

看了hook.php的源码,就知道CI使用hook来进行扩展的原理了。 hook的基本知识http://codeigniter.org.cn/user_guide/general/hooks.html CI中hook的使用经历了一个:开启hook,定义hook,调用hook,执行hook的过程。 手册中已经告知了开启、定义、调用的方法

看了hook.php的源码,就知道CI使用hook来进行扩展的原理了。

hook的基本知识http://codeigniter.org.cn/user_guide/general/hooks.html

CI中hook的使用经历了一个:开启hook,定义hook,调用hook,执行hook的过程。

手册中已经告知了开启、定义、调用的方法。那么hook的实现原理是啥呢。

欢迎交流:mailto:actionbi2010@gmail.com 更多源码阅读

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class CI_Hooks {
    var $enabled        = FALSE; 
 //开启hook的标志,默认是关闭的。APPPATH/config/config.php中的配置也是默认关闭的,如果想使用hook,要在config.php中开启。
    var $hooks            = array();
//在_initialize()函数初始化的过程中将APPPATH/config/hook.php中定义的hook数组,引用到$this->hooks;
    var $in_progress    = FALSE;
//当一个hook执行的时候,会给标记 $in_process = TRUE ,是为了防止同一个hook被同时调用。
    function __construct()
    {
        $this->_initialize();
        log_message('debug', "Hooks Class Initialized");
    }
    function _initialize()
    {
        //初始化hook
        //判断config.php中是否开启hook
                //include(hook.php),将文件里定义的hook数组引用到$this->hooks
        //$this->enable = TRUE 
    }

    function _call_hook($which = '')//pre_system
    {
        //以pre_system挂钩点为例,当调用_call_hook('pre_system')时
        //确保$this->enable = TRUE && 定义了$this->hooks['pre_system']
        //如果是二维数组就遍历,依次_run_hook($this->hooks['pre_system'][$val])
        //如果是一维数组,那么直接_run_hook($this->hooks['pre_system'])
    }

    function _run_hook($data) //$data 是传递过来的hook数组
    {
        //$data 就是我们在APPPATH/config/hook.php 定义的hook数组
        //$hook['pre_controller'] = array(
                //               'class'    => 'MyClass',
                //                'function' => 'Myfunction',
                //               'filename' => 'Myclass.php',
                //                'filepath' => 'hooks',
                //                'params'   => array('beer', 'wine', 'snacks')
                //                );
        
        取出data里面的数据,加载  APPPATH.$data['filepath'].$data['filename'];
        实例化钩子类,调用function。应用到示例中就是 
        $this->in_process = TRUE;
        $Hook = new  MyClass();
        $Hook->Myfunction($params);
        $this->in_process = FALSE;
    }

}
?>
Nach dem Login kopieren

挂钩点可以挂多个hook,所以,当我们想扩展ci的时候,只需要将hook文件放到APPPATH文件夹下,然后
到APPPATH/config/hook.php中声明定义的hook的信息即可。那么系统运行到挂钩点的时候,会自动调用声明的hook。
如此一来便实现了可扩展性

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage