?
終于來(lái)到了正題,本文會(huì)對(duì)config配置文件加載過(guò)程進(jìn)行解析,之前的所有工作都是為了本節(jié)工作做鋪墊
?
雖說(shuō)上面的Yaconf對(duì)于config的源碼解析沒(méi)有多大的幫助,但是也是在擴(kuò)寬一下思路,以后在工作中可以嘗試使用Yaconf。
進(jìn)入正題,想知道Config是怎么進(jìn)行加載解析的,先來(lái)畫(huà)一個(gè)圖。一起看一下加載config的執(zhí)行流程。

回到public/index.php
,在上一期說(shuō)了類(lèi)的自動(dòng)加載是在加載base.php文件的過(guò)程中執(zhí)行的。
那么config的加載是在下圖框起來(lái)的這里,這里涉及到了容器,會(huì)有一個(gè)單獨(dú)的專(zhuān)題來(lái)對(duì)容器進(jìn)行剖析。
這里就不過(guò)多說(shuō)明了,這段代碼回去執(zhí)行`D:phpstudy_proWWWThinkPHPSourceCodeAnalysisthinkphplibrarythinkApp.php這個(gè)文件的run方法。
并且在
run
方法中需要追蹤的是initialize
應(yīng)用初始化這個(gè)函數(shù)
接著在
initialize
這個(gè)方法中就會(huì)看到配置文件的蛛絲馬跡,隨之而來(lái)就是一個(gè)初始化應(yīng)用init
直到走到init方法中,才算是進(jìn)入了主題。
開(kāi)始了自動(dòng)加載配置文件,并且還調(diào)用了config類(lèi)中的load方法,也是需要一起閱讀的。
來(lái)到這里之后需要簡(jiǎn)單的進(jìn)行解讀一下
這段代碼會(huì)直接走到elseif中,因?yàn)樵赼pp目錄下沒(méi)有設(shè)置config目錄
并且這里有個(gè)configPath這個(gè)屬性熟悉吧!這個(gè)值最終就是D:phpstudy_proWWWThinkPHPSourceCodeAnalysisconfig
在接這就是把config目錄下的文件全部拿出來(lái)。
傳遞給config類(lèi)的load方法
在這里有幾個(gè)知識(shí)點(diǎn)提一下,就當(dāng)回顧了
-
scandir :以升序的方式返回一個(gè)目錄下的所有文件,還有第二個(gè)參數(shù)1,表示降序的方式返回一個(gè)目錄下的所有文件。 -
pathinfo:以數(shù)組的形式返回文件信息,分別為目錄名、文件名、擴(kuò)展名,其中的幾個(gè)參數(shù)代碼中有提到,可以看下圖即可。
在這段代碼中有一個(gè)屬性configExt,這個(gè)值是在環(huán)境變量讀出來(lái)的,給的值是php
緊接著就需要來(lái)到
thinkphp/library/think/Config.php
這個(gè)文件了,在app文件中最后調(diào)用了config類(lèi)中的load。
一起來(lái)看看都經(jīng)歷了什么
在load這個(gè)方法中,流程的最終走向會(huì)到loadFile
這個(gè)方法中,至于elseif的代碼為什么不會(huì)走,或者說(shuō)這段代碼就是多余的。
因?yàn)楫?dāng)Yaconf安裝后在PHP啟動(dòng)后就會(huì)直接去加載對(duì)應(yīng)的配置文件
來(lái)到loadFile這個(gè)文件后
我們都知道在ThinkPHP框架中,config目錄下的所有文件都是PHP類(lèi)型的
所以在判斷了類(lèi)型后就直接進(jìn)入到set里邊進(jìn)行數(shù)據(jù)的處理
include直接引入的就是config目錄下的配置文件,并且所有的配置文件都是直接return返回一個(gè)數(shù)組
在set方法中,這塊代碼就是核心了
一直循環(huán)合并數(shù)組,最終把所有的配置信息都返回給了config這個(gè)屬性
截止到這里config目錄下的所有配置就加載完成了。