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

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