主頁(yè) > 知識(shí)庫(kù) > CodeIgniter框架鉤子機(jī)制實(shí)現(xiàn)方法【hooks類(lèi)】

CodeIgniter框架鉤子機(jī)制實(shí)現(xiàn)方法【hooks類(lèi)】

熱門(mén)標(biāo)簽:桂陽(yáng)公司如何做地圖標(biāo)注 神龍斗士電話(huà)機(jī)器人 企業(yè)400電話(huà)辦理多少費(fèi)用 萍鄉(xiāng)商鋪地圖標(biāo)注 合肥企業(yè)外呼系統(tǒng)線(xiàn)路 代理打電話(huà)機(jī)器人 太原400電話(huà)申請(qǐng)流程 電信外呼系統(tǒng)多少錢(qián)一個(gè)月 宿州正規(guī)外呼系統(tǒng)軟件

本文實(shí)例講述了CodeIgniter框架鉤子機(jī)制實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:

記得上一次去到喜啦面試,面試官問(wèn)我一個(gè)問(wèn)題:codeigniter是如何實(shí)現(xiàn)鉤子機(jī)制的?

當(dāng)時(shí)答不上來(lái),后來(lái)回來(lái)之后查了一些資料才明白,所以在這里記錄一下:

codeigniter的鉤子是這樣實(shí)現(xiàn)的:首先在框架的核心文件system/core/CodeIniter.php文件的 122行,載入Hooks類(lèi),接著在該文件中定義了幾個(gè)掛載點(diǎn),比如pre_system(129行)、post_controller_constructor(295行)等,并在這些掛載點(diǎn)上面執(zhí)行hooks類(lèi)的_call_hook() 方法。

另附codeigniter的hooks類(lèi)的源代碼:

?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 5.1.6 or newer
 *
 * @package   CodeIgniter
 * @author   EllisLab Dev Team
 * @copyright    Copyright (c) 2008 - 2014, EllisLab, Inc.
 * @copyright    Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
 * @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.
 *
 * @package   CodeIgniter
 * @subpackage Libraries
 * @category  Libraries
 * @author   EllisLab 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

    if ($CFG->item('enable_hooks') == FALSE)
    {
      return;
    }

    // Grab the "hooks" definition file.
    // If there are no hooks, we're done.

    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;
    }

    $this->hooks = $hook;
    $this->enabled = TRUE;
  }

  // --------------------------------------------------------------------

  /**
   * Call Hook
   *
   * Calls a particular hook
   *
   * @access private
   * @param  string the hook name
   * @return mixed
   */
  function _call_hook($which = '')
  {
    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)
  {
    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

    if ($this->in_progress == TRUE)
    {
      return;
    }

    // -----------------------------------
    // 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    = '';

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

    $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);
    }

    $this->in_progress = FALSE;
    return TRUE;
  }

}

// END CI_Hooks class

/* End of file Hooks.php */
/* Location: ./system/core/Hooks.php */

可以看出codeigniter實(shí)現(xiàn)鉤子機(jī)制的方式不夠優(yōu)雅,其實(shí)完全可以使用觀察者模式來(lái)實(shí)現(xiàn)鉤子機(jī)制,將掛載點(diǎn)當(dāng)做監(jiān)聽(tīng)的事件。

更多關(guān)于CodeIgniter相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《codeigniter入門(mén)教程》、《CI(CodeIgniter)框架進(jìn)階教程》、《php優(yōu)秀開(kāi)發(fā)框架總結(jié)》、《ThinkPHP入門(mén)教程》、《ThinkPHP常用方法總結(jié)》、《Zend FrameWork框架入門(mén)教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》

希望本文所述對(duì)大家基于CodeIgniter框架的PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • CodeIgniter鉤子用法實(shí)例詳解
  • CI(CodeIgniter)框架配置
  • Nginx下配置codeigniter框架方法
  • CodeIgniter框架URL路由總結(jié)
  • PHP CodeIgniter框架的工作原理研究
  • CI框架擴(kuò)展系統(tǒng)核心類(lèi)的方法分析
  • CI框架源碼解讀之利用Hook.php文件完成功能擴(kuò)展的方法
  • CI框架中通過(guò)hook的方式實(shí)現(xiàn)簡(jiǎn)單的權(quán)限控制
  • CI框架中l(wèi)ibraries,helpers,hooks文件夾詳細(xì)說(shuō)明

標(biāo)簽:衡陽(yáng) 白銀 綏化 辛集 崇左 鄂州 廊坊 太原

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《CodeIgniter框架鉤子機(jī)制實(shí)現(xiàn)方法【hooks類(lèi)】》,本文關(guān)鍵詞  CodeIgniter,框架,鉤子,機(jī)制,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《CodeIgniter框架鉤子機(jī)制實(shí)現(xiàn)方法【hooks類(lèi)】》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于CodeIgniter框架鉤子機(jī)制實(shí)現(xiàn)方法【hooks類(lèi)】的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章