框架的意义

编程开发, PHP

PHP界的开发热潮可以用风起云涌来形容了,最新的WEB动向都可以在这里体会到。在我上大学那会还是流行开发论坛,后来流行开发博客,最近似乎开始流行框架了。我们亲爱的水水同学也加入到这水生火热的框架开发大军中了,那么我觉得作为一个PHP开发人员,有必要谈一谈我对框架的看法,希望对这些框架开发者有些启示。

我大二开始接触PHP开发,毕业论文的题目就是《大型网站框架开发》。当然那个时候对框架的认识还是比较幼稚的,但是在实习公司CTO的指导,和大牛老覃的帮助下,对框架的认识开始逐渐加深。到现在已经过了“向世界宣布要独自一人开发出最牛逼,最高效的框架”的时期了,当然并不是磨灭了志气,如果说我有这种资源我还是会尽力一试的,这也就是为什么我一直在推进开源blog项目,因为我们团队有这个实力,我们肯定会成功。

但是框架开发并不是那么回事了,我自己开发过一个框架,那个框架真的完全是我一个人写,也就是现在Magike的前身。当时我心中真是把它当成世界上最好的框架了,执行效率尚可,代码布局规范,开发方便。但是在项目中总会遇到种种问题,当时我对自己的框架开始产生动摇,它毕竟不能解决所有问题,因此我开始在追求全面解决问题的基础上,修改框架,最后搞得身心俱疲,那个项目也以失败告终(当然失败的主要原因是市场运作,而不是技术上的问题)。我当时在这个公司做毕业设计时,公司的CTO告诉我,你只需要回答我一个问题,框架是什么?

现在回想起来,当时的回答可真够烂的,具体是甚暂且不表。经过多个项目的磨炼,我也接触了很多框架,对框架的理解也有所加深。我承认我目前对Zend Framework很欣赏,基本上要我开发项目,我的首选就是它了,自己也给它写了一些插件。现在让我用问答的形式展开此文

1.框架要解决什么问题?

对我来说,框架并不是要给我限制一种开发方式,一种程序结构,它就是帮助我们快速开发的,至于用什么结构,项目多种多样,我们可以自己选择。Zend Framework可以解决这个问题,他几乎包含了所有的PHP应用以及第三方应用支持,所以我选它。因此我并不要求框架给我提供一种解决方案,我只需要它能够根据我的需要组合出一个解决方案。Zend Framework是用package方式来组织项目结构,需要什么模块,只需要引用相关package就行了,也不需要关心依赖问题。

在此我要特别提醒各位框架开发者,目前几乎大多数开源的第三方库都是使用package模式来发布,如果你希望自己的框架能够快速扩展第三方应用,我觉得还是用这种方式来组织结构比较妥当。

2.中小型框架在乎执行效率,大型框架在乎生产效率。

这是它们所服务的对象不同所造成的,初学程序的同学会把程序性能看成头等大事,但当你经过了项目的洗礼后你就会发现,对于大型项目来说程序性能已经被放到比较次要的位置了,结构才是王道。现代计算机系统发展非常迅猛,很多在程序中性能提升的小技巧很快就会被淘汰,特别是像PHP这种脚本语言,最终计算机指令集与其语言解释器本身有很大关系,与其关心这些技巧,不如把注意力放到程序结构的优化上来。

我举一个很简单的例子,为什么在很多框架中都有数据库抽象层这个概念?如果你不理解它的意义,你设计出来的抽象层可能没有任何意义。在我看来数据库抽象层有三个意义

  1. 减少SQL书写量,从而降低出错几率
  2. 通过提供给开发者统一的接口,让Developer与DBA角色分离,即使数据库被更换,也无需更改程序
  3. 缓存考虑

以上三点,第一点,对于小型框架来说一般开发者比较少,出了错可能也是你自己调试,因此基本这一条可以忽略。第二条也可以忽略,理由同第一条。第三条看上去比较重要,但是小型项目在数据库这一级用到缓存的机会比较少,也可以忽略。综上所述,小型框架里没有存在数据库抽象层的必要,直接上SQL吧,当然为了少写些代码,不用每次都要先query再fetch,也为了满足程序员懒得每次都connect数据库的愿望,还是可以简单得封装一下的。但也就是connect封装到__construct里,query封装到fetch里了事,不用搞得太复杂。

如果你想把数据库层搞得复杂点,可以达到另一个极致,现在有的数据库层已经可以直接绑定ORM视图,这意味者什么?意味着你在所见即所得设计工具里把数据库ORM关系映射设计出来,丢到PHP里面就可以直接生成Model了,不用管什么联动操作,因为关系里面都标明了。

