demon認為一個優秀的框架並不是完成僅有的幾個業務流,它應該是可擴充的,
是富有的,是集合,是離散。簡單說它是萬物的矛盾體,既游離又聚合。
體積切入:
框架體積cake_1.2.2.81202.01MBqeephp-2.1.2116993KBThinkPHP 1.5947KBZendFramework-1.7.8-minimal16.1MBsymfony 1.2.511.1MB
備注:以上都是刪除不必要的文件比如doc,test等文件後的最小體積
粗略的認為:
國內框架普遍比較小,國外普遍比較大-。。-在這裡不能簡單的認為體積小為好。
目錄結構:
thinkphp
左邊是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
粗看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
cake的目錄很有意思:
一個空的app項目目錄。
然後核心就4個cache,controller,model,view 真是mvc啊。。。
很簡單,太簡單,
cakephp提供cli 來初始化一個基本的 mvc application。
所以至於啟動方式也類似於qeephp。
zend
zend不得不用縮略圖了,
實在太多太全太大。
zend明顯的很清楚,
比qeephp,symfony都清楚,
並且很全。
特點就是文件夾可以單一的完成某些任務,
這使得所有類都可以單獨剝離出來,
外頭的php文件是實現封裝,
而對應的directory為類包含的類,
運用組合模式結合起來。
zend的啟動方式不熟悉。
但應該不會差。
symfony
symfony 的結構也相對清晰,
但其粒度比zend更細膩。
它將controller,response,request 都分開。
但從整體行來說遜色於zend,
不夠全,
也不夠離散。
symfony的某些組件,
存在一定的依賴性。
總結:
評判標准:
1。目錄層次是否清晰
2。目錄傳達的意思和其內在的類是否一致‘
3。目錄結構一致性
從目錄上來說zend>symfony>qeephp>cakephp>thinkphp
類圖
thinkphp
核心core類圖,我們可以看到單根繼承,從base派生。think中幾乎所有的類都是從base上繼承
util的類圖,看都是從base上下來。我用一個簡單的層次關系來描述thinkphp的結構
以base為中心,向外輻射的結構。
qeephp
看在ea中根的類圖就一個q,多舒服,並且在其他類中,他並沒有為了模式而模式。
看圖:
看到嗎,沒有任何關系的單類,並且引如context的類,管理應用程序上下文,這是個很好的設計思想。因該是借鑒symfony的吧。後面會分析。
qeephp的類層次,可以說是游離的,分散的。
symfony
類圖生成就用了8分鐘,可以見得其龐大
去掉orm層的插件(symfony的mvc,m由外掛插件支持,propel或者doctince)
應用插件的機制symfony可以靈活的更改m。
一樣是沒有關聯的單類,通過派生的方式實現對不同配置文件的讀取。
symfony在很多時候都是運用了派生。其配置的驅動由sfcontext來統一驅動,sfconfig統一管理。很好的架構,單一職責,讓多個類在sfcontext的驅動下,完成mvc的業務流。
而sfcontext所在的位置為util,基礎套間,也就是說,如果不需要運行mvc模式,那只需要不調用sfcontext的dispatcher就行鳥,創造一個運行上下文,mvc還是命令行模式,取決於你調用的方法。
幽雅簡單,不亂。
一個context類管理了所有mvc下需要用到的組件。
zend
同樣的幽雅簡單,也是用一個上下文來管理一切。
zend比較大,圖就不發了。
cakephp
cakephp每什麼好說的。實在太弱小了。demon把它歸類到thinkphp,qeephp,cakephp一檔去。
時間緊迫,用了3小時才整出初步的對比。當然最適合自己的就是最好的。
symfony,zend適合demon,那麼各位看客就自己拿捏吧。
總結: