###### TP執(zhí)行流程詳解
#### TP執(zhí)行流程
我查看了TP的核心源碼,下面是我對(duì)TP執(zhí)行的一些理解(從入口開(kāi)始,只是一個(gè)大概流程):
1. 入口文件:
單入口文件,里面包含TP的入口文件,``require './ThinkPHP/ThinkPHP.php';
有多個(gè)模塊的話也可以定義多個(gè)入口,(比如對(duì)于后臺(tái)模塊,再新建一個(gè)admin.php)
2.TP入口文件ThinkPHP.php
1. 記錄運(yùn)行時(shí)間(鉤子),用于輸出日志和調(diào)試,個(gè)人認(rèn)為沒(méi)什么用.........
2. 定義系統(tǒng)常量:URL模式、類文件后綴、當(dāng)前文件目錄、系統(tǒng)運(yùn)行目錄、是否調(diào)試模式、緩存目錄、模版目錄、配置文件目錄....等等,然后引入核心Think類``Think.class.php`` ,引入后執(zhí)行這個(gè)類中的start函數(shù)
3.Think.class.php類以及start函數(shù)
1.在start函數(shù)中,先定義注冊(cè)函數(shù),然后定義錯(cuò)誤和異常處理函數(shù)(spl_autoload_register用于自動(dòng)加載未加載的類,register_shutdown_function定義PHP程序執(zhí)行完成后執(zhí)行的函數(shù),set_exception_handler是自定義異常處理函數(shù),這三個(gè)函數(shù)的參數(shù)都是一個(gè)方法名,當(dāng)自動(dòng)加載、執(zhí)行完成、出現(xiàn)異常的時(shí)候,將用這里面?zhèn)鞯姆椒▍?shù)代替php原本的處理機(jī)制,比如 set_exception_handler('Think\Think::appException'); 出現(xiàn)異常的時(shí)候會(huì)調(diào)用appException函數(shù),而不是PHP原生的異常處理函數(shù))
2.加載各種文件:核心文件、配置文件、模式別名定義、模式行為定義等
3.設(shè)置系統(tǒng)時(shí)區(qū)
4.調(diào)用App類中的run方法
5.這個(gè)類中的其他函數(shù)就是在第一步中說(shuō)到的自定義加載、處理函數(shù),(自定義加載中用到了類名映射,就是從當(dāng)前url中解析出模塊名、控制器名、方法名,)
4.App類以及run函數(shù)
1.run函數(shù)中先執(zhí)行監(jiān)聽(tīng)(鉤子類中的)函數(shù)監(jiān)聽(tīng)init方法
2.執(zhí)行init方法(加載動(dòng)態(tài)配置、安全過(guò)濾等);
3.再執(zhí)行鉤子類監(jiān)聽(tīng)函數(shù),監(jiān)聽(tīng)begin方法,設(shè)置session,獲得到應(yīng)用執(zhí)行時(shí)間
4.執(zhí)行exec函數(shù)(去尋找從url中解析出的類,并將其實(shí)例化后調(diào)用方法,輸出結(jié)果)
5.執(zhí)行監(jiān)聽(tīng)函數(shù)監(jiān)聽(tīng)end函數(shù)(應(yīng)用結(jié)束);
這樣整個(gè)執(zhí)行流程就完畢了 ,我看了好幾天...挺難懂的,而且我覺(jué)得TP中要?jiǎng)討B(tài)加載的類太多了,對(duì)于中小型網(wǎng)站來(lái)說(shuō),用不上,反而影響運(yùn)行速度,然后我把這個(gè)執(zhí)行流程里面比較重要的部分挑出來(lái),寫(xiě)進(jìn)了我的框架中,里面的大部分函數(shù)名與TP相同,但是完全是我自己用代碼實(shí)現(xiàn)的,并沒(méi)有用TP的思路。下一章會(huì)詳細(xì)講解我自己理解的MVC框架及思路。