可以说这也是一种发展方向,但PHP是一个解决实际问题的语言,它所有的函数都是为了解决问题才出现的,以前天天有人说PHP不够企业级,语言不规范,不是完全OOP等等。其实他们都没有看到PHP流行的实质,没有看到PHP草根的原因?这个原因可以用他们的问题来解释,也就是这个世界上非企业级的问题比企业级的问题多得多。PHP只是专注于它自己的问题,而恰好这个范围又比较大,门槛比较低罢了。

但PHP的学习者也不必担心,自己提高到某个程度后就到顶了,没有这回事,虽然说高处不胜寒,但也有无限风光在险峰一说。其实PHP是一门对系统工程要求比较高的语言,因为它的开放性,开发者需要不停地与不同的系统打交道,一般做过几年开发的,对服务器优化,数据库管理都比较精通。

3.不要盲目地选择框架,更不要盲目地开发框架

经常看到有人用"Hello World"程序来对比两个框架的执行效率。这样的对比是没有任何意义的,虽然大家都说没有意义,但是还是有很多人要这样比,因此我也不指望我说的这句没意义能像许三多那句这么有影响力。就我自己来说,选择框架主要看两点:

  1. 完善的支持
  2. 适合项目需要

为什么我把“完善的支持”放到第一点,因为从某种意义上来说如果你有强大的支持社区那么这个框架也可以和“强大”二字画上等号了,因此从这一点上来说zend framework是世界上最强大的php framework不为过。这种成熟框架的文档一般比较全面而且规范,它不会在一些无关紧要的问题上废话一句,而在那些可能会出现问题的地方则是详加解释,又是注释又是FAQ,从这里就可以看出开发者的素质。可能是自己性格问题,我实在是不喜欢在论坛上提问题等着别人来回答,也不喜欢碰到个问题就要和开发者联系,这样耽误大家的时间。

适合项目需要,当然也不必多提。杀鸡不用牛刀的道理大家都懂。

好了,杂乱地写了这么多,从头到尾看了一下好像又什么都没说,各位权当浮云罢

已有 16 条评论
  1. 理解是够深刻的了,支持~HOHO

  2. 好文,路过,修炼去

  3. 说得很到位啊!尤其这句话深有体会啊! ------------->"初学程序的同学会把程序性能看成头等大事,但当你经过了项目的洗礼后你就会发现,对于大型项目来说程序性能已经被放到比较次要的位置了,结构才是王道。"

    不过其实现在国内很多单干的开发人员还是把程序性能看成头等大事,反而把程序结构和扩展性扔到一边了,其实何必把程序性能追求到那么极致呢,花大精力获得的程序性能提升,把程序的结构和功能做好。还是那句话:程序是工具,工具制造出来是拿来用,实现功能满足人们的需求才是最基本,你看看Windows、PhotoShop 他们只会越来越功能强大,他们的根本不需要考虑提高负载和运行效率,他们去考虑了硬件商还不高兴呢...

  4. 打少了点字上面的某句是:与其花大精力获得的程序性能提升,不如花精力把程序的结构和功能做好。

  5. 一个人住的My饥渴同学~~~

  6. 结构在很大程度上说明了思考的逻辑,逻辑越清晰,结构越容易理解,也越容易为人接受,只是,这种接受是不是也会抹杀创新?值得思考

  7. 分析精当。
    另外,Magike最近不是很活跃,code.magike.org一直连不上

  8. Jeffrey04
    Jeffrey04

    frameworks最基本上要解决的是DRY(Don't Repeat Yourself)的问题。可是最近这几年拜rails所赐,搞到rails-like/inspired frameworks似乎已经变成一个无可抵挡的潮流,个人觉得是很不妥当,至少php不是ruby。曾经也想过写一个framework但是从我这几个月开始透过开始工作的缘故接触一些别的frameworks的经验来看,要我写出一个似乎不太可能也没有这个必要(最近正在用ZF和CodeIgniter,两者的共同点是门槛很低而且documentation很完善),因为一来我的编程经验尚浅,而编写一个framework需要一个很完善的策划不是说随便apply一个design pattern下去就可以解决的。

    虽然现在frameworks的使用是很便利,但是我不太鼓吹过早让初学者去使用frameworks来开发程序。因为frameworks封装了很多很底层的信息处理而这些正是一个web developers必须知道的事情。

  9. @insraq
    新版在秘密开发中...

  10. 不懂,为了获取我的头像而来

  11. 前几天打开这个站怎么突然看到别人博客了..

  12. 混蛋70
    混蛋70

    我们刚刚把服务器换成nginx了,你看到的可能是调试阶段的页面,这个服务器跑了我和我朋友的5个网站。新的官方网站将跑在这个服务器上,所以我们不得不优化一些软件。

  13. 6月眼看就要过去了.. 也不知道某 混蛋70 都飙出什么成果来了.. orz..

  14. joyqi.com = Ajian blog
    www.joyqi.com = 70's blog.

    囧.

  15. 混蛋70
    混蛋70

    I've fixed this bug:)

  16. aileenguan
    aileenguan

    支持70~~~