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

CodeIgniter 核心類擴展全攻略:替換與繼承兩大模式實戰詳解

     編輯:PHP 相關知識

CodeIgniter 核心類擴展全攻略:替換與繼承兩大模式實戰詳解

CodeIgniter 設計極具彈性,允許開發者透過 application/config/config.php 中的 subclass_prefix(預設 MY_)輕鬆擴展核心類別、函式庫與輔助函數。本文系統整理三大擴展場景的實作要訣。

1. 核心類擴展:替換 vs 繼承

核心類位於 system/core/,啟動時自動載入。擴展方式分兩種:

▍ 替換核心類

在 application/core/ 建立同名檔案(如 Loader.php)即可完全接管。但必須實作原類別所有公用方法,否則會觸發缺少方法錯誤。適用於需徹底重寫核心行為的極少數場景。

▍ 繼承核心類(推薦)

建立 application/core/MY_Input.php 並繼承 CI_Input,僅覆寫需修改的方法(如 _clean_input_keys()),其餘沿用父類實作。範例:

<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class MY_Input extends CI_Input {
    function _clean_input_keys($str) {
        $config =& get_config('config');
        if (!preg_match("/^[".$config['permitted_uri_chars']."]+$/i", rawurlencode($str))) {
            exit('Disallowed Key Characters.');
        }
        if (UTF8_ENABLED === TRUE) {
            $str = $this->uni->clean_string($str);
        }
        return $str;
    }
}
/* End of file MY_Input.php */
/* Location: ./application/core/MY_Input.php */

2. 類庫擴展:同樣邏輯,目錄換成 application/libraries/

系統類庫位於 system/libraries/,擴展方式與核心類相同,僅將檔案置於 application/libraries/ 並冠上 MY_ 前綴即可。

3. 輔助函數擴展:利用 function_exists() 實現覆寫與新增

輔助函數置於 application/helpers/,CI 載入時會先檢查函數是否存在。故可在 MY_array_helper.php 中直接定義同名函數達到「覆寫」,或新增自訂函數(如二維陣列排序 array_field_sort())。範例:

<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
 * 對二維陣列按指定欄位排序
 * @param array $data 待排序資料
 * @param string $sort_field 排序鍵名
 * @param int $sort_type SORT_ASC|SORT_DESC
 * @return array
 */
function array_field_sort($data, $sort_field, $sort_type = SORT_ASC) {
    if (!is_array($data)) return false;
    $sort_arr = [];
    foreach ($data as $key => $val) {
        if (isset($val[$sort_field])) $sort_arr[$key] = $val[$sort_field];
    }
    if (count($sort_arr) === count($data)) {
        array_multisort($sort_arr, $sort_type, $data);
    }
    return $data;
}
/* End of file MY_array_helper.php */
/* Location: ./application/helpers/MY_array_helper.php */

最佳實踐提醒

  • 「能不擴展就不擴展」:優先使用組合、事件、服務層解決問題,避免過度繼承導致升級困難。
  • 嚴禁直接修改 system/ 目錄下檔案,否則框架升級將成惡夢。
  • 擴展類別命名務必遵循 subclass_prefix 設定,確保自動載入機制生效。

延伸閱讀

善用 CI 擴展機制,能在不侵入框架核心的前提下,優雅地為專案注入領域專屬能力。

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