程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Thinkphp,qeephp,cakephp,zendframework,symfony 對比

Thinkphp,qeephp,cakephp,zendframework,symfony 對比

編輯:關於PHP編程

demon認為一個優秀的框架並不是完成僅有的幾個業務流,它應該是可擴充的,
是富有的,是集合,是離散。簡單說它是萬物的矛盾體,既游離又聚合。

體積切入:

                                                                                                                                                                      框架體積cake_1.2.2.81202.01MBqeephp-2.1.2116993KBThinkPHP 1.5947KBZendFramework-1.7.8-minimal16.1MBsymfony 1.2.511.1MB

備注:以上都是刪除不必要的文件比如doc,test等文件後的最小體積

粗略的認為:

國內框架普遍比較小,國外普遍比較大-。。-在這裡不能簡單的認為體積小為好。


目錄結構:

thinkphp

                           attachments/200906/0185740781.jpg左邊是thinkphp 的目錄結構,
demon粗略的看了看:
common下放了運行時,
函數庫,通用性的文件 lang估計是核心內部的語言
lib/org下是一些常用工具: date,io,net,rbac,text等 lib/think下為核心,
主攻mvc流程 plugin下為適配插件 
總結: 實在是太小了,
一眼便看穿了全部
demon從初學者的角度來分析thinkphp的流程:
初始化加載必要的文件,common,core下的幾個類,
就可以調用new app(),
然後嗲用init運行了。
猜測app裡實例化diapatcher然後調用類似run的方法,
開始動作routing。

qeephp

                           attachments/200906/8203777924.jpg粗看qeephp的目錄結構,
給人非常舒服,
層次很清晰,
每一個文件夾對應某個功能域。
並且每個文件下都有與之對應的exception.
command命令行快捷方式 特別要指出,
extend下的behavior是在模型上捆綁行為的。
可以說是decorate模式。
在qeephp中可見運用了一些設計模式來滿足可擴充性,
單一職責。
qeephp的啟動方式。。
一時還找不出來。
這是由於單一職責的好處。
參考了官方的文檔:
看: 
// 獲得應用程序啟動信息 
$app_config = require(dirname(__FILE__) . '/../config/boot.php'); 
// 根據啟動信息中的設置載入 QeePHP 框架和應用程序對象 
require $app_config['QEEPHP_DIR'] . '/library/q.php';
require $app_config['APP_DIR'] . '/myapp.php';
// 構造應用程序對象,並啟動 MVC 模式
echo MyApp::instance($app_config)->dispatching();
很舒服。。。
不過精簡的還不夠,
特別是myapp.php和以下 MyApp::instance($app_config)->dispatching();
的關系很不協調。 (我想作者的意圖是想多入口的多應用程序以及部署模式,
但入口並不應該感知文件名,而是感知索引)
比如: 
// 根據啟動信息中的設置載入 QeePHP 框架和應用程序對象
require $app_config['QEEPHP_DIR'] . '/library/q.php'; 
// 獲得應用程序啟動信息
$app_config = qee_App::getConfiguration("myapp");
// 構造應用程序對象,
並啟動 MVC 模式
qee_App::createInstance($app_config)->dispatching();
如此不是更好。
沒有煩瑣的手動載入,
只要知道要運行哪個app名字就可以了 
總結:
可以說qeephp從目前的目錄結構看,
是可以研究一下的。
當然還存在一些問題。
綜合看qeephp在目錄結構上比thinkphp好

cakephp

                           attachments/200906/0817855137.jpgcake的目錄很有意思:
一個空的app項目目錄。
然後核心就4個cache,controller,model,view 真是mvc啊。。。
很簡單,太簡單,
cakephp提供cli 來初始化一個基本的 mvc application。
所以至於啟動方式也類似於qeephp。

zend

                           attachments/200906/3572758590.jpgzend不得不用縮略圖了,
實在太多太全太大。
zend明顯的很清楚,
比qeephp,symfony都清楚,
並且很全。
特點就是文件夾可以單一的完成某些任務,
這使得所有類都可以單獨剝離出來,
外頭的php文件是實現封裝,
而對應的directory為類包含的類,
運用組合模式結合起來。
zend的啟動方式不熟悉。
但應該不會差。

symfony

                           attachments/200906/0921020140.jpgsymfony 的結構也相對清晰,
但其粒度比zend更細膩。
它將controller,response,request 都分開。
但從整體行來說遜色於zend,
不夠全,
也不夠離散。
symfony的某些組件,
存在一定的依賴性。

總結:

評判標准:

1。目錄層次是否清晰

2。目錄傳達的意思和其內在的類是否一致‘

3。目錄結構一致性

從目錄上來說zend>symfony>qeephp>cakephp>thinkphp

類圖

thinkphp

attachments/200906/9338025661.jpg

核心core類圖,我們可以看到單根繼承,從base派生。think中幾乎所有的類都是從base上繼承

attachments/200906/1879256918.jpg

util的類圖,看都是從base上下來。我用一個簡單的層次關系來描述thinkphp的結構

以base為中心,向外輻射的結構。

qeephp

attachments/200906/0891206433.jpg

看在ea中根的類圖就一個q,多舒服,並且在其他類中,他並沒有為了模式而模式。

看圖:

attachments/200906/4170554686.jpg

看到嗎,沒有任何關系的單類,並且引如context的類,管理應用程序上下文,這是個很好的設計思想。因該是借鑒symfony的吧。後面會分析。

qeephp的類層次,可以說是游離的,分散的。

symfony

類圖生成就用了8分鐘,可以見得其龐大

去掉orm層的插件(symfony的mvc,m由外掛插件支持,propel或者doctince)

應用插件的機制symfony可以靈活的更改m。

attachments/200906/3942026238.jpg

一樣是沒有關聯的單類,通過派生的方式實現對不同配置文件的讀取。

symfony在很多時候都是運用了派生。其配置的驅動由sfcontext來統一驅動,sfconfig統一管理。很好的架構,單一職責,讓多個類在sfcontext的驅動下,完成mvc的業務流。

而sfcontext所在的位置為util,基礎套間,也就是說,如果不需要運行mvc模式,那只需要不調用sfcontext的dispatcher就行鳥,創造一個運行上下文,mvc還是命令行模式,取決於你調用的方法。

幽雅簡單,不亂。

一個context類管理了所有mvc下需要用到的組件。

attachments/200906/5425520156.jpg

zend

同樣的幽雅簡單,也是用一個上下文來管理一切。

zend比較大,圖就不發了。

cakephp

cakephp每什麼好說的。實在太弱小了。demon把它歸類到thinkphp,qeephp,cakephp一檔去。

時間緊迫,用了3小時才整出初步的對比。當然最適合自己的就是最好的。

symfony,zend適合demon,那麼各位看客就自己拿捏吧。

總結:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved