站長資訊網
        最全最豐富的資訊網站

        ThinkPHP自動加載Loader源碼解析

        ?

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

        ?

        前言

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

        一、自動加載loader源碼分析

        1-1 學習目標

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

        1-2 Composer加載

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

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

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

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

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

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

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

        ThinkPHP自動加載Loader源碼解析接著可以去vendorcomposerautoload_static.php文件中可以看到這倆個屬性

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

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

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

        1-3 注冊命名空間

        文件還是thinkphplibrarythinkLoader.phpregister方法

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

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

        ThinkPHP自動加載Loader源碼解析為了驗證上面做一個斷點調試,看到這些數據就應該清晰了,至于traits也是一樣的注冊方式。

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

        1-4 Psr4是什么玩意

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

        此處的類是指class、接口、超類結構

        一個完整的類需要一下結構<命名空間>(<子命名空間>)*<類名>

        以下規范來源于PHP文檔

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

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

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

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

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

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

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

        1-5 加載類庫映射文件

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

        1-6 自動加載extend目錄

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

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

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

        ThinkPHP自動加載Loader源碼解析截止到這里Loader::register();這部分就結束了,接著我們深入的看一下內部實現和實踐案例。

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

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

        二、簡說類的加載過程

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

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

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

        ThinkPHP自動加載Loader源碼解析經過斷點第一個未加載的類就是thinkError

        ThinkPHP自動加載Loader源碼解析為什么是thinkError呢!可以在回到thinkphp/base.php看一下,當自動加載完執行完成后第一個執行的類就是Error

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

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

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

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

        ThinkPHP自動加載Loader源碼解析將thinkError這個類的完整路徑返回給autoloadfile變量后,把win環境的大小寫給判斷了一次。

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

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

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

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

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

        這時代碼肯定不會走classMap

        ThinkPHP自動加載Loader源碼解析先獲取thinkError文件

        ThinkPHP自動加載Loader源碼解析然后經過Composer自動加載中的倆個屬性進行獲取命名空間,在把thinkError.php文件進行拼接

        ThinkPHP自動加載Loader源碼解析最終返回的結果也是D:phpstudy_proWWWThinkPHPSourceCodeAnalysisthinkphplibrarythinkError.php這個文件。

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

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

        三、自定義文件如何實現類的自動加載

        先創建一個文件夾kaka

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

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

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

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

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

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

        ThinkPHP自動加載Loader源碼解析沒毛病,直接就出來了。一切OKThinkPHP自動加載Loader源碼解析在這里在聊一下關于extent的加載方式

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

        閱讀源碼只能是實現那然后查看那

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

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

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

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

        ThinkPHP自動加載Loader源碼解析當在findFile中打印參數class時看一下數據

        很清楚地可以看到testKaka這個類

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

        ThinkPHP自動加載Loader源碼解析然后就是使用__include_file來直接includeD:phpstudy_proWWWThinkPHPSourceCodeAnalysiskakatestKaka.php我們定義的文件。

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

        四、總結

        關于類自動加載的所有流程就完成了,如有錯誤之處可以在評論區哦!

        ?

        堅持學習、堅持寫博、堅持分享是咔咔從業以來一直所秉持的信念。希望在偌大互聯網中咔咔的文章能帶給你一絲絲幫助。我是咔咔,下期見。

        ?

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲精品97久久中文字幕无码| 四虎国产精品永久在线观看| 久久精品国产黑森林| 精品国产福利一区二区| 久久精品国产亚洲一区二区三区| 国产精品手机在线| 日韩精品真人荷官无码| 久久久精品国产Sm最大网站| 亚洲欧美日韩精品| 国语自产少妇精品视频蜜桃| 一本一道久久a久久精品综合| 国产成人精品综合久久久| 99久久精品国产麻豆| 日本午夜精品一区二区三区电影| 久久99精品久久久久久水蜜桃| 亚洲国语精品自产拍在线观看 | 久久国产亚洲精品麻豆| 无码精品人妻一区二区三区人妻斩| 欧美成人精品第一区二区| 国产成人无码精品久久久免费| 国内精品51视频在线观看 | 精品97国产免费人成视频| 精品四虎免费观看国产高清午夜| 精品无码国产自产拍在线观看| 亚洲精品乱码久久久久久自慰| 欧美日韩国产成人高清视频,欧美日韩在线精品一 | 亚洲综合无码精品一区二区三区| 久久精品成人影院| 久久99精品国产麻豆不卡| 国产在线精品一区二区三区不卡| 中文精品久久久久国产网址| 久久99精品国产| 国产精品分类视频分类一区| 92国产精品午夜福利| 国产精品国产亚洲精品看不卡| 国产麻豆一精品一AV一免费| 亚洲AV永久纯肉无码精品动漫| 亚洲一区二区精品视频| 亚洲欧洲精品成人久久奇米网| 亚洲精品无码成人片在线观看 | 911亚洲精品不卡|