thinkphp3.2是使用率非常普遍的國產php框架,以簡單易於上手聞名,那么它框架結構是怎樣的?
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,將控制器方法作為一個中間處理過程,最終輸出到瀏覽器還要進行統一靈活的數據處理。
鏈接:https://www.jianshu.com/p/e48c17bff7e4