搜尋
首頁後端開發php教程CI框架源码阅读---------钩子类hooks.php_PHP教程

[php] 

/** 
 * CodeIgniter 
 * 
 * An open source application development framework for PHP 5.1.6 or newer 
 * 
 * @package     CodeIgniter 
 * @author      ExpressionEngine Dev Team 
 * @copyright   Copyright (c) 2008 - 2011, EllisLab, Inc. 
 * @license     http://codeigniter.com/user_guide/license.html 
 * @link        http://codeigniter.com 
 * @since       Version 1.0 
 * @filesource 
 */  
  
// ------------------------------------------------------------------------  
  
/** 
 * CodeIgniter Hooks Class 
 * 
 * Provides 提供 a mechanism 机制 to extend the base system without hacking. 
 * 用户手册地址:http://codeigniter.org.cn/user_guide/general/hooks.html 
 * @package     CodeIgniter 
 * @subpackage  Libraries 
 * @category    Libraries 
 * @author      ExpressionEngine Dev Team 
 * @link        http://codeigniter.com/user_guide/libraries/encryption.html 
 */  
class CI_Hooks {  
  
    /** 
     * Determines wether hooks are enabled 
     * 决定钩子是否启用 
     * 
     * @var bool 
     */  
    var $enabled        = FALSE;  
    /** 
     * List of all hooks set in config/hooks.php 
     * 
     * @var array 
     */  
    var $hooks          = array();  
    /** 
     * Determines wether hook is in progress, used to prevent 防止 infinte 无限 loops 
     * 
     * @var bool 
     */  
    var $in_progress    = FALSE;  
  
    /** 
     * Constructor 
     * 
     */  
    function __construct()  
    {  
        $this->_initialize();  
        log_message('debug', "Hooks Class Initialized");  
    }  
  
    // --------------------------------------------------------------------  
  
    /** 
     * Initialize the Hooks Preferences 参数,首选项 
     * 初始化钩子 
     * @access  private 
     * @return  void 
     */  
    function _initialize()  
    {  
        $CFG =& load_class('Config', 'core');  
  
        // If hooks are not enabled in the config file  
        // there is nothing else to do  
        // 如果配置文件中设置了是不允许hooks,则直接返回退出本函数。  
        if ($CFG->item('enable_hooks') == FALSE)  
        {  
            return;  
        }  
  
        // Grab the "hooks" definition file.  
        // 抓取钩子的定义文件  
        // If there are no hooks, we're done.  
        // 如果没有定义hooks.php没有定义$hook数组我们直接返回  
  
        if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'))  
        {  
            include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php');  
        }  
        elseif (is_file(APPPATH.'config/hooks.php'))  
        {  
            include(APPPATH.'config/hooks.php');  
        }  
  
  
        if ( ! isset($hook) OR ! is_array($hook))  
        {  
            return;  
        }  
          
        // 将hooks.php 中的$hook数组引用到$this->hooks  
        // 开启$this->enabled  
        $this->hooks =& $hook;  
        $this->enabled = TRUE;  
    }  
  
    // --------------------------------------------------------------------  
  
    /** 
     * Call Hook 
     * 外部其实就是调用这个_call_hook函数进行调用钩子程序。 
     * 而此方法中再调用_run_hook去执行相应的钩子。 
     * Calls a particular hook 
     * 
     * @access  private 
     * @param   string  the hook name 
     * @return  mixed 
     */  
    function _call_hook($which = '')  
    {  
        // 判断$this->enabled 是否开启 和 要调用的钩子是否在$htis->hooks中存在。  
        if ( ! $this->enabled OR ! isset($this->hooks[$which]))  
        {  
            return FALSE;  
        }  
          
        // 判断要调用的钩子是否是一个二维数组,如果是就遍历执行。  
        // 如果不是二维数组就直接执行  
        // 这里说明,在一个挂钩点可以执行多个钩子,就是通过定义二维数组来实现的。  
        if (isset($this->hooks[$which][0]) AND is_array($this->hooks[$which][0]))  
        {  
            foreach ($this->hooks[$which] as $val)  
            {  
                $this->_run_hook($val);  
            }  
        }  
        else  
        {  
            $this->_run_hook($this->hooks[$which]);  
        }  
  
        return TRUE;  
    }  
  
    // --------------------------------------------------------------------  
  
