ThinkPHP教程_PHP框架之ThinkPHP(一)【入門和介紹、ThinkPHP版本和文件夾規范、項目入口文件】


一、什么是框架

  就是別人寫好的一批類和一個規則

      注意,不僅僅是在學習中,更是在以后的工作中,在選擇框架的時候,不要一味地追求"大"、"全",而是要根據當時項目的需要選擇合適的框架

  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目錄與緩存CookieSession等等有關  

      ORG目錄

      

        Crypt目錄與加密有關

        Io目錄與目錄處理有關

        Net目錄與網絡處理有關

        Util目錄RBACSocket遍歷分頁等有關

      #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"即可開啟調試模式

  

    

        

  

    

     

    

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM