# Autoloader
關鍵詞 “必須”("MUST")、“一定不可/一定不能”("MUST NOT")、“需要”("REQUIRED")、 “將會”("SHALL")、“不會”("SHALL NOT")、“應該”("SHOULD")、“不該”("SHOULD NOT")、 “推薦”("RECOMMENDED")、“可以”("MAY")和”可選“("OPTIONAL")的詳細描述可參見 \[RFC 2119\]\[\] 。
## 1\. 概述
本 PSR 是關于由文件路徑 \[自動載入\]\[[http://tools.ietf.org/html/rfc2119](http://tools.ietf.org/html/rfc2119)\] 對應類的相關規范, 本規范是可互操作的,可以作為任一自動載入規范的補充,其中包括[PSR-0](https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-0-cn.md),此外, 本 PSR 還包括自動載入的類對應的文件存放路徑規范。
## 2\. 詳細說明
1. 此處的“類”泛指所有的class類、接口、traits可復用代碼塊以及其它類似結構。
2. 一個完整的類名需具有以下結構:
~~~
\<命名空間>(\<子命名空間>)*\<類名>
~~~
1. 完整的類名**必須**要有一個頂級命名空間,被稱為 "vendor namespace";
2. 完整的類名**可以**有一個或多個子命名空間;
3. 完整的類名**必須**有一個最終的類名;
4. 完整的類名中任意一部分中的下滑線都是沒有特殊含義的;
5. 完整的類名**可以**由任意大小寫字母組成;
6. 所有類名都**必須**是大小寫敏感的。
7. 當根據完整的類名載入相應的文件……
8. 完整的類名中,去掉最前面的命名空間分隔符,前面連續的一個或多個命名空間和子命名空間,作為“命名空間前綴”,其必須與至少一個“文件基目錄”相對應;
9. 緊接命名空間前綴后的子命名空間**必須**與相應的”文件基目錄“相匹配,其中的命名空間分隔符將作為目錄分隔符。
10. 末尾的類名**必須**與對應的以`.php`為后綴的文件同名。
11. 自動加載器(autoloader)的實現**一定不能**拋出異常、**一定不能**觸發任一級別的錯誤信息以及**不應該**有返回值。
## 3\. 例子
下表展示了符合規范完整類名、命名空間前綴和文件基目錄所對應的文件路徑。
| 完整類名 | 命名空間前綴 | 文件基目錄 | 文件路徑 |
| --- | --- | --- | --- |
| \\Acme\\Log\\Writer\\File\_Writer | Acme\\Log\\Writer | ./acme-log-writer/lib/ | ./acme-log-writer/lib/File\_Writer.php |
| \\Aura\\Web\\Response\\Status | Aura\\Web | /path/to/aura-web/src/ | /path/to/aura-web/src/Response/Status.php |
| \\Symfony\\Core\\Request | Symfony\\Core | ./vendor/Symfony/Core/ | ./vendor/Symfony/Core/Request.php |
| \\Zend\\Acl | Zend | /usr/includes/Zend/ | /usr/includes/Zend/Acl.php |
關于本規范的實現,可參閱[相關實例](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md)
注意:實例并**不**屬于規范的一部分,且隨時**會**有所變動。