CodeIgniter 設計極具彈性,允許開發者透過 application/config/config.php 中的 subclass_prefix(預設 MY_)輕鬆擴展核心類別、函式庫與輔助函數。本文系統整理三大擴展場景的實作要訣。
核心類位於 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 */
application/libraries/系統類庫位於 system/libraries/,擴展方式與核心類相同,僅將檔案置於 application/libraries/ 並冠上 MY_ 前綴即可。
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 擴展機制,能在不侵入框架核心的前提下,優雅地為專案注入領域專屬能力。