PHP应用   

Thinkphp,qeephp,cakephp,zendframework,symfony 对比

时间:2009-12-08 18:15:00

demon认为一个优秀的框架并不是完成仅有的几个业务流,它应该是可扩充的,
是富有的,是集合,是离散。简单说它是万物的矛盾体,既游离又聚合。

体积切入:

                                                                                                                                                                      
框架体积
cake_1.2.2.81202.01MB
qeephp-2.1.2116993KB
ThinkPHP 1.5947KB
ZendFramework-1.7.8-minimal16.1MB
symfony 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,那么各位看客就自己拿捏吧。

总结:

 

来源:PHPChina论坛

Notice: Constant RUNTIME already defined in /srv/html/srccn/news/config.php on line 15 Notice: Constant ROOTDIR already defined in /srv/html/srccn/news/config.php on line 16 Notice: Constant SITEDIR already defined in /srv/html/srccn/news/config.php on line 17 Notice: Constant DATAURL already defined in /srv/html/srccn/news/config.php on line 20 Notice: Constant VERSION already defined in /srv/html/srccn/news/system/kernel.php on line 17 Notice: Constant COREDIR already defined in /srv/html/srccn/news/system/kernel.php on line 18 Fatal error: require(): Cannot redeclare class mysql in /srv/html/srccn/news/system/kernel.php on line 22