ThinkPHP如何自動加載Loader源碼

小編給大家分享一下ThinkPHP如何自動加載Loader源碼,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比宜川網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式宜川網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋宜川地區(qū)。費用合理售后完善,十余年實體公司更值得信賴。

?

想了很久終于要開始系列文章的編寫了,期望是寫出提升和面試都可以搞定的系列文章。 當你看到本文時,如果你發(fā)現(xiàn)咔咔沒有編寫到的面試熱點問題或者技術(shù)難點,期待評論區(qū)指出,一起完善。

?

前言

目前在整理PHP進階路線圖,如有好的建議咔咔會第一時間進行收錄。

一、自動加載loader源碼分析

1-1 學習目標

  • 類的自動加載
  • 類自動加載的倆種方式
  • spl_autoload_register必須會使用
  • 實現(xiàn)自定義文件的類的自動加載

1-2 Composer加載

ThinkPHP如何自動加載Loader源碼
在這里插入圖片描述

從上圖咔咔給的解析圖,在base.php中首先加載了loader類,接著調(diào)用了register這個方法。

ThinkPHP如何自動加載Loader源碼來到thinkphp\library\think\Loader.php有一個register的方法,在這個方法里邊,我們先學習第一個知識點spl_autoload_register()聊聊spl_autoload_register前世今生和簡單使用,直接點擊即可查看。

緊接著就是項目的根路徑和composer的路徑。

ThinkPHP如何自動加載Loader源碼
在這里插入圖片描述

從這里開始就是在加載composer文件,過程也是很簡單

  • 1.判斷composer是否為目錄
  • 2.判斷路徑下面的autoload_static.php是否為文件
  • 3.引入autoload_static.php文件
  • 4.返回所有已經(jīng)聲明的所有類  數(shù)組返回
  • 5.獲取最后一個類ComposerStaticInit30742487e00917c888d89ba216f165b9
  • 6.判斷ComposerStaticInit30742487e00917c888d89ba216f165b9中是否存在數(shù)組中的數(shù)據(jù)

ThinkPHP如何自動加載Loader源碼接著可以去vendor\composer\autoload_static.php文件中可以看到這倆個屬性

ThinkPHP如何自動加載Loader源碼這里有一段代碼估計有一部分同學會在這里繞一下self::${$attr} = $composerClass::${$attr};,這里的$attr就是'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'這些數(shù)據(jù),外層在加一個$符號。

從而在ComposerStaticInit30742487e00917c888d89ba216f165b9這個類中直接獲取對應的屬性值,也就是上圖的倆個屬性值。

ThinkPHP如何自動加載Loader源碼
在這里插入圖片描述

1-3 注冊命名空間

文件還是thinkphp\library\think\Loader.phpregister方法

在這里注冊了倆個命令空間,分別為think和traits。然后會進入到addNamespace這個方法中ThinkPHP如何自動加載Loader源碼addNamespace方法中,添加了Psr4空間

ThinkPHP如何自動加載Loader源碼接著來到addPsr4這個方法,會把這倆個命名空間都注冊到ComposerStaticInit1e269472f484e157e90227b420ffca7a類的$prefixLengthsPsr4和$prefixDirsPsr4這倆個屬性中

ThinkPHP如何自動加載Loader源碼為了驗證上面做一個斷點調(diào)試,看到這些數(shù)據(jù)就應該清晰了,至于traits也是一樣的注冊方式。

截止到這里命名空間就注冊完成了,接下來研究一下psr4命名空間是個什么東東。ThinkPHP如何自動加載Loader源碼

1-4 Psr4是什么玩意

psr是簡單的理解就是文件路徑、自動加載對應類的相關(guān)規(guī)范、目前TP5.1使用的是psr4規(guī)范

此處的類是指class、接口、超類結(jié)構(gòu)

一個完整的類需要一下結(jié)構(gòu)\<命名空間>(\<子命名空間>)*\<類名>

以下規(guī)范來源于PHP文檔

  • 完整的類名必須要有一個頂級命名空間,被稱為 "vendor namespace";

  • 完整的類名可以有一個或多個子命名空間;

  • 完整的類名必須有一個最終的類名;

  • 完整的類名中任意一部分中的下滑線都是沒有特殊含義的;

  • 完整的類名可以由任意大小寫字母組成;

  • 所有類名都必須是大小寫敏感的。

以下是官方給的一個例子,這個psr規(guī)范能理解就盡量去理解它ThinkPHP如何自動加載Loader源碼

1-5 加載類庫映射文件

到這里,肯定會有一個疑問,這里怎么沒有classmap.php這個文件。ThinkPHP如何自動加載Loader源碼不急不慌,先執(zhí)行php think optimize:autoload把文件弄出來ThinkPHP如何自動加載Loader源碼最終會走到addClassMap這個方法,在這個方法中,只是把classmap.php這個文件的數(shù)據(jù)賦值給$classMap 而已,沒有什么其它的用法ThinkPHP如何自動加載Loader源碼

1-6 自動加載extend目錄

extend這個目錄用過TP框架的都多少用過的,在這個目錄里邊可以存放一下自定義的類庫文件。

根據(jù)下圖可以看到就是使用addAutoLoadDir這個方法進行加載的

ThinkPHP如何自動加載Loader源碼在方法中也僅僅是把extend的路徑賦值給了$fallbackDirsPsr4這個屬性。

