怎么一步步编写简单的PHP的Framework(五)
2019獨角獸企業重金招聘Python工程師標準>>>
? ? ? ?上一次我講到使用自動導入可以實現一個類的延遲加載,這一次我想講一下配置文件。
? ? ? ?不知道大家注意了沒有,前幾篇文章我都沒有涉及到配置文件,可是在一個項目中,配置文件又是比不可少的。
? ? ? ?現在假設將Route.php中的默認控制器和Action變為可配置的,怎么弄呢?
? ? ? ?我們使用最簡單的方式:
?
<?php$defaultController = 'Index';$defaultAction = 'index'; 
? ? ??然后在Route.php中include這個文件:
 
 
 
 
 
 
? ? ? 但是由于配置文件很有可能在整個框架運行過程的各個類都有用到,而前兩種方式都只能在某一個類里面的某一個方法中使用,怎么讓它在各個類都可以使用呢?
? ? ? 我們可以可以使用一個static方法來解決,比如專門定義一個Config類來存放配置信息,Config::get來讀取配置信息,Config::set來設置配置信息,具體做法讀者可以自己去嘗試一下。
? ? ? 當然我不準備采用這種方式,可能當時我看Thinkphp源碼的時候被它優雅的特殊函數C迷住了吧,后面我在寫Toper的時候也使用了一些特殊的函數,而C主要是負責設置和讀取配置信息,個人觀點,面向對象是必要的,但是不是什么都要面向對象,所以我準備定義一個function.php來存放一些公有的函數,我把它稱為公有函數庫。
? ? ? 由于有了公有函數庫,我們可以將上一篇里面的自動導入(__autoload)也轉移到這個文件中,因為在Route.php出現一段__autoload的代碼還是挺詭異的!!
? ? ? 好了,怎么實現剛才我們說的通過一個函數來實現配置信息的設置和讀取呢?
? ? ? 好了,先展示我在Toper中的實現吧:
? ? ??
function C($name = null,$val = null) {static $_config = array();if(empty($name)) {return $_config;} elseif(is_string($name)) {if(empty($val)) {if(!strpos($name,'=>')) {//一維return isset($_config[$name]) ? $_config[$name] : null;} else {//目前只支持二維$name = explode('=>',$name);return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null;}} else {if(!strpos($name,'=>')) {//直接設置$_config[$name] = $val;} else {//設置二維$name = explode('=>',$name);$_config[$name[0]][$name[1]] = $val;}}} elseif(is_array($name)) {foreach($name as $key=>$value) {$_config[$key] = $value;}return ;} else {throw new Exception('參數類型出錯');return ;} } 
? ? ? ? ?看著代碼挺長的,實際上原理很簡單,如果傳遞的參數只有一個,那么第二個參數就調用默認參數,即NULL,再識別是否第一個參數是否是字符串,那么這個函數就識別為讀取,如果第二個參數不為空或第一個參數為數組,那么就識別為設置!!
? ? ? ? ?由于我自己現在比較懶,而且我用這個函數用的函數蠻順手的,所以在這兒我就直接用這個函數來作為例子了,更多內容可以查看Toper的/Library/Toper/function.php。
? ? ? ? ?比如現在要讀取defaultController,那么只要使用C('defaultController')即可,如果要設置,那么使用C('defaultController','Index')!!!
? ? ? ? ? 現在我們只需要在入口文件中導入這個function.php即可:
 
 
? ? ? ? ? 之前我們將配置文件存放在項目根目錄,這樣實際上是不符合之前我們的約定的規范,所以現在講這個配置文件剪切到/UserApps/Configs目錄下面,為了更方便的使用這個路徑,我們定義一個CONFIGS_PATH來指向配置文件的路徑。
? ? ? ? 現在我們看看入口文件變成了什么樣了:
 
 
 
 
 
轉載于:https://my.oschina.net/mingtingling/blog/90143
總結
以上是生活随笔為你收集整理的怎么一步步编写简单的PHP的Framework(五)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: MSDP协议概述
- 下一篇: [转载] 全本张广泰——第三回 广泰逛青
