快速理解thinkphp3.2框架運行原理

thinkphp3.2是使用率非常普遍的國產(chǎn)php框架,以簡單易于上手聞名,那么它框架結構是怎樣的?

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

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


然后打開框架核心文件:

首先看到的是定義的一堆系統(tǒng)常量,包括規(guī)定了類名后綴必須是.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的文件,這里面是預先定義的一些需要框架加載時就引入的文件,驅(qū)動,行為,甚至核心文件都有。

不過在tp5和tp5.1這些核心文件都實現(xiàn)了依賴注冊函數(shù)的惰性加載,性能有所提升。


然后是注冊函數(shù)加載不需要初始化的文件,比如model,controller,部分驅(qū)動,這些文件可以在實例化的加載。

然后運行應用:

// 運行應用

? ? ? App::run();

接著,打開應用程序類, 查看執(zhí)行應用過程管理,

首先是對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調(diào)度

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');

}

然后根據(jù)請求的路由規(guī)則,調(diào)用相應的控制器,控制器作為請求的入口,幾乎所有框架都這樣,tp也不例外。

$module = controller(CONTROLLER_NAME,CONTROLLER_PATH);

這里根據(jù)提交請求的參數(shù)名稱實例化相應的控制器,然后調(diào)用相應的方法

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

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


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

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

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,215評論 3 119
  • 理工寢室商店-微信小程序 疑問小結 當時在XAMMP下mysql目錄下的bin下 php -v 不起作用.到ph...
    這個超人不會飛阿閱讀 1,827評論 1 1
  • 1 什么是MVC MVC模式(Model-View-Controller)是軟件工程中的一種軟件架構模式。 MVC...
    申城墨道閱讀 2,150評論 0 10
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,675評論 1 32
  • 1、Windows下SVN使用命令行 https://www.visualsvn.com/downloads/ 安...
    雪_豹閱讀 177評論 0 0

友情鏈接更多精彩內(nèi)容