自動加載文件?
每個應(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的自動加載器將首先定位文件。