CodeIgniter 初始化 Library 流程

CodeIgniter

好久沒寫 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