## 概述
`ThinkPHP5.0`真正實現了按需加載,所有類庫采用自動加載機制,并且支持類庫映射和`composer`類庫的自動加載。
自動加載的實現由`think\Loader`類庫完成,自動加載規范符合PHP的`PSR-4`。
## 自動加載
由于新版`ThinkPHP`完全采用了命名空間的特性,因此只需要給類庫正確定義所在的命名空間,而命名空間的路徑與類庫文件的目錄一致,那么就可以實現類的自動加載。
類庫的自動加載檢測順序如下:
1、類庫映射檢測;
2、`PSR-4`自動加載檢測;
3、`PSR-0`自動加載檢測;
系統會按順序檢測,一旦檢測生效的話,就會自動載入對應的類庫文件。
## 類庫映射
遵循我們上面的命名空間定義規范的話,基本上可以完成類庫的自動加載了,但是如果定義了較多的命名空間的話,效率會有所下降,所以,我們可以給常用的類庫定義類庫映射。命名類庫映射相當于給類文件定義了一個別名,效率會比命名空間定位更高效,例如:
~~~
Loader::addClassMap('think\Log',LIB_PATH.'think\Log.php');
Loader::addClassMap('org\util\Array',LIB_PATH.'org\util\Array.php');
~~~
也可以利用`addClassMap`方法批量導入類庫映射定義,例如:
~~~
$map = [
'think\Log' => LIB_PATH.'think\Log.php',
'org\util\array'=> LIB_PATH.'org\util\Array.php'
];
Loader::addClassMap($map);
~~~
> 雖然通過類庫映射的方式注冊的類可以不強制要求對應命名空間目錄,但是仍然建議遵循PSR-4規范定義類庫和目錄。
## 類庫導入
如果你不需要系統的自動加載功能,又或者沒有使用命名空間的話,那么也可以使用`think\Loader`類的`import`方法手動加載類庫文件,例如:
~~~
Loader::import('org.util.array');
Loader::import('@.util.upload');
~~~
示例
~~~
// 引入 extend/qrcode.php
Loader::import('qrcode', EXTEND_PATH);
// 助手函數
import('qrcode', EXTEND_PATH);
// 引入 extend/wechat-sdk/wechat.class.php
Loader::import('wechat-sdk.wechat', EXTEND_PATH, '.class.php');
// 助手函數
import('wechat-sdk.wechat', EXTEND_PATH, '.class.php');
~~~
類庫導入也采用類似命名空間的概念(但不需要實際的命名空間支持),支持的“根命名空間”包括:
| 目錄 | 說明 |
| --- | --- |
| behavior | 系統行為類庫 |
| think | 核心基類庫 |
| traits | 系統Traits類庫 |
| app | 應用類庫 |
| @ | 表示當前模塊類庫包 |
如果完全遵從系統的命名空間定義的話,一般來說無需手動加載類庫文件,直接實例化即可。
> 比方說 之前的index模塊里 用 `Loader::import('@.util.upload');` 的話 ,這里的@指代的是index 模塊 ,所以加載的是app/index/util/upload.php
`ThinkPHP5.0`不推薦使用`import`方法。
## Composer自動加載
5.0版本支持`Composer`安裝的類庫的自動加載,你可以直接按照`Composer`依賴庫中的命名空間直接調用。