# 類自動加載(Autoloading)
Yii 依靠[類自動加載機制](http://www.php.net/manual/en/language.oop5.autoload.php)來定位和包含所需的類文件。它提供一個高性能且完美支持[PSR-4 標準](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md)([中文漢化](https://github.com/hfcorriez/fig-standards/blob/zh_CN/%E6%8E%A5%E5%8F%97/PSR-4-autoloader.md))的自動加載器。該自動加載器會在引入框架文件?`Yii.php`?時安裝好。
> 注意:為了簡化敘述,本篇文檔中我們只會提及類的自動加載。不過,要記得文中的描述同樣也適用于接口和Trait(特質)的自動加載哦。
## 使用 Yii 自動加載器
要使用 Yii 的類自動加載器,你需要在創建和命名類的時候遵循兩個簡單的規則:
* 每個類都必須置于命名空間之下 (比如?`foo\bar\MyClass`)。
* 每個類都必須保存為單獨文件,且其完整路徑能用以下算法取得:
~~~
// $className 是一個開頭包含反斜杠的完整類名(譯注:請自行谷歌:fully qualified class name)
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');
~~~
舉例來說,若某個類名為?`foo\bar\MyClass`,對應類的文件路徑[別名](http://www.yiichina.com/doc/guide/2.0/concept-aliases)會是?`@foo/bar/MyClass.php`。為了讓該別名能被正確解析為文件路徑,`@foo`?或?`@foo/bar`?中的一個必須是[根別名](http://www.yiichina.com/doc/guide/2.0/concept-aliases#defining-aliases)。
當我們使用[基本應用模版](http://www.yiichina.com/doc/guide/2.0/start-installation)時,可以把你的類放置在頂級命名空間?`app`?下,這樣它們就可以被 Yii 自動加載,而無需定義一個新的別名。這是因為?`@app`?本身是一個[預定義別名](http://www.yiichina.com/doc/guide/2.0/concept-aliases#predefined-aliases),且類似于?`app\components\MyClass`?這樣的類名,基于我們剛才所提到的算法,可以正確解析出?`AppBasePath/components/MyClass.php`?路徑。
在[高級應用模版](http://www.yiichina.com/doc/guide/2.0/tutorial-advanced-app)里,每一邏輯層級會使用他自己的根別名。比如,前端層會使用?`@frontend`?而后端層會使用?`@backend`。因此,你可以把前端的類放在?`frontend`?命名空間,而后端的類放在?`backend`。 這樣這些類就可以被 Yii 自動加載了。
## 類映射表(Class Map)
Yii 類自動加載器支持**類映射表**功能,該功能會建立一個從類的名字到類文件路徑的映射。當自動加載器加載一個文件時,他首先檢查映射表里有沒有該類。如果有,對應的文件路徑就直接加載了,省掉了進一步的檢查。這讓類的自動加載變得超級快。事實上所有的 Yii 核心類都是這樣加載的。
你可以用?`Yii::$classMap`?方法向映射表中添加類,
~~~
Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';
~~~
[別名](http://www.yiichina.com/doc/guide/2.0/concept-aliases)可以被用于指定類文件的路徑。你應該在[引導啟動](http://www.yiichina.com/doc/guide/2.0/runtime-bootstrapping)的過程中設置類映射表,這樣映射表就可以在你使用具體類之前就準備好。
## 用其他自動加載器
因為 Yii 完全支持 Composer 管理依賴包,所以推薦你也同時安裝 Composer 的自動加載器,如果你用了一些自帶自動加載器的第三方類庫,你應該也安裝下它們。
當你同時使用其他自動加載器和 Yii 自動加載器時,應該在其他自動加載器安裝成功**之后**,再包含?`Yii.php`?文件。這將使 Yii 成為第一個響應任何類自動加載請求的自動加載器。舉例來說,以下代碼提取自[基本應用模版](http://www.yiichina.com/doc/guide/2.0/start-installation)的[入口腳本](http://www.yiichina.com/doc/guide/2.0/structure-entry-scripts)?。第一行安裝了 Composer 的自動加載器,第二行才是 Yii 的自動加載器:
~~~
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
~~~
你也可以只使用 Composer 的自動加載,而不用 Yii 的自動加載。不過這樣做的話,類的加載效率會下降,且你必須遵循 Composer 所設定的規則,從而讓你的類滿足可以被自動加載的要求。
> 補充:若你不想要使用 Yii 的自動加載器,你必須創建一個你自己版本的?`Yii.php`?文件,并把它包含進你的[入口腳本](http://www.yiichina.com/doc/guide/2.0/structure-entry-scripts)里。
## 自動加載擴展類
Yii 自動加載器支持自動加載[擴展](http://www.yiichina.com/doc/guide/2.0/structure-extensions)的類。唯一的要求是它需要在?`composer.json`?文件里正確地定義?`autoload`?部分。請參考[Composer 文檔(英文)](https://getcomposer.org/doc/04-schema.md#autoload)([中文漢化](https://github.com/5-say/composer-doc-cn/blob/master/cn-introduction/04-schema.md#autoload)),來了解如何正確描述?`autoload`?的更多細節。
在你不使用 Yii 的自動加載器時,Composer 的自動加載器仍然可以幫你自動加載擴展內的類。
- 介紹(Introduction)
- 關于 Yii(About Yii)
- 從 Yii 1.1 升級(Upgrading from Version 1.1)
- 入門(Getting Started)
- 安裝 Yii(Installing Yii)
- 運行應用(Running Applications)
- 第一次問候(Saying Hello)
- 使用 Forms(Working with Forms)
- 玩轉 Databases(Working with Databases)
- 用 Gii 生成代碼(Generating Code with Gii)
- 更上一層樓(Looking Ahead)
- 應用結構(Application Structure)
- 結構概述(Overview)
- 入口腳本(Entry Scripts)
- 應用(Applications)
- 應用組件(Application Components)
- 控制器(Controllers)
- 模型(Models)
- 視圖(Views)
- 模塊(Modules)
- 過濾器(Filters)
- 小部件(Widgets)
- 前端資源(Assets)
- 擴展(Extensions)
- 請求處理(Handling Requests)
- 運行概述(Overview)
- 引導(Bootstrapping)
- 路由引導與創建 URL(Routing and URL Creation)
- 請求(Requests)
- 響應(Responses)
- Sessions and Cookies
- 錯誤處理(Handling Errors)
- 日志(Logging)
- 關鍵概念(Key Concepts)
- 組件(Components)
- 屬性(Properties)
- 事件(Events)
- 行為(Behaviors)
- 配置(Configurations)
- 別名(Aliases)
- 類自動加載(Class Autoloading)
- 服務定位器(Service Locator)
- 依賴注入容器(Dependency Injection Container)
- 配合數據庫工作(Working with Databases)
- 數據庫訪問(Data Access Objects): 數據庫連接、基本查詢、事務和模式操作
- 查詢生成器(Query Builder): 使用簡單抽象層查詢數據庫
- 活動記錄(Active Record): 活動記錄對象關系映射(ORM),檢索和操作記錄、定義關聯關系
- 數據庫遷移(Migrations): 在團體開發中對你的數據庫使用版本控制
- Sphinx
- Redis
- MongoDB
- ElasticSearch
- 接收用戶數據(Getting Data from Users)
- 創建表單(Creating Forms)
- 輸入驗證(Validating Input)
- 文件上傳(Uploading Files)
- 收集列表輸入(Collecting Tabular Input)
- 多模型同時輸入(Getting Data for Multiple Models)
- 顯示數據(Displaying Data)
- 格式化輸出數據(Data Formatting)
- 分頁(Pagination)
- 排序(Sorting)
- 數據提供器(Data Providers)
- 數據小部件(Data Widgets)
- 操作客戶端腳本(Working with Client Scripts)
- 主題(Theming)
- 安全(Security)
- 認證(Authentication)
- 授權(Authorization)
- 處理密碼(Working with Passwords)
- 客戶端認證(Auth Clients)
- 安全領域的最佳實踐(Best Practices)
- 緩存(Caching)
- 概述(Overview)
- 數據緩存(Data Caching)
- 片段緩存(Fragment Caching)
- 分頁緩存(Page Caching)
- HTTP 緩存(HTTP Caching)
- RESTful Web 服務
- 快速入門(Quick Start)
- 資源(Resources)
- 控制器(Controllers)
- 路由(Routing)
- 格式化響應(Response Formatting)
- 授權驗證(Authentication)
- 速率限制(Rate Limiting)
- 版本化(Versioning)
- 錯誤處理(Error Handling)
- 開發工具(Development Tools)
- 調試工具欄和調試器(Debug Toolbar and Debugger)
- 使用 Gii 生成代碼(Generating Code using Gii)
- TBD 生成 API 文檔(Generating API Documentation)
- 測試(Testing)
- 概述(Overview)
- 搭建測試環境(Testing environment setup)
- 單元測試(Unit Tests)
- 功能測試(Functional Tests)
- 驗收測試(Acceptance Tests)
- 測試夾具(Fixtures)
- 高級專題(Special Topics)
- 高級應用模版(Advanced Project Template)
- 從頭構建自定義模版(Building Application from Scratch)
- 控制臺命令(Console Commands)
- 核心驗證器(Core Validators)
- 國際化(Internationalization)
- 收發郵件(Mailing)
- 性能優化(Performance Tuning)
- 共享主機環境(Shared Hosting Environment)
- 模板引擎(Template Engines)
- 集成第三方代碼(Working with Third-Party Code)
- 小部件(Widgets)
- Bootstrap 小部件(Bootstrap Widgets)
- jQuery UI 小部件(jQuery UI Widgets)
- 助手類(Helpers)
- 助手一覽(Overview)
- Array 助手(ArrayHelper)
- Html 助手(Html)
- Url 助手(Url)