新里程碑到来 开启PHP框架的新时代
【51CTO 精选译文】我曾在不同的系统和项目中埋头度过了很多年,大部分时间都花在了PHP上。然而就在最近,我注意到一个新的里程碑到来了——PHP框架的新时代。5月21日我在荷兰PHP大会上讲话时谈到这个问题,引发的热烈讨论也让我感到非常有趣。在最近的日子里好像一切都在变化。本文中我想要说说我所认为的PHP目前处在什么状态,哪些地方有问题,还有众多新出现的框架会怎样改变它。
框架的诞生
图一 我使用PHP框架
6年前出现的CakePHP大概是第一个PHP框架,在它以后,我们见到了大量的PHP框架。目前的数量……可能大约有一百万了,这些框架使用着不同的MVC、DBAL和模板实现,我喜欢它们,即使它们各有各的古怪,而且都仍然没有得到大规模的采用。
如果你想要上网找找那些以框架为基础开发的PHP开源项目,能够找到的只有数量很少的一些,这很令人惋惜。部分原因是这些开源项目有很多在发布时甚至还没有任何PHP框架存在,另有部分原因是想用PHP框架来开发确实需要学习相当一段时间。也就是说如果一个PHP项目如果想用框架开发就会增加不少学习难度,至少在大多数情况下。
不过框架们的出现已经确实开始改变了我们开发PHP的方式。许多开发者喜欢在口头上声称他们懂得面向对象,但是当框架出来后,他们要被迫证明他们真正懂得OOP和它的工作方式。如今你要是再让人用mysql_query可能脸上会挨上一两拳,因为他们现在还需要用到mysql_real_escape_string。
框架是怎么做的呢?
没有人真正知道PHP框架应该是什么样子的,它们应该有什么功能。因此,人们是怎么把它们开发出来的呢?好的,他们要么是跟着其他语言(比如RoR)的现有框架照猫画虎,要么是自己拍脑门。因为不存在什么经验可言,现如今大多数的框架都是传统设计的,每个人都知道有问题,但却没法解决。
PHP开发者一贯的务实做法在这里给了很大的帮助——就像PHP作为一种语言在不停进化一样,PHP框架也在不断的根据反馈而改变和成长。有几年里多数人都对已经拥有的功能感到满足了,但是如果你现在再回头看看2007年的Zend Framework 1.0,和1.11相对比功能已经天差地别。因此,即使在今天,框架也正在迅速的发展来满足功能的需要。
PHP 4曾经得到所有PHP框架的支持(令人惊讶的是现在一些框架仍然支持)。这导致了大量的过时代码,特别是OOP模式。试图支持旧版本的PHP让新功能执行起来过于复杂,修正错误也愈发艰难。而且,越来越少的开发者想要面对着这些旧代码工作。
什么出问题了?
图二:每用一次PHP魔术函数,都有一只猫要死于非命! “魔法杀戮”
首先,回到PHP魔术函数(__get、__call等等这些)盛行的年代。初看上去它们没有什么错,但它们实际上是非常危险的。它们让API变得模糊不清,不能自动处理,最重要的是它们很慢。对魔术函数来说,它们的用例就是让PHP被破解而做不想做的事情,它们有用处,但是会发生错误的事情。
SCOP——Static class oriented programming,面向静态类编程,这是我发明的术语,用来描述大部分PHP代码。静态方法从很多方面来说都有问题,但更重要的是,如果一个类只作为静态方法的集合,那么它就离OOP越来越远了,它只是使用类来作为存放各种函数的容器,但是甚至有完整的框架就在做这个。
Zend Framework在很长一段时间是我最喜欢的PHP框架(现在对于PHP 5.2仍然适用),但我和它之间的主要问题是它总是过于卖力的想成为一个组件库。而且其他框架和它走着相同的路——它们各写各的类库,但却不使用现有的库。这就搞得PHP有那么多独立的库,你想要使用就需要下载整个框架,臃肿的框架真令人头疼。
2011年的新时代
为了改善这种情况,人们终于选择要做一些事情。主要是在PHP 5.3的基础上从头开始重写框架。建立新的标准,统一所有框架之间的接口,扔掉所有的遗留问题。这些听起来容易,但只有通过这些事情,我们才能进入框架的新时代。
在CakePHP诞生之前我没有用过任何PHP框架,所以我打算把它算作一个里程碑(其实我有些怀疑CakePHP就是第一个PHP框架,当然你不会把Drupal当做框架的)。从CakePHP开始,至今六年过去了,这六年我称为第一个时代。2011年标志着第二个时代,全新的变革终将发生,我们会迎来各种各样的版本发布和公告。
有趣的是,2011年的PHP好像不再是PHP了,或者可以说不再只是PHP了。有了Nginx和CouchDB这样的新工具,恼人的LAMP stack用的越来越少了。如今集成功能和互操作性成为了关键因素。同样,PHP 5.3更像是一个全新出笼的野兽,它能够给你强大功能,但是并没有真正的支持向后兼容。
我们来解决它,好吗?
图三:来用GIT吧。
Git支持许多PHP框架,给我印象最深的是Symfony,因为它们已经成功的吸引到大量的贡献者,而对比前几年,PHP框架最近步伐又快了很多。
PHP框架们在不停的完善着各种小修改。首先,所有的魔术函数现在已经不见了,显式定义随处可见。此外,人们更多的考虑使用小尺寸的核心,通过扩展和类库来附加功能,这是一个了不起的办法,更易于使用框架,减少内存占用。
性能是PHP框架面对的主要问题,大部分框架在新版本中都做了提升性能的安排。比如Symfony,在前端做了改进用来帮助管理资产(JavaScript和CSS),在PHP端由于清除了魔术函数和清理陈旧代码,通过PHP 5.3得到了巨大的性能提高。
新功能
显然,所有新的语言功能都包含在其中了,例如大多数的框架已经开始支持命名空间,还有更早出现的PSR-0现在很好的集成到框架中,匿名函数也以各种各样的方式在框架中找到了它们的位置。
依赖注射容器(Dependency injection container)和Annotation接口是我想提及的两个,它们能够改变你的编程方式。在Symfony中我很喜欢使用它们,现在其他的框架也正在迎头赶上,开始把它们集成进去。这些结合上新的PHP功能,就可以创建出非常干净的微型框架应用。
我并不喜欢直接把Java的功能列表移植到PHP来,Java的工作方式不同(而且需要1GB内存)。我们看到它正一步步走来,但我有点担心,因为我知道PHP喜欢轻一点的系统,而不是复杂的对象。这些功能听起来很炫,但实际上它们带来的问题比解决的要多。
因此,什么时候?
图四:Symfony2发布
Zend Framework 2.0正在路上,但还需要一段时间。由于ZF有一个庞大的代码库,他们首先要做是把它转换成命名空间代码。完成之后,还要开始重新构建原有功能和新功能。ZF目前正在做MVC方面的工作,我希望今年年底最终版能够发布。
Lithium会来的快些,它还在dev模式,但似乎已经很接近完成了。Lithium是一个和常规完全不同的框架,所以很值得看看。最触动我的是它的AOP实现,显然它只支持PHP 5.3,但它对CouchDB和MongoDB支持的相当不错。
在我看来Symfony2依然在领先群雄。目前它正在Beta2版,但最终版也只是几个月的事儿了。Symfony2功能列表很难总结,所以值得去它的网站查看一下,我想特别说一个——捆绑(Bundle)功能。捆绑是一种方法,可以通过外部的组件集合来扩展应用结构,想想插件吧。
结论