ThinkPHP如何自動加載Loader源碼截止到這里Loader::register();這部分就結(jié)束了,接著我們深入的看一下內(nèi)部實現(xiàn)和實踐案例。

在以上閱讀源碼中有四個屬性,簡單的整理一下

ThinkPHP如何自動加載Loader源碼
在這里插入圖片描述

二、簡說類的加載過程
ThinkPHP如何自動加載Loader源碼
在這里插入圖片描述

在剛剛開始解析這里的源碼時就有一個函數(shù)spl_autoload_register

當需要使用的類沒有被引入時,這個函數(shù)會在PHP報錯前被觸發(fā),未定義的類名會被當作參數(shù)傳入這里會直接去執(zhí)行think\\Loader::autoload這個方法

ThinkPHP如何自動加載Loader源碼經(jīng)過斷點第一個未加載的類就是think\Error

ThinkPHP如何自動加載Loader源碼為什么是think\Error呢!可以在回到thinkphp/base.php看一下,當自動加載完執(zhí)行完成后第一個執(zhí)行的類就是Error

ThinkPHP如何自動加載Loader源碼可以簡單的做個測試,將這Error改為Kaka,進行打印一下,這時的類就改變?yōu)镵aka。到這里大家對這個類的自動加載機制就有一定的了解了。

當使用的類沒有被引入時會把這個類當做參數(shù)傳到thinkphp/library/think/Loader.phpautoload方法中。

ThinkPHP如何自動加載Loader源碼到這里在進行看一下autoload這個方法

ThinkPHP如何自動加載Loader源碼先從findFile這個方法走,把未因為的類傳入這個方法中,在findFile這個方法中會直接從classMap這個屬性中直接把think\Error這個類映射的文件直接返回出來

ThinkPHP如何自動加載Loader源碼將think\Error這個類的完整路徑返回給autoloadfile變量后,把win環(huán)境的大小寫給判斷了一次。

然后直接使用include引入文件即可,直到返回。

直到這里就是一次完整的類的自動加載解析。

ThinkPHP如何自動加載Loader源碼雖然到這里結(jié)束了,但是還是得在提一點就是$classMap這個屬性,這個屬性是基于文件classmap.php來到,這個文件的生成也是需要執(zhí)行命令php think optimize:autoload生成的。

當沒有生成這個文件時程序是如何執(zhí)行的呢!

之前的所有流程都是一樣的,只有在findFile這里不一樣,接下來進行簡單的梳理一下。

這時代碼肯定不會走classMap

ThinkPHP如何自動加載Loader源碼先獲取think\Error文件

ThinkPHP如何自動加載Loader源碼然后經(jīng)過Composer自動加載中的倆個屬性進行獲取命名空間,在把think\Error.php文件進行拼接

ThinkPHP如何自動加載Loader源碼最終返回的結(jié)果也是D:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\thinkphp\library\think\Error.php這個文件。

這里的代碼需要好好的閱讀一下。

類的自動加載到這里就是完全結(jié)束了。

三、自定義文件如何實現(xiàn)類的自動加載

先創(chuàng)建一個文件夾kaka

ThinkPHP如何自動加載Loader源碼這時在控制器index中引入文件Kaka.php

ThinkPHP如何自動加載Loader源碼直接進行訪問,這時這個類肯定會報錯,那么我們應該怎么操作一下,就可以直接訪問呢!

ThinkPHP如何自動加載Loader源碼
在這里插入圖片描述

這個時候就提現(xiàn)到源碼的重要性了,還記得在自動加載的register函數(shù)中,加載過extend目錄

ThinkPHP如何自動加載Loader源碼
在這里插入圖片描述

這時在加一個kaka這個目錄,直接進行訪問一下

ThinkPHP如何自動加載Loader源碼沒毛病,直接就出來了。一切OKThinkPHP如何自動加載Loader源碼在這里在聊一下關(guān)于extent的加載方式

在之前聊注冊自動加載類庫目錄只是說明了一下只是把路徑存到了$fallbackDirsPsr4屬性,沒有細細說,接下來就是說明這些了。

閱讀源碼只能是實現(xiàn)那然后查看那

ThinkPHP如何自動加載Loader源碼
在這里插入圖片描述

只要是定義的類都會進去到autoload進行自動加載

同樣也會進入到findFile這個方法

ThinkPHP如何自動加載Loader源碼在findFile這個方法中可以看到這段代碼,這個屬性是不是很熟悉,就是自動加載extend目錄時添加到$fallbackDirsPsr4屬性的。

ThinkPHP如何自動加載Loader源碼當在findFile中打印參數(shù)class時看一下數(shù)據(jù)

很清楚地可以看到test\Kaka這個類

ThinkPHP如何自動加載Loader源碼ThinkPHP如何自動加載Loader源碼此時在打印一下這個$fallbackDirsPsr4屬性里邊返回的file

ThinkPHP如何自動加載Loader源碼然后就是使用__include_file來直接includeD:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\kaka\test\Kaka.php我們定義的文件。

以上的這個自定義文件如何實現(xiàn)類的自動加載,并且也就是extend的加載方式

看完了這篇文章,相信你對“ThinkPHP如何自動加載Loader源碼”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)站標題:ThinkPHP如何自動加載Loader源碼
文章來源:http://muchs.cn/article44/jcpihe.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設、企業(yè)網(wǎng)站制作、網(wǎng)站維護定制開發(fā)、建站公司、網(wǎng)站設計公司

廣告

聲明:本網(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)

微信小程序開發(fā)