首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

CodeIgniter 核心源碼深度解析:Loader 載入器機制

     編輯:PHP 相關知識

CodeIgniter 核心源碼深度解析:Loader 載入器機制

CodeIgniter (CI) 的 Loader 類別是框架的核心樞紐,負責載入 Library、Model、View、Helper、Config 等所有資源。本文透過原始碼逐層剖析其運作原理,幫助開發者理解框架底層運作。

核心屬性與初始化

class CI_Loader {
    protected $_ci_ob_level;           // 輸出緩衝層級
    protected $_ci_view_paths = [];    // View 搜尋路徑
    protected $_ci_library_paths = []; // Library 搜尋路徑
    protected $_ci_model_paths = [];   // Model 搜尋路徑
    protected $_ci_helper_paths = [];  // Helper 搜尋路徑
    protected $_ci_classes = [];       // 已載入類別快取
    protected $_ci_models = [];        // 已載入 Model 快取
    protected $_ci_helpers = [];       // 已載入 Helper 快取
    protected $_ci_cached_vars = [];   // 視圖變數快取
    protected $_ci_varmap = [          // 類別名稱映射
        'unit_test' => 'unit',
        'user_agent' => 'agent'
    ];

    public function __construct() {
        $this->_ci_ob_level = ob_get_level();
        $this->_ci_library_paths = [APPPATH, BASEPATH];
        $this->_ci_helper_paths  = [APPPATH, BASEPATH];
        $this->_ci_model_paths   = [APPPATH];
        $this->_ci_view_paths    = [APPPATH . 'views/' => TRUE];
        log_message('debug', "Loader Class Initialized");
    }
}

關鍵方法解析

1. library() - 載入 Library

  • 支援陣列批次載入
  • 優先檢查 application/libraries/ 下的擴充類別 (MY_ 前綴)
  • 再檢查 system/libraries/ 核心類別
  • 透過 _ci_init_class() 實例化並掛載到 CI 超級物件 $CI->library_name

2. model() - 載入 Model

  • 支援子目錄(如 admin/user_model)
  • 檔名需全小寫,類別名首字大寫
  • 自動偵測是否需載入資料庫連線
  • 實例化後存入 $CI->model_name 並記錄於 _ci_models

3. view() - 載入視圖

public function view($view, $vars = [], $return = FALSE) {
    return $this->_ci_load([
        '_ci_view'   => $view,
        '_ci_vars'   => $this->_ci_object_to_array($vars),
        '_ci_return' => $return
    ]);
}

核心邏輯在 _ci_load():

  1. 解析視圖路徑(支援級聯 cascade 機制)
  2. 將 CI 所有屬性注入 Loader,使視圖中 $this 指向 CI
  3. 合併快取變數與傳入變數,extract() 變為區域變數
  4. 開啟輸出緩衝 ob_start(),支援短標籤重寫
  5. 依 _ci_return 決定回傳字串或直接輸出到 Output 類別
  6. 巢狀視圖透過 ob_get_level() 判斷處理方式

4. helper() - 載入 Helper

  • 優先載入 application/helpers/MY_*_helper.php(需對應核心檔存在)
  • 再嘗試各路徑下的標準 helper
  • 使用 include_once 避免重複定義函式

5. add_package_path() / remove_package_path()

動態擴充/移除資源搜尋路徑,支援模組化開發(如 HMVC),自動同步更新 library、model、helper、config、view 五大路徑陣列。

6. _ci_autoloader() - 自動載入機制

讀取 config/autoload.php,依序載入 packages、config、helper、language、library(含 database)、model。

進階技巧:自訂 View 目錄

// application/core/MY_Loader.php
class MY_Loader extends CI_Loader {
    public function __construct() {
        parent::__construct();
        // 將預設 views 改為專案根目錄下的 templates
        $this->_ci_view_paths = [FCPATH . '/templates/' => TRUE];
    }
}

常見坑點提醒

  • Model 類別名與檔名不一致:檔名 test_model.php,類別需為 Test_model extends CI_Model
  • Library 重複載入:若需多實例,使用 $this->load->library('foo', null, 'custom_name')
  • 輸出緩衝層級錯誤:巢狀 view 導致輸出異常,檢查 _ci_ob_level 邏輯

深入理解 Loader 機制,不僅能排除疑難雜症,更能在擴充框架時得心應手。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved