一個好的框架應該是靈活的、低耦合的,所以配置系統是重要的也是必需的。ThinkPHP提供的配置核心都是基於PHP數組的。在ThinkPHP中,配置文件都是自動加載的(也就是不用顯示require),加載順序為:默認配置->公共配置->模式配置->調試配置->場景配置->模塊配置->擴展配置->動態配置。加載順序優先級從左往右依次遞增,也就是說「動態配置」是最高優先級,如果左邊的配置和右邊有重複,系統會使用右邊的值。
默認配置是ThinkPHP「大道至簡,開發由我」宗旨的核心體現,旨在減少開發的編碼工作而設計的。默認情況下,該配置文件路徑為ThinkPHP/Conf/convention.php,對於一個新的Web項目,,除了資料庫配置可能要自定義之後,幾乎不需要額外的配置定義。所謂公共配置,指的是一個應用下的所有模塊都會加載的配置文件。默認情況下,公共配置的文件路徑為Application/Common/Conf/config.php。針對配置的操作無非讀寫而已,ThinkPHP提供了很方便的配置操作函數C(大寫字母C)。ThinkPHP按照默認的順序加載完配置之後,配置全局有效,在框架作用範圍內(一般指應用目錄下),所有配置都可以直接使用C函數讀取(包括ThinkPHP默認配置)。作為配置操作的一個重要函數,不得不單獨提下C函數。打開文件ThinkPHP/Common/functions.php,可以看到C函數定義如下:
可以看到ThinkPHP的注釋是很詳盡的,就算是沒有使用過C函數的程式設計師,看完注釋之後對C函數的使用方法應該是沒有問題的。C語言函數算法說明如下:
(1)定義static $_config變量,static方式定義的變量本次請求內全局有效。
(2)如果傳入的$name為空,返回所有配置;如果不為空,進入第3步。
(3)判斷$name是否為字符串,如果是,進入第4步;否則進入第12步。
(4)判斷$name中是否有「.」,如果沒有,進入第5步;否則進入第8步。
(5)將$name轉換為大寫,如果$value為null,進入第6步;否則進入第7步。
(6)判斷是否存在名為$name的配置,如果存在,則返回該配置的值;否則返回默認值。
(7)將名稱為$name的配置值設為$value,並返回null。
(8)將$name分割為數組,加入傳入的$name為「user.name」,分割完之後$name為['user','name']。
(9)將$name數組的第1個元素「user」轉換為大寫,如果傳入的$value為null,則進入第10步,負責進入第11步。
(10)判斷是否存在$_config[$name[0]][$name[1]](本例中為$_config['user']['name'])的配置,如果存在,返回$_config[$name[0]][$name[1]]的值,否則返回null。
(11)將名稱為$_config[$name[0]][$name[1]](本例中為$_config['user']['name'])的配置值設為$value,並返回null。
(12)如果$name是數組,則將該數組的全部鍵名轉換為大寫後合併到全局配置中去。
(13)最後返回null是為了防止非法調用函數。
通過源碼分析發現,ThinkPHP的配置名稱只有一級是不區分大小寫的,也就是說C(『DATA_CACHE_TYPE』)和C(『data_cache_type』)的返回值是相等的,但是二級配置是區分大小寫的,也就是說C(『user.name』)和C(『user.NAME』)是不相等的。另外,關於無限級配置,因為源碼中可以看到ThinkPHP在對配置的處理只處理到二級,不支持二級以上配置。