自動(dòng)加載文件?
每個(gè)應(yīng)用都在不同的位置包含有大量的類(lèi)文件??蚣芴峁┝藢?shí)現(xiàn)核心功能的類(lèi),而你的應(yīng)用將會(huì)由大量的庫(kù),模型,以及其他實(shí)體文件以運(yùn)行。
你也可能需要第三方的類(lèi)庫(kù)以供項(xiàng)目使用。記錄每個(gè)單獨(dú)的文件的位置,并硬編碼一系列的 requires() 在文件中,這是一個(gè)非常頭疼且容易出錯(cuò)的事情。
這就是自動(dòng)加載器的用武之地。
CodeIgniter提供了一個(gè)非常靈活且需要極少配置的自動(dòng)加載器。它可以定位單個(gè)的非命名空間標(biāo)注的類(lèi),符合命名空間規(guī)范 PSR4 目錄加載結(jié)構(gòu)的類(lèi), 甚至可以在常規(guī)目錄下定位類(lèi)文件(例如控制器,模型等)。
為了提升性能,CodeIgniter的核心組件已被添加到類(lèi)映射文件中。
自動(dòng)加載器可以單獨(dú)運(yùn)行,如果你需要的話,可以和其他自動(dòng)加載器協(xié)同運(yùn)行,例如 Composer 或者是你自己的自定義加載器。 因?yàn)樗鼈兌际峭ㄟ^(guò) spl_autoload_register 來(lái)注冊(cè)運(yùn)行的,所以可以依次運(yùn)行,互不打擾。
自動(dòng)加載器總是處于激活狀態(tài),并通過(guò) spl_autoload_register() 在框架運(yùn)行開(kāi)始時(shí)進(jìn)行注冊(cè)掛載。
配置?
初始配置是在 /application/Config/Autoload.php 文件中進(jìn)行。該文件包含兩個(gè)主要的數(shù)組,一個(gè)用于類(lèi)映射圖,一個(gè)用于符合PSR-4規(guī)范的命名空間。
命名空間?
我們推薦通過(guò)在應(yīng)用文件里創(chuàng)建一個(gè)或多個(gè)命名空間來(lái)管理你的類(lèi)。而這一點(diǎn)對(duì)于業(yè)務(wù)邏輯相關(guān)聯(lián)的類(lèi),實(shí)體類(lèi)等也是最為重要的。
配置文件中的 psr4 數(shù)組允許你將命名空間和對(duì)應(yīng)的類(lèi)所存在的目錄進(jìn)行映射:
$psr4 = [
'App' => APPPATH,
'CodeIgniter' => SYSTEMPATH,
];
數(shù)組的每一行的鍵就是命名空間本身,不需要反斜杠()。如果你需要在定義數(shù)組時(shí)使用雙引號(hào),確保使用反斜杠進(jìn)行轉(zhuǎn)義。
這意味著應(yīng)當(dāng)如同 My\\App 而不是 My\App 這樣。對(duì)應(yīng)的值就是這些類(lèi)所存在的目錄,而這些需要包括反斜杠。
默認(rèn)來(lái)說(shuō),應(yīng)用文件夾對(duì)應(yīng)著 App 命名空間。盡管你不一定非得給應(yīng)用目錄下的控制器,庫(kù)和模型聲明命名空間,但是如果你這樣做了的話,
這些文件就會(huì)在 App 命名空間下被找到。你可以通過(guò)編輯 /application/Config/Constants.php 文件來(lái)改變這個(gè)命名空間,并且通過(guò)更改 APP_NAMESPACE 選項(xiàng)來(lái)設(shè)置新的命名空間值:
define('APP_NAMESPACE', 'App');
你需要修改所有現(xiàn)存的指向當(dāng)前命名空間的文件。
重要
配置文件的命名空間是 Config ,而不是如你所想的 App\Config。這一特性使得核心系統(tǒng)文件可被準(zhǔn)確定位,甚至在應(yīng)用的命名空間被更改的情況下。
類(lèi)映射圖?
類(lèi)映射圖是CodeIgniter用來(lái)榨干系統(tǒng)最后一分性能的手段,通過(guò)不使用額外的 file_exists() 調(diào)用來(lái)查詢(xún)文件系統(tǒng)來(lái)實(shí)現(xiàn)。
你可以利用類(lèi)映射圖來(lái)鏈接到第三方庫(kù),即使它們并沒(méi)有命名空間:
$classmap = [
'Markdown' => APPPATH .'third_party/markdown.php'
];
每一行的鍵就是你所需要定位的類(lèi)名。值就是需要定位的路徑
支持從前版本?
如果以上的所有方法都找不到對(duì)應(yīng)的類(lèi)文件,且這個(gè)類(lèi)沒(méi)有對(duì)應(yīng)的命名空間,自動(dòng)加載器將會(huì)查找 /application/Libraries 和 /application/Models 目錄來(lái)嘗試定位文件。 這為從以前版本升級(jí)提供了一個(gè)簡(jiǎn)潔的方式。
對(duì)于支持從前版本而言,沒(méi)有額外的配置選項(xiàng)。
支持Composer?
默認(rèn)情況下CodeIgniter自動(dòng)初始化支持Composer. 默認(rèn)情況下,它將在 ROOTPATH.'vendor / autoload.php' 中查找Composer的自動(dòng)加載文件。
如果因?yàn)橐恍┰蛐枰倪@個(gè)文件的位置,你可以修改定義在 Config\Constants.php 的值
注解
如果在CodeIgniter和Composer中都定義了相同的名稱(chēng)空間,則CodeIgniter的自動(dòng)加載器將首先定位文件。