自動加載文件?

每個應(yīng)用都在不同的位置包含有大量的類文件。框架提供了實現(xiàn)核心功能的類,而你的應(yīng)用將會由大量的庫,模型,以及其他實體文件以運行。 你也可能需要第三方的類庫以供項目使用。記錄每個單獨的文件的位置,并硬編碼一系列的 requires() 在文件中,這是一個非常頭疼且容易出錯的事情。 這就是自動加載器的用武之地。

CodeIgniter提供了一個非常靈活且需要極少配置的自動加載器。它可以定位單個的非命名空間標(biāo)注的類,符合命名空間規(guī)范 PSR4 目錄加載結(jié)構(gòu)的類, 甚至可以在常規(guī)目錄下定位類文件(例如控制器,模型等)。

為了提升性能,CodeIgniter的核心組件已被添加到類映射文件中。

自動加載器可以單獨運行,如果你需要的話,可以和其他自動加載器協(xié)同運行,例如 Composer 或者是你自己的自定義加載器。 因為它們都是通過 spl_autoload_register 來注冊運行的,所以可以依次運行,互不打擾。

自動加載器總是處于激活狀態(tài),并通過 spl_autoload_register() 在框架運行開始時進行注冊掛載。

配置?

初始配置是在 /application/Config/Autoload.php 文件中進行。該文件包含兩個主要的數(shù)組,一個用于類映射圖,一個用于符合PSR-4規(guī)范的命名空間。

命名空間?

我們推薦通過在應(yīng)用文件里創(chuàng)建一個或多個命名空間來管理你的類。而這一點對于業(yè)務(wù)邏輯相關(guān)聯(lián)的類,實體類等也是最為重要的。 配置文件中的 psr4 數(shù)組允許你將命名空間和對應(yīng)的類所存在的目錄進行映射:

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

數(shù)組的每一行的鍵就是命名空間本身,不需要反斜杠()。如果你需要在定義數(shù)組時使用雙引號,確保使用反斜杠進行轉(zhuǎn)義。 這意味著應(yīng)當(dāng)如同 My\\App 而不是 My\App 這樣。對應(yīng)的值就是這些類所存在的目錄,而這些需要包括反斜杠。

默認來說,應(yīng)用文件夾對應(yīng)著 App 命名空間。盡管你不一定非得給應(yīng)用目錄下的控制器,庫和模型聲明命名空間,但是如果你這樣做了的話, 這些文件就會在 App 命名空間下被找到。你可以通過編輯 /application/Config/Constants.php 文件來改變這個命名空間,并且通過更改 APP_NAMESPACE 選項來設(shè)置新的命名空間值:

define('APP_NAMESPACE', 'App');

你需要修改所有現(xiàn)存的指向當(dāng)前命名空間的文件。

重要

配置文件的命名空間是 Config ,而不是如你所想的 App\Config。這一特性使得核心系統(tǒng)文件可被準確定位,甚至在應(yīng)用的命名空間被更改的情況下。

類映射圖?

類映射圖是CodeIgniter用來榨干系統(tǒng)最后一分性能的手段,通過不使用額外的 file_exists() 調(diào)用來查詢文件系統(tǒng)來實現(xiàn)。 你可以利用類映射圖來鏈接到第三方庫,即使它們并沒有命名空間:

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

每一行的鍵就是你所需要定位的類名。值就是需要定位的路徑

支持從前版本?

如果以上的所有方法都找不到對應(yīng)的類文件,且這個類沒有對應(yīng)的命名空間,自動加載器將會查找 /application/Libraries/application/Models 目錄來嘗試定位文件。 這為從以前版本升級提供了一個簡潔的方式。

對于支持從前版本而言,沒有額外的配置選項。

支持Composer?

默認情況下CodeIgniter自動初始化支持Composer. 默認情況下,它將在 ROOTPATH.'vendor / autoload.php' 中查找Composer的自動加載文件。 如果因為一些原因需要更改這個文件的位置,你可以修改定義在 Config\Constants.php 的值

注解

如果在CodeIgniter和Composer中都定義了相同的名稱空間,則CodeIgniter的自動加載器將首先定位文件。