面向对象陷阱 -- 从CI --> Kohana -->None

宏哥 发布于 2012/10/27 19:40
阅读 4K+
收藏 9

决定抛弃Java, 采用PHP的时候, 对PHP不算特别了解, 所以需要一些Best Practice来参考,看看如何用好这个语言. 在这个过程中, 评估试用了包括但不仅限于: Symphony, YII, CI, Kohana.........

刚开始决定采纳CI的Approach, 根据web开发需要,理由如下:

1: Web是一个Echo System. PHP 已经内嵌了对 http协议输入非常方便的集成, 不需要任何额外框架, 但是输出, 尽管PHP同时也是模板语言,但是, 不够方面, 如果能简化数据对html模板的填充, 支持基本的数组,对象, 以及迭代等基本逻辑操作,就更方便.

2: 对于C, 只需要用正则和Auto_load进行集成, 就很好了. 但是如果单纯从auto_load进行目录扫描, 有点过载.

3: 需要方面的操作数据库.

从这三个方面, CI 都做得不错, 但只能说相比symphony这些大家伙做得更简洁, 仍然有些问题:

1: 模板不够简洁

2: Naming Convention 正好倒过来. 我希望是CI_Controller, 它是Controller_CI.

3: Active Record 仍然是围绕mysql 的"理念". 和实际数据库操作有出入.

但是, Kohana对2进行了改进. Kohana 2基本上是CI的改进版本. 尤其在2, 以及auto_load采用了固化的数组来索引, 查找速度很亏. Kohana 3.0则进一步简化了2. 在很多方面带来改善. 我在一个应用当中采纳了Kohana的做法.

可以看到, 面向对象, 对Naming 的管理, 带来很多便利.  Kohana 3.0已经是很优秀的设计, 但是缺点也很明显:

1: 它缺乏web当中最重要的组件 -- 数据库组件. 选择围绕mysql 做为设计, 用pdo来实现对其他数据库的支持. 这导致实际上, kohana实际并不能提供对mssql/oracle的支持, 这是因为pdo本身, 也是围绕mysql做设计的.所以Kohana无法成为企业当中能够慎重使用的工具, 除非对它进行定制.

然后我们看看它对3.2以及后续版本的开发, 就完全误入歧途了:

1: 数据库组件没有任何改进 和增加的支持

2: 用面向对象中的接口, 设计了大量的接口, 将原先完备的类, 拆分成多个...............Bloats. 实际上, 对于web当中的request对象,让它和 Http interface相关, 毫无意义. 当我们专注web的时候, 没有人会去支持ftp发送过来的请求. 如果需要支持ftp,我们会使用另外一个类,而不是让它们相关.

所以我最后没有选择任何框架, 而是采纳了他们个别的类实现, 并加以改进.

面向对象的抽象是最可怕的, 它打破了本来就应该有的程序边界, 去设计/实现那些毫无用处的接口. 而且那些有用的类, 又疲于兼容这些接口..........

他们到底在干啥, 到底想做啥?

以上只是以PHP所谓web框架作为一个案例来说明.

加载中
0
h2ero
h2ero
以前还想去学python的框架,到了公司用的kohana,不过修改了很多的东西,比如支持namespace,感觉web应用php就够了,CI还是有点点弱,controller之间不能相互调用,以前写的小东西公共方法比如检测登录的都写在modle中,准备玩玩klein.php,感觉用过好的路由实现就可以了,其他的自己来
0
宏哥
宏哥

引用来自“h2ero”的答案

以前还想去学python的框架,到了公司用的kohana,不过修改了很多的东西,比如支持namespace,感觉web应用php就够了,CI还是有点点弱,controller之间不能相互调用,以前写的小东西公共方法比如检测登录的都写在modle中,准备玩玩klein.php,感觉用过好的路由实现就可以了,其他的自己来

是的,根本不需要什么框架. 

但是, 类文件的管理, 或者配置文件的管理, Kohana的做法的确很好.

0
放倒
放倒

别忘了你自己选型出来的那套组合,也叫框架。

0
iceteea
iceteea

也不知道你到底关注框架的什么,所有框架C/V层几乎都中规中矩,我关注是框架对M层的处理,M层支持到位才能更专注于业务逻辑的实现上。

0
宏哥
宏哥

引用来自“Susanno”的答案

也不知道你到底关注框架的什么,所有框架C/V层几乎都中规中矩,我关注是框架对M层的处理,M层支持到位才能更专注于业务逻辑的实现上。

根本就没有M层

直接执行SQL, 返回结果

你那是面向对象的做法

我这个是解决问题的做法

宏哥
宏哥
回复 @放倒 : 这可能是产品开发和项目开发的区别. 项目开发有时候有"必要"把简单的事情"复杂"化,符合相关人的利益目标.
放倒
放倒
你的设计方案确实能快速解决问题,现在的ORM框架不同程度的引入了复杂度,包括C#的Linq to Sql,你顺着做很好用,稍微有点变化就很难使用了。有时候,简单才是解决问题的最终手段。 但,现在初级客户不愿意为简单买单,这也许是现在的应用越做越复杂的根本问题所在。
0
秋水一一
秋水一一
杭州互联网企业提供发展机会和工作平台,有意向小窗联系2418279872
0
猪猪侠
呵呵,一看就知道以前不是写php的,symfony给你写成了ph,哈哈哈哈,手机啊?哈哈哈哈
0
荒野无灯
荒野无灯
3.3 Kohana 采用PSR-0 命名规则,导致从3.2升级到3.3要修改各种类名和Controller中的Model调用的名称,各种蛋疼了。
0
宏哥
宏哥

引用来自“荒野无灯”的答案

3.3 Kohana 采用PSR-0 命名规则,导致从3.2升级到3.3要修改各种类名和Controller中的Model调用的名称,各种蛋疼了。

所以我早就抛弃它了

把3.0修改得面目全非

最后是None

所有的闭门造车, 最终都是制造麻烦

0
inuxor
inuxor

感觉php的框架和python、ruby的框架不是一个概念。后两者离了框架基本上就没法做web了。php完全不用框架也行,如果是小项目甚至连自己构造一个类似框架的东西都多余。

我理解php各种框架就是干了两件事:路由、mvc。路由说白了就是玩的正则,跟php本身关系不大,mvc自己弄一个用着就行,或者干脆别mvc了,您碰见输出直接echo也不丢份

返回顶部
顶部