類自動(dòng)加載(Class Autoloading)

2018-02-24 15:40 更新

類自動(dòng)加載(Autoloading)

Yii 依靠類自動(dòng)加載機(jī)制來(lái)定位和包含所需的類文件。它提供一個(gè)高性能且完美支持PSR-4 標(biāo)準(zhǔn)中文漢化)的自動(dòng)加載器。該自動(dòng)加載器會(huì)在引入框架文件?Yii.php?時(shí)安裝好。

注意:為了簡(jiǎn)化敘述,本篇文檔中我們只會(huì)提及類的自動(dòng)加載。不過(guò),要記得文中的描述同樣也適用于接口和Trait(特質(zhì))的自動(dòng)加載哦。

使用 Yii 自動(dòng)加載器

要使用 Yii 的類自動(dòng)加載器,你需要在創(chuàng)建和命名類的時(shí)候遵循兩個(gè)簡(jiǎn)單的規(guī)則:

  • 每個(gè)類都必須置于命名空間之下 (比如?foo\bar\MyClass)。
  • 每個(gè)類都必須保存為單獨(dú)文件,且其完整路徑能用以下算法取得:
// $className 是一個(gè)開頭包含反斜杠的完整類名(譯注:請(qǐng)自行谷歌:fully qualified class name)
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');

舉例來(lái)說(shuō),若某個(gè)類名為?foo\bar\MyClass,對(duì)應(yīng)類的文件路徑別名會(huì)是?@foo/bar/MyClass.php。為了讓該別名能被正確解析為文件路徑,@foo?或?@foo/bar?中的一個(gè)必須是根別名。

當(dāng)我們使用基本應(yīng)用模版時(shí),可以把你的類放置在頂級(jí)命名空間?app?下,這樣它們就可以被 Yii 自動(dòng)加載,而無(wú)需定義一個(gè)新的別名。這是因?yàn)?@app?本身是一個(gè)預(yù)定義別名,且類似于?app\components\MyClass?這樣的類名,基于我們剛才所提到的算法,可以正確解析出?AppBasePath/components/MyClass.php?路徑。

高級(jí)應(yīng)用模版里,每一邏輯層級(jí)會(huì)使用他自己的根別名。比如,前端層會(huì)使用?@frontend?而后端層會(huì)使用?@backend。因此,你可以把前端的類放在?frontend?命名空間,而后端的類放在?backend。 這樣這些類就可以被 Yii 自動(dòng)加載了。

類映射表(Class Map)

Yii 類自動(dòng)加載器支持類映射表功能,該功能會(huì)建立一個(gè)從類的名字到類文件路徑的映射。當(dāng)自動(dòng)加載器加載一個(gè)文件時(shí),他首先檢查映射表里有沒有該類。如果有,對(duì)應(yīng)的文件路徑就直接加載了,省掉了進(jìn)一步的檢查。這讓類的自動(dòng)加載變得超級(jí)快。事實(shí)上所有的 Yii 核心類都是這樣加載的。

你可以用?Yii::$classMap?方法向映射表中添加類,

Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';

別名可以被用于指定類文件的路徑。你應(yīng)該在引導(dǎo)啟動(dòng)的過(guò)程中設(shè)置類映射表,這樣映射表就可以在你使用具體類之前就準(zhǔn)備好。

用其他自動(dòng)加載器

因?yàn)?Yii 完全支持 Composer 管理依賴包,所以推薦你也同時(shí)安裝 Composer 的自動(dòng)加載器,如果你用了一些自帶自動(dòng)加載器的第三方類庫(kù),你應(yīng)該也安裝下它們。

當(dāng)你同時(shí)使用其他自動(dòng)加載器和 Yii 自動(dòng)加載器時(shí),應(yīng)該在其他自動(dòng)加載器安裝成功之后,再包含?Yii.php?文件。這將使 Yii 成為第一個(gè)響應(yīng)任何類自動(dòng)加載請(qǐng)求的自動(dòng)加載器。舉例來(lái)說(shuō),以下代碼提取自基本應(yīng)用模版入口腳本?。第一行安裝了 Composer 的自動(dòng)加載器,第二行才是 Yii 的自動(dòng)加載器:

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

你也可以只使用 Composer 的自動(dòng)加載,而不用 Yii 的自動(dòng)加載。不過(guò)這樣做的話,類的加載效率會(huì)下降,且你必須遵循 Composer 所設(shè)定的規(guī)則,從而讓你的類滿足可以被自動(dòng)加載的要求。

補(bǔ)充:若你不想要使用 Yii 的自動(dòng)加載器,你必須創(chuàng)建一個(gè)你自己版本的?Yii.php?文件,并把它包含進(jìn)你的入口腳本里。

自動(dòng)加載擴(kuò)展類

Yii 自動(dòng)加載器支持自動(dòng)加載擴(kuò)展的類。唯一的要求是它需要在?composer.json?文件里正確地定義?autoload?部分。請(qǐng)參考Composer 文檔(英文)中文漢化),來(lái)了解如何正確描述?autoload?的更多細(xì)節(jié)。

在你不使用 Yii 的自動(dòng)加載器時(shí),Composer 的自動(dòng)加載器仍然可以幫你自動(dòng)加載擴(kuò)展內(nèi)的類。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)