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

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

Jun 06, 2016 pm 07:52 PM
codeigniter 擴充 原始碼 閱讀

看了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-&gt;_initialize();
        log_message('debug', "Hooks Class Initialized");
    }
    function _initialize()
    {
        //初始化hook
        //判断config.php中是否开启hook
                //include(hook.php),将文件里定义的hook数组引用到$this-&gt;hooks
        //$this-&gt;enable = TRUE 
    }

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

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

}
?&gt;
登入後複製

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在CodeIgniter中實作自訂中介軟體 如何在CodeIgniter中實作自訂中介軟體 Jul 29, 2023 am 10:53 AM

如何在CodeIgniter中實作自訂中介軟體

PHP 函數的擴充和第三方模組 PHP 函數的擴充和第三方模組 Apr 13, 2024 pm 02:12 PM

PHP 函數的擴充和第三方模組

從頭到尾:如何使用php擴充cURL進行HTTP請求 從頭到尾:如何使用php擴充cURL進行HTTP請求 Jul 29, 2023 pm 05:07 PM

從頭到尾:如何使用php擴充cURL進行HTTP請求

CENTOS7下如何安裝mbstring擴充? CENTOS7下如何安裝mbstring擴充? Jan 06, 2024 pm 09:59 PM

CENTOS7下如何安裝mbstring擴充?

如何在沉浸式閱讀器中使用Microsoft Reader Coach 如何在沉浸式閱讀器中使用Microsoft Reader Coach Mar 09, 2024 am 09:34 AM

如何在沉浸式閱讀器中使用Microsoft Reader Coach

如何使用極光推播擴展,在PHP應用中實現大量訊息推播功能 如何使用極光推播擴展,在PHP應用中實現大量訊息推播功能 Jul 25, 2023 pm 08:07 PM

如何使用極光推播擴展,在PHP應用中實現大量訊息推播功能

CodeIgniter中間件:加速應用程式的反應速度和頁面渲染 CodeIgniter中間件:加速應用程式的反應速度和頁面渲染 Jul 28, 2023 pm 06:51 PM

CodeIgniter中間件:加速應用程式的反應速度和頁面渲染

idea如何查看tomcat的源碼 idea如何查看tomcat的源碼 Jan 25, 2024 pm 02:01 PM

idea如何查看tomcat的源碼

See all articles