這篇文章主要講解了“ThinkPHP自動加載Loader源碼分析以及加載類的簡介”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“ThinkPHP自動加載Loader源碼分析以及加載類的簡介”吧!
循化ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
從上圖咔咔給的解析圖,在base.php中首先加載了loader類,接著調(diào)用了register這個方法。
來到
thinkphp\library\think\Loader.php
有一個register的方法,在這個方法里邊,我們先學(xué)習(xí)第一個知識點spl_autoload_register()
聊聊spl_autoload_register前世今生和簡單使用,直接點擊即可查看。
緊接著就是項目的根路徑和composer的路徑。
從這里開始就是在加載composer文件,過程也是很簡單
接著可以去vendor\composer\autoload_static.php文件中可以看到這倆個屬性
這里有一段代碼估計有一部分同學(xué)會在這里繞一下
self::${$attr} = $composerClass::${$attr};
,這里的$attr
就是'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'
這些數(shù)據(jù),外層在加一個$
符號。
從而在ComposerStaticInit30742487e00917c888d89ba216f165b9
這個類中直接獲取對應(yīng)的屬性值,也就是上圖的倆個屬性值。
文件還是thinkphp\library\think\Loader.php
的register
方法
在這里注冊了倆個命令空間,分別為think和traits。然后會進(jìn)入到addNamespace這個方法中在
addNamespace
方法中,添加了Psr4空間
接著來到addPsr4這個方法,會把這倆個命名空間都注冊到
ComposerStaticInit1e269472f484e157e90227b420ffca7a類的$prefixLengthsPsr4和$prefixDirsPsr4這倆個屬性中
為了驗證上面做一個斷點調(diào)試,看到這些數(shù)據(jù)就應(yīng)該清晰了,至于
traits
也是一樣的注冊方式。
截止到這里命名空間就注冊完成了,接下來研究一下psr4命名空間是個什么東東。
psr是簡單的理解就是文件路徑、自動加載對應(yīng)類的相關(guān)規(guī)范、目前TP5.1使用的是psr4規(guī)范
此處的類是指class、接口、超類結(jié)構(gòu)
一個完整的類需要一下結(jié)構(gòu)\<命名空間>(\<子命名空間>)*\<類名>
以下規(guī)范來源于PHP文檔
完整的類名必須要有一個頂級命名空間,被稱為 "vendor namespace";
完整的類名可以有一個或多個子命名空間;
完整的類名必須有一個最終的類名;
完整的類名中任意一部分中的下滑線都是沒有特殊含義的;
完整的類名可以由任意大小寫字母組成;
所有類名都必須是大小寫敏感的。
以下是官方給的一個例子,這個psr規(guī)范能理解就盡量去理解它
到這里,肯定會有一個疑問,這里怎么沒有classmap.php這個文件。不急不慌,先執(zhí)行
php think optimize:autoload
把文件弄出來最終會走到
addClassMap
這個方法,在這個方法中,只是把classmap.php
這個文件的數(shù)據(jù)賦值給$classMap
而已,沒有什么其它的用法
extend這個目錄用過TP框架的都多少用過的,在這個目錄里邊可以存放一下自定義的類庫文件。
根據(jù)下圖可以看到就是使用addAutoLoadDir
這個方法進(jìn)行加載的
在方法中也僅僅是把extend的路徑賦值給了
$fallbackDirsPsr4
這個屬性。
截止到這里
Loader::register();
這部分就結(jié)束了,接著我們深入的看一下內(nèi)部實現(xiàn)和實踐案例。
在以上閱讀源碼中有四個屬性,簡單的整理一下
在剛剛開始解析這里的源碼時就有一個函數(shù)spl_autoload_register
當(dāng)需要使用的類沒有被引入時,這個函數(shù)會在PHP報錯前被觸發(fā),未定義的類名會被當(dāng)作參數(shù)傳入這里會直接去執(zhí)行think\\Loader::autoload
這個方法
經(jīng)過斷點第一個未加載的類就是think\Error
為什么是think\Error呢!可以在回到
thinkphp/base.php
看一下,當(dāng)自動加載完執(zhí)行完成后第一個執(zhí)行的類就是Error
可以簡單的做個測試,將這Error改為Kaka,進(jìn)行打印一下,這時的類就改變?yōu)镵aka。到這里大家對這個類的自動加載機制就有一定的了解了。
當(dāng)使用的類沒有被引入時會把這個類當(dāng)做參數(shù)傳到thinkphp/library/think/Loader.php
的autoload
方法中。
到這里在進(jìn)行看一下autoload這個方法
先從findFile這個方法走,把未引入的類傳入這個方法中,在findFile這個方法中會直接從classMap這個屬性中直接把think\Error這個類映射的文件直接返回出來
將think\Error這個類的完整路徑返回給
autoload
的file
變量后,把win環(huán)境的大小寫給判斷了一次。
然后直接使用include
引入文件即可,直到返回。
直到這里就是一次完整的類的自動加載解析。
雖然到這里結(jié)束了,但是還是得在提一點就是
$classMap
這個屬性,這個屬性是基于文件classmap.php
來到,這個文件的生成也是需要執(zhí)行命令php think optimize:autoload
生成的。
當(dāng)沒有生成這個文件時程序是如何執(zhí)行的呢!
之前的所有流程都是一樣的,只有在findFile
這里不一樣,接下來進(jìn)行簡單的梳理一下。
這時代碼肯定不會走classMap
先獲取think\Error文件
然后經(jīng)過Composer自動加載中的倆個屬性進(jìn)行獲取命名空間,在把think\Error.php文件進(jìn)行拼接
最終返回的結(jié)果也是
D:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\thinkphp\library\think\Error.php
這個文件。
這里的代碼需要好好的閱讀一下。
類的自動加載到這里就是完全結(jié)束了。
先創(chuàng)建一個文件夾kaka
這時在控制器index中引入文件Kaka.php
直接進(jìn)行訪問,這時這個類肯定會報錯,那么我們應(yīng)該怎么操作一下,就可以直接訪問呢!
這個時候就體現(xiàn)到源碼的重要性了,還記得在自動加載的register
函數(shù)中,加載過extend目錄
這時在加一個kaka這個目錄,直接進(jìn)行訪問一下
沒毛病,直接就出來了。一切OK
在這里在聊一下關(guān)于extent的加載方式
在之前聊注冊自動加載類庫目錄只是說明了一下只是把路徑存到了$fallbackDirsPsr4
屬性,沒有細(xì)細(xì)說,接下來就是說明這些了。
閱讀源碼只能是實現(xiàn)那然后查看那
只要是定義的類都會進(jìn)去到autoload進(jìn)行自動加載
同樣也會進(jìn)入到findFile
這個方法
在findFile這個方法中可以看到這段代碼,這個屬性是不是很熟悉,就是自動加載extend目錄時添加到
$fallbackDirsPsr4
屬性的。
當(dāng)在findFile中打印參數(shù)class時看一下數(shù)據(jù)
很清楚地可以看到test\Kaka
這個類
此時在打印一下這個
$fallbackDirsPsr4
屬性里邊返回的file
然后就是使用
__include_file
來直接includeD:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\kaka\test\Kaka.php
我們定義的文件。
以上的這個自定義文件如何實現(xiàn)類的自動加載,并且也就是extend
的加載方式
感謝各位的閱讀,以上就是“ThinkPHP自動加載Loader源碼分析以及加載類的簡介”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對ThinkPHP自動加載Loader源碼分析以及加載類的簡介這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
當(dāng)前名稱:ThinkPHP自動加載Loader源碼分析以及加載類的簡介
本文來源:http://jinyejixie.com/article4/joghie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、做網(wǎng)站、響應(yīng)式網(wǎng)站、App開發(fā)、虛擬主機、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)