一、什么是框架
就是別人寫好的一批類和一個規則
注意,不僅僅是在學習中,更是在以后的工作中,在選擇框架的時候,不要一味地追求"大"、"全",而是要根據當時項目的需要選擇合適的框架
1、MVC模式
M Model 模型 就是數據庫操作類(通過數據庫操作類去操作各個表)
V View 視圖 模板
C Controller控制器 控制器來實現模板、模型之間的控制關系
控制器也是一個類,這個類中有不同的方法,所以控制器也叫模塊(Module),其中的方法叫動作(Action)!
那么問題來了,視圖是如何告知哪個控制器(模塊)去執行哪一個方法(動作)呢?結果是URL
比如說在一個項目中有如下兩個模塊
用戶管理 (用戶注冊、用戶修改、用戶刪除、用戶編輯)
商品管理 (用戶下單、修改訂單、取消訂單)
那么就得分為兩個控制器,一個是用戶管理控制器、另一個是商品管理控制器!然后通過URL去告知相應的控制器去執行相應的方法,比如說http://localhost/index.php?m=user&a=reg就表示告知用戶管理控制器(模塊)去執行用戶注冊方法(動作).PS,URL中的m表示Module,a表示Action;index.php叫做主入口文件,注意,所有文件加載都以主入口為准,也就是說必須通過主入口文件去告知某某控制器去執行某某方法!
二、ThinkPHP框架
1、具有比較好的跨平台性
無論是服務器平台(Linux、Windows、Unix)還是服務器軟件(Apache、IIS、Nginx),都能良好的支持
2、文件名大小寫問題
Windows中的文件名是不區分大小寫的,而Linux和Unix中的文件名是區分大小寫的!那么就可能在平台移植過程中,出現文件找不到的情況,而ThinkPHP很好的解決了這個問題,只要在ThinkPHP中開啟了APP_DEBUG,即調試模式,那么即使在Windows下開發,ThinkPHP就已經嚴格區分了大小,這就從源頭上解決了平台移植大小寫的問題!
3、URL支持多種模式
共有4種模式,方便SEO
4、支持自動加載、動態編譯
節約系統開銷
5、AJAX支持、視圖、分組、權限管理、關聯操作、主從數據庫、緩存(apc、db、memcache、shmop、xcache、file)
6、自動驗證、自動完成、映射
7、加載第三方類庫
三、ThinkPHP版本和文件夾規范
1、官網:www.thinkPHP.cn
2、軟件開發階段
A alpha 內部測試
B beta 公開測試
C RC 開發倒計時(該階段已經將重大和重要的BUG進行了修復,僅僅會有一些小的使用性上面的小bug)
D final 正式發行版本
3、ThinkPHP版本
基礎階段學習的是2.1RC版(目前(2016-08-18)在官網上已經沒有2.1RC版了,只有2.1正式版),所以使用的是2.1正式版
ThinkPHP有核心包和完整包之分,完全開發手冊有PDF、swf、CHM版,還有ThinkPHP的API手冊
核心包 僅僅包含ThinkPHP運行的最主要文件(不包含擴展類、示例、文檔)(ThinkPHP_2.1_core.zip)
完整包 核心包的基礎上增加了擴展類、示例、文檔
ps,其實2.x版本的完整包是有帶示例和文檔完整包(ThinkPHP_2.1_full.zip)和帶擴展、示例和文檔完整包(ThinkPHP_2.1_full_with_extend.zip)之分的,但是在3.x以及5.x版本中,完整包就沒有分兩種了(統一叫ThinkPHP_3.1.3_full.zip)
注意,核心包僅僅只有一個ThinkPHP的核心目錄,而且完整包和核心包的ThinkPHP目錄也是不一樣的!完整包的ThinkPHP目錄中的Vender目錄下是有很多擴展類的,而核心包的ThinkPHP目錄中的Vender目錄是空的;完整包的ThinkPHP目錄中的Lib目錄下是有一ORG目錄的,而核心包是沒有的!
文檔下載
4、文件夾規范
ThinkPHP的文件夾規范分兩大塊,一個是系統目錄結構、一個是項目目錄結構
·系統目錄結構
#ThinkPHP.php文件:項目初始化時,單一入口文件必須引入的一個文件,因為系統目錄必須通過這個文件查找
#Common目錄:一些公用的函數,比如說D()、F()等等;其中的convention.php包含ThinkPHP中所有的配置文件需要用到的東西等等
#Lang目錄:語言包,就是將ThinkPHP可能產生的一些錯誤和異常與對應的文字說明做一個映射。而文字說明可以是中文、英文或其它語言,如果是中文就是中文包,英文就是英文包等等
#Lib目錄:包含如下兩個目錄
Think目錄
Db目錄中的Driver目錄就相當於數據庫抽象層,它屏蔽了連接不同數據庫的不同方法,統一為一個名稱。可以直接編寫一個數據庫連接類,比如說DbMongo.class.php,但是一定要注意命名規范!
Exception目錄中是異常處理類
Template目錄中是模板解析類。這里討論一個問題,就是在ThinkPHP中是使用Vendor目錄中加載的第三方類庫(比如說Smarty)來進行模板解析,還是使用ThinkPHP自帶的類庫?答案是,推薦使用ThinkPHP自帶的類庫進行模板解析,原因有兩個(1、兼容性更好 2、模板引擎和標簽處理是XML方式的,處理效率更高)
Util目錄與緩存、Cookie、Session等等有關
ORG目錄
Crypt目錄與加密有關
Io目錄與目錄處理有關
Net目錄與網絡處理有關
Util目錄RBAC、Socket、遍歷、分頁等有關
#Model目錄:框架模式擴展目錄
#Tpl目錄:系統處理模板目錄
#Vendor目錄:第三方類庫
#LICENSE.txt文件:版權聲明
·項目目錄結構
項目初始化操作,在項目目錄下創建一個index.php(文件名隨意,最好與項目中的子項目名相同,比如說項目前台用index.php、項目后台用admin.php,這就是單一入口文件。一般來說,一個項目都有兩個子項目,即前台子項目和后台子項目,但是如果用了項目分組的話,一個子項目就是一個分組,所以就沒有子項目了,也就只有一個單入口文件。ps,單一入口文件名一般小寫,而項目名首字母要大寫),並寫如下代碼,再訪問即可!
#Common目錄:自己寫的公用函數目錄
#Config目錄:配置文件目錄
#Lang目錄:作用同系統目錄結構中的Lang目錄
#Lib目錄:分為如下兩個目錄,通常還有第三個目錄Org,該目錄在項目初始化的過程中是不會自動生成的,可以手動創建
Action目錄:控制器目錄
Model目錄:模型目錄,即自定義數據庫類
Org目錄:擴展類,可以直接將系統目錄中的ORG目錄下的擴展類Copy過來用,也可以自己寫一些擴展類
#Runtime目錄:
Cache目錄:編譯出來的頁面(即編譯后模板)
Data目錄:與表相關的數據
Logs目錄:錯誤日志、運行日志
Temp目錄:文件緩存
~app.php文件和~runtime.php文件都是系統生成的核心編譯文件
#Tpl目錄:Tpl目錄下,一個目錄就是一套皮膚,默認有一個default目錄
四、項目主入口文件
1、THINK_PATH
定義框架路徑,說的簡單點就是將ThinkPHP這個核心目錄相對於入口文件的相對路徑定義給一個常量,方便書寫且不容易寫錯,在以后要用到"./ThinkPHP/"地方用THINK_PATH代替之
define("THINK_PATH","./ThinkPHP");還有一個作用就是防跳牆!所謂防跳牆就是防止用戶直接去訪問敏感文件,通常做法是用一個非敏感頁面去包含這個敏感頁面,並且在非敏感頁面做一些安全方面的策略,比如說進行驗證,驗證通過才允許訪問其中的敏感頁面!這實際上與通過一個public方法去訪問一個private屬性是一個道理的!
2、APP_PATH
准確的說應該叫做應用路徑(APP->Application),而並非項目路徑,雖然叫項目路徑也沒錯,但是總是有些歧義!
·項目應該叫Project,這就是我們所開發的整個項目,ThinkPHP核心目錄就是在項目下一級目錄中
·應用即Application,這是我們所開發的整個項目中的一個個應用,比如說通常一個項目會有前台應用和后台應用,那么就可以在這個項目的下一級目錄中創建兩個入口文件(說明一下,在沒有進行分組時,單一入口文件的這個單一是針對應用來說的,所以如果有兩個應用就需要兩個入口文件),來分別創建這兩個應用,即兩個目錄(與ThinkPHP核心目錄平級)
3、APP_NAME
·讓ThinkPHP在進行加載的時候更好的區分不同的應用
·便於以后在做權限管理(RBAC)的時候,能夠更好的區分前台應用和后台應用的權限
4、引入"ThinkPHP.php"
注意,不要太糾結到底是哪個(include/include_once/require/require_once),重點是把"ThinkPHP.php"這個整個框架的入口文件引入!
5、APP::run();
用APP類的靜態方法run()創建一個應用,並不是非得通過APP來調用這個靜態方法,也可以$app=new APP;$app->run();這樣通過一個APP對象來調用run()實現創建一個應用的操作
五、ThinkPHP的項目編譯機制
項目編譯機制的兩個主要文件,~runtime.php(核心緩存文件)和~app.php(項目編譯緩存文件) ps,注意一下設置都是在入口文件中進行的
對於項目編譯機制的理解,就是在第一次執行的時候,將執行所需要的部分系統代碼和項目代碼拎出來分別放到~runtime.php和~app.php中,那么在以后的執行中,直接執行~runtime.php和~app.php中的代碼,而不必向第一次執行那樣,需要去操作系統目錄和項目目錄中文件,從而節省了大量的I/O開銷,那么項目的運行速度會有明顯的提升!而且ThinkPHP對~runtime.php和~app.php文件本身做了一定優化,即將這兩個文件中的注釋、空格、換行等等一些無關代碼執行的字符去掉了,從而使得文件更小,執行更加有效率!但是這並不利於程序員調試,因為這個代碼就一行你怎么調試,所以要用define("STRIP_RUNTIME_SPACE",false)加上這些注釋、空格、換行等等字符,便於程序員閱讀代碼!
~runtime.php中的代碼是由系統目錄中的core.php文件決定的
~app.php文件通常包含項目配置文件(包括慣例配置(可以理解為默認配置)和項目配置(自定義配置),自定義配置優先級高於默認配置)、項目公用函數文件(common.php)
1、在測試define('STRIP_RUNTIME_SPACE',false);發現的幾個問題
·如果不刪除Runtime目錄,則它是不生效的,因為入口文件在創建整個應用目錄的時候,如果發現要創建的目錄存在,它是不會修改這個存在的目錄的!
·無法直接刪除應用目錄(即使提供了系統管理員權限也不行,不知道咋地),但是可以刪除應用目下的任何一個子目錄
·這條語句必須是放在引入"ThinkPHP.php"的操作之前,否則是不起作用的!實際上,這對入口文件中的所有語句都適用
·這條語句對~app.php不起作用
2、define("RUNTIME_PATH",APP_PATH."xxx/");
可以修改RUNTIME目錄的,不過即使是修改RUMTIME目錄,也要是在應用目錄下,所以最好用APP_PATH拼一下
3、define("NO_CACHE_RUNTIME",True);
進行該設置后,就不會生成核心(系統)緩存文件了,但是還是會生成項目(應用)編譯緩存文件,而在調試模式下不會生成項目編譯緩存,但是會生成核心緩存,所以要想既不生成核心緩存也不生成項目編譯緩存,就要同時開啟調試模式和進行該設置。在應用配置文件(應用目錄->Config目錄->Config.php文件)中的數組中添加一個元素"APP_DEBUG"=>"True"即可開啟調試模式