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