    /** 
     * Run Hook 
     * 运行钩子 
     * Runs a particular 特别的 hook 
     *  
     * @access  private 
     * @param   array   the hook details 
     * @return  bool 
     */  
    function _run_hook($data)  
    {  
        /* 
         * $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是不是数组如果不是则返回 
         *  
         */  
        if ( ! is_array($data))  
        {  
            return FALSE;  
        }  
  
        // -----------------------------------  
        // Safety - Prevents run-away loops  
        // -----------------------------------  
  
        // If the script being called happens to have the same  
        // hook call within it a loop can happen  
        // 如果调用某一个hook,执行某些脚本,而有可能这些脚本里面再会触发其它hook  
        // 如果这个其它hook里面又包含了当前  
        // 的hook,那么就会进入死循环,这个in_progress的存在就是阻止这种情况。  
          
        if ($this->in_progress == TRUE)  
        {  
            return;  
        }  
  
        // -----------------------------------  
        // 取出data里面的数据,加载  APPPATH.$data['filepath'].$data['filename'];  
        // Set file path  
        // -----------------------------------  
  
        if ( ! isset($data['filepath']) OR ! isset($data['filename']))  
        {  
            return FALSE;  
        }  
  
        $filepath = APPPATH.$data['filepath'].'/'.$data['filename'];  
  
        if ( ! file_exists($filepath))  
        {  
            return FALSE;  
        }  
  
        // -----------------------------------  
        // Set class/function name  
        // -----------------------------------  
  
        $class      = FALSE;  
        $function   = FALSE;  
        $params     = '';  
        // 取出$hooks 中的class function params   
        if (isset($data['class']) AND $data['class'] != '')  
        {  
            $class = $data['class'];  
        }  
  
        if (isset($data['function']))  
        {  
            $function = $data['function'];  
        }  
  
        if (isset($data['params']))  
        {  
            $params = $data['params'];  
        }  
  
        if ($class === FALSE AND $function === FALSE)  
        {  
            return FALSE;  
        }  
  
        // -----------------------------------  
        // Set the in_progress flag  
        // 在开始执行钩子相应的程序之前,先把当前hook的状态设为正在运行中。  
        // -----------------------------------  
          
        $this->in_progress = TRUE;  
  
        // -----------------------------------  
        // Call the requested class and/or function  
        // 包含钩子文件并实例化类,调用函数  
        // -----------------------------------  
  
        if ($class !== FALSE)  
        {  
            if ( ! class_exists($class))  
            {  
                require($filepath);  
            }  
  
            $HOOK = new $class;  
            $HOOK->$function($params);  
        }  
        else  
        {  
            if ( ! function_exists($function))  
            {  
                require($filepath);  
            }  
  
            $function($params);  
        }  www.2cto.com
        // 执行相应程序完毕后,重新把当前hook的状态改为非运行中  
        // 以让它可以再次被触发。  
        $this->in_progress = FALSE;  
        return TRUE;  
    }  
  
}  
  
// END CI_Hooks class  
  
/* End of file Hooks.php */  
/* Location: ./system/core/Hooks.php */  
 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/477711.htmlTechArticle[php] ?php if ( ! defined(BASEPATH)) exit(No direct script access allowed); /** * CodeIgniter * * An open source application development framework for PHP 5.1.6 or newer * * @packag...
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何防止會話固定攻擊?如何防止會話固定攻擊?Apr 28, 2025 am 12:25 AM

防止會話固定攻擊的有效方法包括:1.在用戶登錄後重新生成會話ID;2.使用安全的會話ID生成算法;3.實施會話超時機制;4.使用HTTPS加密會話數據,這些措施能確保應用在面對會話固定攻擊時堅不可摧。

您如何實施無會話身份驗證?您如何實施無會話身份驗證?Apr 28, 2025 am 12:24 AM

實現無會話身份驗證可以通過使用JSONWebTokens(JWT)來實現,這是一種基於令牌的認證系統,所有的必要信息都存儲在令牌中,無需服務器端會話存儲。 1)使用JWT生成和驗證令牌,2)確保使用HTTPS防止令牌被截獲,3)在客戶端安全存儲令牌,4)在服務器端驗證令牌以防篡改,5)實現令牌撤銷機制,如使用短期訪問令牌和長期刷新令牌。

PHP會議有哪些常見的安全風險?PHP會議有哪些常見的安全風險?Apr 28, 2025 am 12:24 AM

PHP會話的安全風險主要包括會話劫持、會話固定、會話預測和會話中毒。 1.會話劫持可以通過使用HTTPS和保護cookie來防範。 2.會話固定可以通過在用戶登錄前重新生成會話ID來避免。 3.會話預測需要確保會話ID的隨機性和不可預測性。 4.會話中毒可以通過對會話數據進行驗證和過濾來預防。

您如何銷毀PHP會議?您如何銷毀PHP會議?Apr 28, 2025 am 12:16 AM

銷毀PHP會話需要先啟動會話,然後清除數據並銷毀會話文件。 1.使用session_start()啟動會話。 2.用session_unset()清除會話數據。 3.最後用session_destroy()銷毀會話文件,確保數據安全和資源釋放。

如何更改PHP中的默認會話保存路徑?如何更改PHP中的默認會話保存路徑?Apr 28, 2025 am 12:12 AM

如何改變PHP的默認會話保存路徑?可以通過以下步驟實現:在PHP腳本中使用session_save_path('/var/www/sessions');session_start();設置會話保存路徑。在php.ini文件中設置session.save_path="/var/www/sessions"來全局改變會話保存路徑。使用Memcached或Redis存儲會話數據,如ini_set('session.save_handler','memcached');ini_set(

您如何修改PHP會話中存儲的數據?您如何修改PHP會話中存儲的數據?Apr 27, 2025 am 12:23 AM

tomodifyDataNaphPsession,startTheSessionWithSession_start(),然後使用$ _sessionToset,修改,orremovevariables.1)startThesession.2)setthesession.2)使用$ _session.3)setormodifysessessvariables.3)emovervariableswithunset()

舉一個在PHP會話中存儲數組的示例。舉一個在PHP會話中存儲數組的示例。Apr 27, 2025 am 12:20 AM

在PHP會話中可以存儲數組。 1.啟動會話,使用session_start()。 2.創建數組並存儲在$_SESSION中。 3.通過$_SESSION檢索數組。 4.優化會話數據以提升性能。

垃圾收集如何用於PHP會議?垃圾收集如何用於PHP會議?Apr 27, 2025 am 12:19 AM

PHP會話垃圾回收通過概率機制觸發,清理過期會話數據。 1)配置文件中設置觸發概率和會話生命週期;2)可使用cron任務優化高負載應用;3)需平衡垃圾回收頻率與性能,避免數據丟失。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

記事本++7.3.1

記事本++7.3.1

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