自動載入檔案

每個應用程式都在不同的位置包含有大量的類別檔案,像是框架有為了實現核心功能的類別,而你的應用可能又會擁有大量的程式庫、模型以及其他實體檔案,甚至你也可能需要第三方的類別庫來供專案使用。記錄每個單獨檔案的路徑,並寫死在一系列的 requires() 在檔案中,這是一件非常令人頭痛且容易出錯的事情。這就是為什麼需要自動載入器。

CodeIgniter 提供了一個非常靈活且極少需要設定的自動載入器。它可以定位單個非命名空間標註的類別、符合 PSR4 的命名空間規範目錄加載結構的類別,甚至可以在常規目錄下定位類別檔案(例如 Controller、Model等)。

為了提升效能,CodeIgniter的核心組件已被添加到類別映射檔案中。

自動載入器可以獨立運行,但如果你需要的話,也可以和其他自動載入器協同運行,例如 Composer 或者是你自己的自定義載入器。因為它們都是透過 spl_autoload_register 來註冊運行的,所以可以依次運行,互不干擾。

自動載入器總是處於激活狀態,在框架開始運行時透過 spl_autoload_register() 進行註冊。

設定

初始設定是在 /app/Config/Autoload.php 檔案中進行。該檔案包含兩個的主要陣列,一個用於類別映射圖,一個用於符合 PSR-4 的命名空間規範。

命名空間

我們建議,透過在應用程式檔案中創建一個或多個命名空間來管理你的類別。而這一點,對於業務邏輯相關聯的類別、實體類別等也是最為重要的。設定檔案中的 psr4 陣列,允許你將命名空間和對應的類別所存在的目錄進行映射:

$psr4 = [
        'App'         => APPPATH,
        'CodeIgniter' => SYSTEMPATH,
];

陣列每一行的鍵就是命名空間本身,不需要反斜線。如果你需要在定義陣列時使用雙引號,就必須使用反斜線進行轉義。這代表會長得像 My\\App 而不是 My\App 這樣。對應的值就是這些類別所存在的資料夾,而這些值需要含有反斜線。

應用程式的資料夾預設對應著 App 命名空間。雖然你沒有一定要給應用程式目錄下的控制器、程式庫和模型宣告命名空間,但是如果你這樣做了的話, 這些檔案就可以在 App 命名空間下被找到。你可以透過編輯 /app/Config/Constants.php 檔案來改變這個命名空間,並且透過更改 APP_NAMESPACE 選項來設置新的命名空間數值:

define('APP_NAMESPACE', 'App');

你需要修改所有現存指向當前命名空間的檔案。

重要

設定檔案被聲名在 Config 命名空間中,而不是如你所想的 App\Config。這個特性使得核心系統檔案,甚至在應用程式的命名空間被更改的情況下,也可以被精準的定位。

類別映射圖

類別映射圖是 CodeIgniter 用來榨乾系統最後一分效能的手段,透過不額外調用 is_file() 查詢檔案系統來實現。即使第三方程式庫並沒有命名空間,你也可以利用類別映射圖來連接他們:

$classmap = [
        'Markdown' => APPPATH .'third_party/markdown.php'
];

每一行的鍵值就是你想定位的類別名,而值就是用來定位它的路徑

支援舊版本

如果以上的所有方法都找不到對應的類別檔案,且這個類別也沒有對應的命名空間,自動載入器將會查找 /application/Libraries/application/Models 目錄來嘗試定位檔案。這提供了舊版本過渡到新版本的一個方式。

對於舊版本而言,沒有額外的設定選項。

支援 Composer

CodeIgniter 在初始化時就會預設支援 Composer。 它會在 ROOTPATH.'vendor/autoload.php' 中尋找 Composer 的自動載入檔案。 如果你需要更改這個檔案的位置,你可以修改定義在 Config\Constants.php 中的值。

備註

如果同時在 CodeIgniter 和 Composer 中定義了命名空間,CodeIgniter 的自動載入器會優先定位到檔案。