## 概述
ThinkPHP5.0.0 真正實現了按需加載,所有類庫采用自動加載機制,采用了兩種方式來實現:命名空間和類庫映射,并且支持composer類庫的自動加載。
自動加載的實現由`\think\Loader`類庫完成。
## 命名空間
由于新版ThinkPHP完全采用了命名空間的特性,因此只需要給類庫正確定義所在的命名空間,而命名空間的路徑與類庫文件的目錄一致,那么就可以實現類的自動加載。
例如,如果我們實例化`\think\log\driver\File`類的話:
~~~
$class = new \think\log\driver\File();
~~~
系統會自動加載 `thinkphp\library\think\log\driver\File.php` 文件。
如果實例化:
~~~
$class = new \org\UploadFile();
~~~
系統會自動加載 `thinkphp\library\org\UploadFile.php`文件。
如果不清楚什么是命名空間,可以參考PHP手冊相關部分。這里就不對命名空間的用法做過多的描述了。
系統對根命名空間的檢測順序如下:
~~~
1、優先檢測是否存在注冊過的根命名空間
2、檢測composer自動加載的類庫
3、然后檢測核心目錄(LIB_PATH)下是否存在根命名空間的對應子目錄
4、檢測是否應用類庫(APP_PATH)命名空間
5、檢測擴展類庫目錄(EXTEND_PATH)下是否存在根命名空間對應的子目錄
~~~
如果你需要額外的根命名空間的自動加載支持,可以首先注冊根命名空間,例如:
~~~
\think\Loader::addNamespace('org',MY_PATH.'org/');
\think\Loader::addNamespace('com',MY_PATH.'com/');
~~~
> 注冊的根命名空間優先,并且ThinkPHP5注冊的命名空間根必須是小寫。
注冊新的命名空間支持后,我們就可以自動加載該命名空間下面的類庫了。
## 類庫映射
遵循我們上面的命名空間定義規范的話,基本上可以完成類庫的自動加載了,但是如果定義了較多的命名空間的話,效率會有所下降,所以,我們可以給常用的類庫定義類庫映射。命名類庫映射相當于給類文件定義了一個別名,效率會比命名空間定位更高效,例如:
~~~
\think\Loader::addMap('think\Log',LIB_PATH.'think\Log.php');
\think\Loader::addMap('org\util\Array',LIB_PATH.'org\util\Array.php');
~~~
也可以利用addMap方法批量導入類庫映射定義,例如:
~~~
$map = ['think\Log'=>LIB_PATH.'think\Log.php','org\util\array'=>LIB_PATH.'org\util\Array.php'];
\think\Loader::addMap($map);
~~~
> 通過類庫映射的方式注冊的類可以不遵循命名空間必須對應子目錄的規范。
## 類庫導入
如果你不需要系統的自動加載功能,又或者沒有使用命名空間的話,那么也可以使用Think\Loader類的import方法手動加載類庫文件,例如:
~~~
\think\Loader::import('org.util.array');
\think\Loader::import('@.util.upload');
~~~
類庫導入也采用類似命名空間的概念(但不需要實際的命名空間支持),支持的“根命名空間”包括:
|目錄|說明|
|-|
|behavior| 系統行為類庫|
|think| 核心基類庫|
|org| 擴展類庫包|
|com| 企業類庫包|
|@| 表示當前模塊類庫包|
|vendor| 第三方類庫|
|traits| 系統Traits類庫|
~~~
如果完全遵從系統的命名空間定義的話,一般來說無需手動加載類庫文件,直接實例化即可。
## Composer自動加載
5.0版本支持Composer安裝的類庫的自動加載,你可以直接按照Composer依賴庫中的命名空間直接調用。