第1章 緒 論
1.1 研究背景
許多PHP程序員經歷了各種開發環境之后,肯定有自己的一套框架選擇池,不同的網站和應用需要不同的框架,但是此論文的論述不在這里討論,只對ThinkPHP和CodeIgniter的一些配置,語法,和一些特性區別給予論述,使讀者對這兩個框架有更好的了解.
1.2 使用框架
開發者可能出于不同的考慮而使用PHP開發框架,不過首當其沖的原因是為了加速開發過程。相似工程之間的代碼重用能夠節省開發者大量的時間和精力。PHP開發框架內置了預建的模塊,免去了冗長又令人厭煩的編程工作。這樣開發者就能夠把時間活在開發實際程序上,而不是每一次都要為每一個項目重建基礎模塊。
穩定性是開發者使用框架的另一個重要原因。盡管簡單是PHP最大的資本,也是許多人喜愛這個腳本語言的原因,它也是PHP的“潘多拉之盒”,尤其是那些初學者而言,PHP是如此的簡單以至于他們會完全沒有意識地寫出低質量的代碼。這樣的PHP程序可能在大多數時間內仍正常工作,但你可能已在代碼中留下了巨大的安全漏洞,使其易受攻擊。要時刻牢記PHP是一門很寬松的語言十分重要,因此確保不在代碼中遺留任何安全漏洞是重中之重――即使程序看起來工作正常。
最后一點,PHP開發框架是可擴展的,并且有許多框架可供選擇。你也可以創造你自己的,不過許多開發者決定從那些流行的知名的開發框架中做選擇,因為它們往往有著龐大的支持團隊,以及相關的論壇/社區方便你與其他使用同一個框架的開發者相互交流。注意,你應當事先檢驗你的項目是否需要使用框架,這里提供一份簡單的列表以供參考:使用框架能否節省你(和其他任何會使用它的人)的時間和精力?是否能夠讓程序得到更好的表現?能否提高穩定性?如果你對上面任何一個問題的回答是肯定的,那么使用PHP開發框架對于這個項目就可能是正確的選擇。
1.3 開發環境
實驗環境:Windows 7 Professional + Apache 2.0 + Mysql 5.0 +PHP 5.4
文件目錄:根目錄/TPCI
TPCI下包括TP和CI兩個文件夾,分別作TP實驗臺的根目錄和CI實驗臺根目錄.
ThinkPHP版本 3.0
CodeIgniter 版本2.1.2
使用編輯器 Notepad++
第2章 ThinkPHP 和CodeIgniter
2.1 ThinkPHP
ThinkPHP可以支持WIN/Unix服務器環境,正式版需要PHP5.0以上版本支持,支持Mysql、PgSQL、Sqlite以及PDO等多種數據庫,ThinkPHP框架本身沒有什么特別模塊要求,具體的應用系統運行環境要求視開發所涉及的模塊。
使用ThinkPHP,你可以更方便和快捷的開發和部署應用,當然不僅僅是企業級應用,任何PHP應用開發都可以從ThinkPHP的簡單、兼容和快速的特性中受益。簡潔、快速和實用是ThinkPHP發展秉承的宗旨,為此ThinkPHP會不斷吸收和融入更好的技術以保證其新鮮和活力,提供WEB應用開發的最佳實踐。 作為一個整體開發解決方案,ThinkPHP能夠解決應用開發中的大多數需要,因為其自身包含了底層架構、兼容處理、基類庫、數據庫訪問層、模板引擎、緩存機制、插件機制、角色認證、表單處理等常用的組件,并且對于跨版本、跨平臺和跨數據庫移植都比較方便。并且每個組件都是精心設計和完善的,應用開發過程僅僅需要關注您的業務邏輯。 ThinkPHP遵循 Apache2 開源許可協議發布,意味著用戶可以免費使用ThinkPHP,甚至允許把用戶的ThinkPHP應用采用商業閉源發布.[1]
ThinkPHP的分層架構采用三層架構模式:
表現層:包含模板視圖、用戶界面、JS、Flash等通過模板引擎的支持,可以使用標簽定義簡化表現層的定義工作。
業務層:包含業務接口層、業務邏輯層、實體層、數據訪問層Action控制器作為業務接口層,提供系統各種業務操作的入口。因此,不提倡在控制器類中寫過多的業務邏輯代碼,雖然說很難嚴格控制。具體的業務邏輯應該封裝到數據訪問對象(Dao)類中實現,如果覺得過于復雜,還可以把子業務在Helper類中包裝后統一調用。業務處理過程一般會構造出業務實體對象(如Vo對象),對業務實體對象的存取通過數據訪問層完成。數據訪問層把實體對象和數據庫數據之間建立映射關系,并且封裝了通用的數據操作。
數據層:目前支持的數據庫有MySql、MsSql、PgSql、Oracle、Sqlite,最新版本已經提供PDO的支持,數據庫的選用和業務邏輯沒有關系。 [1]
模型(M):模型的定義由Model類來完成。Model類位于項目目錄下面的LibModel目錄。
控制器(C):應用控制器(核心控制器)和Action控制器都承擔了控制器的角色,區別在于Action控制器完成業務過程,而應用控制器(App類)負責調度控制。Action控制器位于項目目錄下面的LibAction目錄。
視圖(V):模板的實現是和框架無關的,做到了100%分離,可以獨立預覽和制作。模板目錄位于項目目錄下面的Tpl目錄。 獨創的核心編譯和項目編譯機制 .[1]
ThinkTemplate是一個使用了XML標簽庫技術的編譯型模板引擎,支持兩種類型的模板標簽,使用了動態編譯和緩存技術,而且支持自定義標簽庫。其特點包括:
1)支持XML標簽庫和普通標簽的混合定義;
2)編譯一次,下次直接運行而無需重新編譯;
3)模板文件更新后,自動更新模板緩存;
4)自動加載當前操作的模板緩存文件,無需指定模板文件名稱;
5)支持編碼轉換和Content-Type更換;
6)模板變量輸出前綴支持,避免變量名稱沖突;
7)模板常量替換,無需設置模板變量;
8)支持變量組合調節器和格式化功能;
9)支持替換其它模板引擎插件使用;
10)支持獲取模板頁面內容[1]
內置XML模板引擎,支持標簽庫
富模型支持
1)聚合模型:
聚合模型是一種虛擬模型,用于把數據表的字段抽象化,更加容易理解和操作。
我們可以把數據表中的某些屬性進行數據封裝,這樣就把枯燥的數據表字段賦予更好的可讀性。
2)靜態模型:
靜態模型可以讓模型的數據靜態化,而不需要頻繁和數據庫打交道,可以用于不經常不變的數據表。而且ThinkPHP在ORM層上面模擬實現了數據庫的視圖功能,這是ThinkPHP獨創的一項技術,使得多表的關聯查詢具有更高的效率和可操作性,而無需定義復雜的關聯關系,讓關聯關系更加淺顯易懂。
有些時候,數據表的數據一旦添加后就不再容易變化,我們更希望把這樣的模型數據靜態化,而不需要再次訪問數據庫。ThinkPHP支持靜態模型的概念,一旦把模型設置為靜態,那么會在第一次初始化的時候獲取數據表的全部數據,并生成緩存,以后不會再連接數據庫。而只需要直接訪問模型的dataList數據即可。
3)視圖模型
ThinkPHP在ORM模型里面模擬實現了數據庫的視圖模型,該功能可以用于多表查詢。 要定義視圖對象,需要設置viewModel為true,然后設置viewFields屬性即可。
CURD和操作高度自動化支持
ThinkPHP提供了靈活和方便的數據操作方法,不僅實現了對數據庫操作的四大基本操作(CURD):創建、讀取、更新和刪除的實現,還內置了很多實用的數據操作方法,提供了ActiveRecords模式的最佳體驗。
豐富的查詢語言支持
ThinkPHP大多數情況使用的都是對象查詢,因為充分利用了ORM查詢語言,了解查詢條件的定義對使用對象查詢非常有幫助,對于復雜的查詢,或者從安全方面考慮,可以使用HashMap對象或者索引數組來傳遞查詢條件。
目錄結構自動創建THINKPHP目錄結構
ThinkPHP具有項目目錄自動創建功能,你只需要定義好項目的入口文件,第一次執行入口文件的時候,系統會自動創建項目的相關目錄結構,如果是linux環境下面需要給項目入口文件里面指定的路徑設置可寫權限。
分布式數據庫支持
ThinkPHP的模型支持主從式數據庫的連接,配置DB_DEPLOY_TYPE為1可以采用分布式數據庫支持。
多數據庫連接和切換支持
如果需要在特殊的時候連接多個數據庫,那么可以嘗試使用ThinkPHP的多數據庫連接特性:包括相同類型的數據庫和不同類型的數據庫。(注意:所謂的相同類型數據庫的定義是指和項目配置文件或者模型的數據庫連接的數據庫類型相同。)
ActiveRecords模式和豐富的ROR特性
ThinkPHP實現了ActiveRecords模式的ORM模型,采用了非標準的ORM模型:表映射到類,記錄(集)映射到對象,字段屬性映射到對象的虛擬屬性。最大的特點就是使用方便,從而達到敏捷開發的目的。
靈活簡單的項目配置
ThinkPHP提供了靈活的配置功能,采用最有效率的PHP返回數組方式定義,支持慣例配置、項目配置、調試配置和模塊配置,并且會自動生成配置緩存文件,無需重復解析的開銷。對于有些簡單的應用,你無需配置任何配置文件,而對于復雜的要求,你還可以增加模塊配置文件,另外ThinkPHP的動態配置使得你在開發過程中可以靈活的調整配置參數。
ThinkPHP在項目配置上面創造了自己獨有的分層配置模式,其配置層次體現在:慣例配置-->項目配置-->模塊配置-->操作(動態)配置,優先順序從右到左(在沒有生效的前提下)。
模型自動驗證和處理
系統內置了數據對象的自動驗證功能,而大多數情況下面,數據對象是由表單提交的$_POST數據創建。需要使用系統的自動驗證功能,只需要在Model類里面定義$_validate屬性,是由多個驗證因子組成的數組,支持的驗證因子格式:驗證字段,驗證規則,錯誤提示,驗證條件,附加規則,驗證時間。
靜態頁面生成和多元化緩存機制
ThinkPHP內置了靜態緩存的功能,并且支持靜態緩存的規則定義。要使用靜態緩存功能,需要開啟HTML_CACHE_ON參數,并且在項目配置目錄下面增加靜態緩存規則文件htmls.php。
豐富的數據庫及PDO支持
SEO和URL路由支持
AJAX支持
易擴展的系統基類庫
系統基類庫
ThinkPHP框架通過基類庫的概念把所有系統類庫都集成在一起,包括ThinkPHP的核心類庫。
目前的基類庫分成Think核心類庫、ORG擴展類庫,在這主要介紹的是核心基類庫,核心基類庫的作用是完成框架的通用性開發而必須的基礎類和常用工具類等,包含有:
Think.Core 核心類庫包
Think.Db 數據庫類庫包
Think.Util 系統工具類庫包
Think.Template 內置模板引擎類庫包
Think.Exception 異常處理類庫包函數庫
ThinkPHP內置了一個系統公共函數庫,提供了一些系統需要的函數,系統函數庫位于ThinkPHP的Common目錄下面,名稱為functions.php。
每個項目可以定義自己的函數庫,位于項目的Common目錄下面的common.php文件。
如果項目在Common目錄下面有定義自己的common.php文件,框架會在初始化的時候自動導入,而無需自己導入。
匹配導入
Import方法是ThinkPHP內建的類庫和文件導入方法,提供了方便和靈活的類似于命名空間的文件導入機制。
自動編碼轉換
ThinkPHP框架的文件全部采用UTF-8編碼格式,UTF-8的支持和自動輸出編碼轉換的功能讓頁面表現更加靈活。您可以配置輸出的頁面編碼格式,如gb2312等(默認采用UTF-8輸出)。系統根據配置文件中設置的編碼格式自動對頁面進行編碼轉換,支持iconv和mb_string兩種方式,為了提高效率,如果系統的模板編碼設置和輸出編碼設置項相同,則不會進行編碼轉換。ThinkPHP可以設置模板編碼、輸出編碼和數據庫編碼,并自動完成轉換工作,讓你的應用不再受編碼的苦惱。
組件和插件支持
基于角色的權限控制體系
企業級的應用是離不開安全保護的,ThinkPHP以基于Spring的Acegi安全系統作為參考原型,并做了簡化,以適合目前的ThinkPHP結構,提供了一個多層的、可定制的安全體系來為應用開發提供安全控制。安全體系中主要有: 安全攔截器、認證管理器、決策訪問管理器 、運行身份管理器。[2]
2.2 CodeIgniter
CodeIgniter 是一套給 PHP 網站開發者使用的應用程序開發框架和工具包。它提供一套豐富的標準庫以及簡單的接口和邏輯結構,其目的是使開發人員更快速地進行項目開發。使用 CodeIgniter 可以減少代碼的編寫量,并將你的精力投入到項目的創造性開發上。
CodeIgniter是由Ellislab公司的CEORickEllis開發的。其核心框架是為這個程序特別編寫的,而其他很多類庫、輔助函數和子系統則來自于RickEllis和PaulBurdick編寫的內容管理系統ExpressionEngine。來自RubyonRails的靈感啟發我們創造了一個PHP框架,并且將框架的概念引入到網絡社區的一般意識中。[2]
CodeIgniter 的目標是在最小化,最輕量級的開發包中得到最大的執行效率、功能和靈活性。
為了達到這個目標,我們在開發過程的每一步都致力于基準測試、重構和簡化工作,拒絕加入任何對實現目標沒有幫助的東西。
從技術和架構角度看,CodeIgniter 按照下列目標創建:
動態實例化。在 CodeIgniter 中,組件的導入和函數的執行只有在被要求的時候才執行,而不是在全局范圍。除了最小的核心資源外,不假設系統需要任何資源,因此缺省的系統非常輕量級。被 HTTP 請求所觸發的事件,以及你設計的控制器和視圖將決定它們什么時候被引用。
松耦合。耦合是指一個系統的組件之間的相關程度。越少的組件相互依賴那么這個系統的重用性和靈活性就越好。我們的目標是一個非常松耦合的系統。
組件專一性。專一是指組件有一個非常小的專注目標。在 CodeIgniter 里,為了達到最大的用途,每個類和它的功能都是高度自治的。 CodeIgniter 是一個動態實例化,高度組件專一性的松耦合系統。它在小巧的基礎上力求做到簡單、靈活和高性能。
CodeIgniter 是基于模型-視圖-控制器這一設計模式的。MVC 是一種將應用程序的邏輯層和表現層進行分離的方法。在實踐中,由于表現層從 PHP 腳本中分離了出來,所以它允許你的網頁中只包含很少的腳本。[3]
模型(Model) 代表你的數據結構。通常來說,你的模型類將包含取出、插入、更新你的數據庫資料這些功能。
視圖(View) 是展示給用戶的信息。一個視圖通常是一個網頁,但是在 CodeIgniter 中,一個視圖也可以是一個頁面片段,如頁頭、頁尾。它還可以是一個 RSS 頁面,或任何其它類型的“頁面”。
控制器(Controller) 是模型、視圖以及其他任何處理 HTTP 請求所必須的資源之間的中介,并生成網頁。 CodeIgniter 在 MVC 使用上非常寬松,因此模型不是必需的。如果你不需要使用這種分離方式,或是發覺維護模型比你想象中的復雜很多,你可以不用理會它們而創建自己的應用程序,并最少化使用控制器和視圖。CodeIgniter 也可以和你現有的腳本合并使用,或者允許自行開發此系統的核心庫,其目的是,使你可以以最適合你的方式工作。 [2]
開發框架優秀與否與它有多少特性沒有太大的關系。你從特性中不能推斷出用戶的體驗、不能體驗到框架設計是不是直截了當,是不是智能。特性也不能告訴你框架代碼的質量如何、性能如何、細節處理的如何、安全性如何。判斷一個框架的唯一辦法是在使用中了解它。安裝CodeIgniter很簡單,所以,請你使用它。CodeIgniter的主要特性如下:
* 基于 MVC 體系
* 超輕量級
* 對數種數據庫平臺的全特性支持的數據庫類
* Active Record 支持
* 表單與數據驗證
* 安全性與 XSS 過濾
* Session 管理
* 郵件發送類,支持附件,HTML 或文本郵件,多協議(sendmail, SMTP 和 Mail)及更多。
* 圖像處理類庫(剪裁,縮放,旋轉等)。支持 GD,ImageMagick 和 BetPBM
* 文件上傳類
* FTP 類
* 本地化
* 分頁
* 數據加密
* 基準測試
* 全頁面緩存
* 錯誤日志
* 應用程序評測
* 日歷類
* User-Agent 類
* Zip 編碼類
* 模板引擎類
* Trackback 類
* XML-RPC 類庫
* 單元測試類
* “搜索引擎友好”的 URL
* 靈活的 URI 路由
* 支持鉤子和類擴展
* 大量的輔助函數 [3]
第3章 ThinkPHP 和 CodeIgniter在應用中比較
3.1 配置ThinkPHP
在使用ThinkPHP之前,要先配置,我用的是ThinkPHP 3.0。ThinkPHP 的框架包只有一個名為ThinkPHP的4.63MB的文件夾,將他拷到網站目錄下后,要建立一個index.php的入口文件。ThinkPHP 2.0 的入口文件和ThinkPHP3.0的入口文件有很大區別,最明顯的一點就不用再寫run()方法,ThinkPHP 3.0是自動進行run的.
在拷貝的時候就發現,ThinkPHP 一直在做一個輕量級開發框架,而CodeIgniter框架包比ThinkPHP 還要小,說明CodeIgniter 比ThinkPHP還要輕巧,在后面的敘述中會有詳細解釋.
下面寫ThinkPHP的入口文件,一個ThinkPHP的入口文件包括了幾項.載入框架入口文件
(1) 定義THINK_PATH 框架路徑
(2) 定義APP_NAME 項目名稱
(3) 定義APP_PATH 項目路徑
(4) 定義APP_DEBUG 定義調試模式
(5) 定義SHOW_PAGE_TRACE 顯示頁面軌跡
(6) 加載入口文件(此步為必須,以上為可選)
如果不定義項目路徑, ThinkPHP就會自動在ThinkPHP的當前框架目錄下生成四個文件夾,它們是 Common,Conf,Lang,Lib,Runtime,Tpl,他們基本都是空文件夾,用來存放相應的文件信息:
表3.1 ThinkPHP目錄結構
Common |
項目公共文件目錄,一般放置項目的公共函數 |
Conf |
項目配置目錄,項目所有的配置文件都放在這里 |
Lang |
項目語言包目錄(可選 如果不需要多語言支持 可刪除) |
Lib |
項目類庫目錄,通常包括Action和Model子目錄 |
Tpl |
項目模板目錄,支持模板主題 |
Runtime |
項目運行時目錄,包括Cache(模板緩存)、Temp(數據緩存)、Data(數據目錄)和Logs(日志文件)子目錄,如果存在分組的話,則首先是分組目錄。 |
[3]
圖3.1 ThinkPHP 項目目錄機構1
通過圖片可以看到,如果不定義項目路徑,文件夾和框架