類自動載入(Autoloading)


類自動載入(Autoloading)

Yii 依靠類自動載入機制來定位和包含所需的類檔案。它提供一個高效能且完美支援PSR-4 標準(中文漢化)的自動載入器。該自動載入器會在引入框架檔案 Yii.php 時安裝好。

注意:為了簡化敘述,本篇文件中我們只會提及類的自動載入。不過,要記得文中的描述同樣也適用於介面和Trait(特質)的自動載入哦。

使用 Yii 自動載入器

要使用 Yii 的類自動載入器,你需要在建立和命名類的時候遵循兩個簡單的規則:

  • 每個類都必須置於名稱空間之下 (比如 foo\bar\MyClass)。
  • 每個類都必須儲存為單獨檔案,且其完整路徑能用以下演算法取得:
  1. // $className 是一個開頭包含反斜槓的完整類名(譯者注:請自行谷歌:fully qualified class name) 
  2. $classFile = Yii::getAlias('@' . str_replace('\\\\', '/', $className) . '.php');

舉例來說,若某個類名為 foo\bar\MyClass,對應類的檔案路徑別名會是 @foo/bar/MyClass.php。為了讓該別名能被正確解析為檔案路徑,@foo 或 @foo/bar 中的一個必須是根別名

當我們使用基本應用模版時,可以把你的類放置在頂級名稱空間 app 下,這樣它們就可以被 Yii 自動載入,而無需定義一個新的別名。這是因為 @app 本身是一個預定義別名,且類似於 app\components\MyClass 這樣的類名,基於我們剛才所提到的演算法,可以正確解析出 AppBasePath/components/MyClass.php 路徑。

高階應用模版裡,每一邏輯層級會使用他自己的根別名。比如,前端層會使用 @frontend 而後端層會使用@backend。因此,你可以把前端的類放在 frontend 名稱空間,而後端的類放在 backend。 這樣這些類就可以被 Yii 自動載入了。

類對映表(Class Map)

Yii 類自動載入器支援類對映表功能,該功能會建立一個從類的名字到類檔案路徑的對映。當自動載入器載入一個檔案時,他首先檢查對映表裡有沒有該類。如果有,對應的檔案路徑就直接載入了,省掉了進一步的檢查。這讓類的自動載入變得超級快。事實上所有的 Yii 核心類都是這樣載入的。

你可以用 Yii::$classMap 方法向對映表中新增類,

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

別名可以被用於指定類檔案的路徑。你應該在引導啟動的過程中設定類對映表,這樣對映表就可以在你使用具體類之前就準備好。

用其他自動載入器

因為 Yii 完全支援 Composer 管理依賴包,所以推薦你也同時安裝 Composer 的自動載入器,如果你用了一些自帶自動載入器的第三方類庫,你應該也安裝下它們。

當你同時使用其他自動載入器和 Yii 自動載入器時,應該在其他自動載入器安裝成功之後,再包含 Yii.php 檔案。這將使 Yii 成為第一個響應任何類自動載入請求的自動載入器。舉例來說,以下程式碼提取自基本應用模版入口指令碼 。第一行安裝了 Composer 的自動載入器,第二行才是 Yii 的自動載入器:

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

你也可以只使用 Composer 的自動載入,而不用 Yii 的自動載入。不過這樣做的話,類的載入效率會下降,且你必須遵循 Composer 所設定的規則,從而讓你的類滿足可以被自動載入的要求。

補充:若你不想要使用 Yii 的自動載入器,你必須建立一個你自己版本的 Yii.php 檔案,並把它包含進你的入口指令碼裡。

自動載入擴充套件類

Yii 自動載入器支援自動載入擴充套件的類。唯一的要求是它需要在 composer.json 檔案裡正確地定義 autoload部分。請參考 Composer 文件(英文)(中文漢化),來了解如何正確描述 autoload 的更多細節。

在你不使用 Yii 的自動載入器時,Composer 的自動載入器仍然可以幫你自動載入擴充套件內的類。