demon认为一个优秀的框架并不是完成仅有的几个业务流,它应该是可扩充的,
是富有的,是集合,是离散。简单说它是万物的矛盾体,既游离又聚合。
体积切入:
备注:以上都是删除不必要的文件比如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,那么各位看客就自己拿捏吧。
总结: