好久沒寫 CodeIgniter 相關文章,這次看到在論壇有人發問 application/libraries 優先權,想說把整個 CodeIgniter 如何讀取 Library 的流程整個寫下來,其實也不會很難,但是就是要照著 CI 定義的規則來命名檔名以及 Class。假設要讀取 Email Library,我們可以透過底下方式讀取
$this->load->library('email');
CI 會先將第一個字母大寫 Email 字串,接著小寫 email 字串開始進行搜尋檔案動作,搜尋的優先順序會先從你是否有擴充核心 Library,也就是 config.php 內定義
subclass_prefix,那 CI 預設的 Prefix 就是 MY_,底下列出 CI 判斷檔案是否存在的列表
1. application/libraries/MY_Email.php 2. application/libraries/Email.php 3. system/libraries/Email.php 4. application/libraries/MY_email.php 5. application/libraries/email.php 6. system/libraries/email.php
假設 1. application/libraries/MY_Email.php 存在時,系統會認定您有擴充 Library,所以會將 application/libraries/Email.php 同時讀取進來,也就是 include 兩個檔案
include_once('application/libraries/Email.php'); include_once('application/libraries/MY_Email.php');
這時候你會發現在 application/libraries/MY_Email.php 裡面的宣告會是
class MY_Email extends CI_Email {}
所以很自然的可以擴充 Email Library。假如 1. application/libraries/MY_Email.php 不存在,系統很自然接著讀取 2. application/libraries/Email.php 或 3. system/libraries/Email.php。所以讀取檔案的結論就是 MY_ 命名開頭為優先。最後來看看如何 initialize Class。此部份會跟檔案命名有很大的關係,如果以 MY_ 為檔名開頭,那 Class 就要宣告為
class MY_Email {}
以擴充 Email 例子來說會變成底下程式碼載入
class CI_Email { .... }class MY_Email extends CI_Email { …. }
如果是非 MY_ 開頭的 Library,例如自訂 ses.php 的話,裡面的 Class 可以取名為
class CI_Ses { .... }class MY_Ses { …. }
class Ses { …. }
這三種方式都可以,讀取順序為由上到下,但是一般我們都是以最後一個為主。所以假設你覆蓋系統內建的 Email library,你可以建立 application/libraries/Email.php,並且檔案內容宣告為底下即可
class Email { .... }
最後可以參考線上文件
See also
- 來聊聊 PHP & JavaScript & CSS 的 Coding Style
- 為什麼我選擇使用 Laravel Framework?
- Laravel 搭配 Google, Facebook, Twitter 第三方 OAuth 認證
- 將 wordpress 強制使用 SSL 連線
- PHP 7 vs HHVM Benchmark 比較
- Laravel 50 個小技巧 + Laravel 5.2 新功能
- Laravel Homestead 支援 MySQL 5.7 和 Node 5.0
- PHP-FIG 新網站
- Laravel Homestead 支援 PHP 7
- Laravel 5.1 is released