tp3.2框架運行原理

tp3.2設計簡單來說就是CBD,core(框架核心文件),bebavior(行爲,tp3.2一大特點就是鉤子衆多),driver(各種驅動,根據項目需要),針對這三大方面從源碼來看框架的運行的原理。

因爲tp3.2的古老,所以入口文件沒有像5.0和其它主流框架那樣做動靜分離,index.php直接放在根目錄下,打開index.php,裏面有引入框架核心文件從而進入框架:

 

 

 

然後打開框架核心文件:

 

 

首先看到的是定義的一堆系統常量,包括規定了類名後綴必須是.class.php結尾,最後引入並且運行了框架應用,從這裏框架邏輯正式開始。

 

 

 

接着,打開核心Think核心類,首先異常捕捉處理,

// 註冊AUTOLOAD方法

      spl_autoload_register('Think\Think::autoload');     

      // 設定錯誤和異常處理

      register_shutdown_function('Think\Think::fatalError');

      set_error_handler('Think\Think::appError');

      set_exception_handler('Think\Think::appException');

register_shutdown_function,set_error_handler,set_exception_handler三段式,基本每個框架都會有。

接着是加載緩存文件

$runtimefile = RUNTIME_PATH.APP_MODE.'~runtime.php';,

tp裏文件運行先以緩存臨時文件爲主。

接着是最關鍵的一步,引入框架核心文件

$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';

 

 

這裏引入叫commom.php的文件,這裏面是預先定義的一些需要框架加載時就引入的文件,驅動,行爲,甚至核心文件都有。

不過在tp5和tp5.1這些核心文件都實現了依賴註冊函數的惰性加載,性能有所提升。

 

 

 

然後是註冊函數加載不需要初始化的文件,比如model,controller,部分驅動,這些文件可以在實例化的加載。

然後運行應用:

// 運行應用

      App::run();

接着,打開應用程序類, 查看執行應用過程管理,

首先是對http請求方式進行處理,過濾

define('NOW_TIME', $_SERVER['REQUEST_TIME']);

define('REQUEST_METHOD',$_SERVER['REQUEST_METHOD']);

define('IS_GET',        REQUEST_METHOD =='GET' ? true : false);

define('IS_POST',      REQUEST_METHOD =='POST' ? true : false);

define('IS_PUT',        REQUEST_METHOD =='PUT' ? true : false);

define('IS_DELETE',    REQUEST_METHOD =='DELETE' ? true : false);

 // URL調度

Dispatcher::dispatch();

if(C('REQUEST_VARS_FILTER')){

// 全局安全過濾

array_walk_recursive($_GET, 'think_filter');

array_walk_recursive($_POST, 'think_filter');

array_walk_recursive($_REQUEST, 'think_filter');

}

然後根據請求的路由規則,調用相應的控制器,控制器作爲請求的入口,幾乎所有框架都這樣,tp也不例外。

$module = controller(CONTROLLER_NAME,CONTROLLER_PATH);

這裏根據提交請求的參數名稱實例化相應的控制器,然後調用相應的方法

$action = ACTION_NAME.C('ACTION_SUFFIX');

不過這裏做了一個參數傳遞校驗和過濾,個人覺得不是一個好的設計,導致不能在控制器裏直接使用形參,會讓開發變得麻煩,例如爲了避免動態方法調用的繁瑣,通常可以直接注入(Request $request)

 

 

 

通過反射的放射,處理控制器的參數,限制了只有傳參,並且可以自動將http參數賦值給控制器形參,不過這種設計在tp5中被廢除。

進入控制器後就可以進行邏輯代碼編寫了,值得一提的是,tp3.2模板引入還是依賴直接輸出,中斷下面代碼執行的display,到了tp5則和yii2,lavarel一樣改爲return,將控制器方法作爲一箇中間處理過程,最終輸出到瀏覽器還要進行統一靈活的數據處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章