php框架的新时代
本文翻译至web species blog。作者对php框架在未来的发展做出了自己的思考。下文不一定每个人都赞同(其实我也是。你也可以看看原文下面的评论。),不过可以给我们带来一些思考。
在过去的几年中我已经开发了很多的项目工程,大部分是用php开发的。最近(本文写作于2011年5月23日,xmory注)我发现,php框架的发展好像进入了一个新的时代。似乎一切的东西都在发生着变化。我想(在本文中)讨论下我眼中现在php框架的状态,存在什么问题,和新的一批框架将如何改变它。
5月21日我在Dutch PHP conference讨论了这个主题,并对它很感兴趣。这里有那次讨论制作的幻灯片,当然你要知道没有我的参与他们也不会讨论得如此好。本文是我参与讨论内容的简要版本。
框架不断出现
自从6年前,最早的php框架之一cakephp出现以后,太多的框架出现了。现在已经有一百万的框架(这个是作者夸张的吧,xmory注),它们都有自己的MVC、DBAL和模板实现。我欣赏它们,虽然它们都有各自的不凡之处,但是并没有受到太多的人采用。
你看看现在那些php开源项目,有多少是用php开源框架开发的?很少。部分原因是,这些项目出现得比php框架更早,但同时也说明,用框架进行开发需要更多的学习。因此在大多数时候,一个基于框架开发的项目会提高学习的门槛。
尽管如此,它们(指php框架,xmory注)已经改变了我们的开发方式。很多php开发者声称懂得OOP,但是当使用框架的时候他们不得不真正地实现它(这就可能带来问题和麻烦,xmory注)(在此之前他们可以用任意喜欢的方式实现)而php框架则认为php开发者都擅长OOP。现在问问别人如何使用mysql_query,你可能被一拳打脸。两次。因为他们还需要使用mysql_real_escape_string。
为什么会这样
没有人真正的知道php框架应该怎么样。也不知道应该有(和不应该有,xmory注)哪些特性。那在这种情况下为什么人们还开发了这么多的框架?事实上,它们要么是借鉴了其他语言的框架(例如ror),要么是有自己的想法。由于过去没有经验,大多数框架存在一些现在大家都知道不好的设计,但是不可能修复它。
框架的拥护者提供了很多的帮助——就好像php语言的进化一样,php框架通过和拥护者交流有了很大的发展。过去的两年人们对情况比较满意了。但是如果你仔细观察下2007年1.0版本的Zend framework,和现在的1.11比较一下,你会发现还是有很多的改变。因此,即使是今天,框架还在飞速的发展,来适应使用者对特性的需求。
PHP4.0过去被(奇怪的是现在还被部分)所有的框架支持。这将导致很多的代码是过时的,特别是OOP模式。这将在框架支持更多特性和修复bug的时候增加复杂性。同时,越来越少的开发者还愿意使用如此过时的代码。
现在存在什么问题?
首先,使用PHP魔术方法(如__get,__call等)非常流行。初看没什么问题,但是实际上非常危险。它们使API不清晰,(在IDE中,xmory注)不可能自动完成,更重要的是它们很慢。采用它是为了让php遇到未知情况时候能够工作,但是这导致不好的东西出现了。
SCOP——静态类面向对象语言(Static class oriented programming)是我发明的、来描述大多数php代码的术语。静态方法有非常多不好的理由,我从不会考虑(大量)使用它。最重要的是,如果一个类只包含一些静态方法,它不在OOP。它就好像把类只是当作函数的一个容器。甚至有的框架全部采用这种方法。
Zend framework在相当长一段时间内是我最喜爱的php框架(在php5.2中仍然是),但是我对它最主要的意见就是设计一个组件库(component library)太麻烦了。其他的框架也在走老路——不是使用现存的类库,而是写自己特有的。已经创立了非常多的 php类库,很多看起来是独立的,但是(如果想使用它)需要下载整个框架。胖框架真的很烦人。
2011新时代
人们做了两件事情来改善这样的情况。最主要的就是基于php5.3重写框架。 这样可以重新建立新的标准,所有框架的接口都可以统一,和扔掉所有的遗留问题。听起来容易,但是只有这样我们才能进入框架的新时代。
在CakePhp出现之前我没有用过任何的框架,所以我用它作为框架的参照物。实际上我甚至怀疑在CakePhp之前有没有框架,如果你不认为drupal是的话。从CakePhp诞生至今过去的六年我认为是第一个时代,2011开始是第二个,全新的框架将会涌现,不断有新的产品和公告发布。
有趣的是,在2011 PHP不再是PHP,或者说不仅仅是PHP。LAMP让人厌烦而越来越少被使用,Nginx和CouchDB出现了。当今集成和互通是非常重要的因素,语言也是一样——PHP5.3是个全新有活力的新事物,能实现让人疯狂的功能特性,而且如果你用php5.3,没有向后兼容的问题。
那么让我们解决它,好吗?
git的出现使人们贡献代码变得更容易。我被Symfony所震惊,因为它居然吸引了这么多的贡献者(看这里)。(框架更新)步伐越来越快速,和几年前比现在发展得更加迅速。
很多修剪工作已经完成了。首先,所有以前那些晦涩难懂的东西已经没有了,明确定义(explicit definitions)广泛使用。此外,特性是伴随着扩展(extensions)和库(libraries)。这使得框架更加容易使用和更少的内存占用。
php框架最主要的问题是性能,大多数框架将提升性能作为新版本的考虑内容。就像symfony在assets管理(Javascript和Css)上提供助手方法,和proper headers for static content。消除过时的代码使代码更加简洁,而且php5.3性能得到了很大的提升。
新特性
很明显,新框架中使用了所有的php语言新特性。例如名称空间。名称空间的支持,和autoload一起,在很多php框架中实现。PSR-o出现得更早,但是最近才很好地整合进框架。同时匿名函数发挥了它们自己的作用。
我很乐意在这里提一下依赖注入和Annotations;它们改变了我们编码的方式。我喜欢使用它们,通过Symfony能很好地使用这些特性,而其他的框架也在迎头赶上,吸收这些新特性。这些和php语言新特性能够创建非常干净的新的微框架,如Silex。
我并不认为我赞同不断增长的、灵感来自java世界的新特性列表。Java工作和PHP并不不同(需要1GB的内存),而且php语言Dic is sticky。我们需要观察这种变化,不过我有点担心,因为我知道PHP更像一个轻量级的系统,而并不复杂。就像那些新特性宣称多么多么酷一样,它们带来了更多的麻烦而不是解决它们。
什么时候(能看见一个优秀的全新框架)?
Zend Framework 2.0还在开发中,但要出来还需要一段时间。因为ZF有大量的代码,因此第一件事就是需要把旧代码改变成名称空间格式。完成这项工作以后,需要对函数和接口进行重构。最近这项工作中MVC部分已经完工,但是我期望今年年内能出现一个final版本。
Lithium看起来更接近实现。它现在还是dev状态,但是看起来非常接近完结。它看起来和那些常规的框架完全不同,因此非常值得check it out。我很喜欢它的AOP实现,而且很乐于看见在更多的框架中被采纳。显然它们只适用于PHP5.3,但是它们可以非常完美地支持CouchDB和MongoDB。
Symfony 2,在我看来,是这些框架中的领头羊。它现在是beta2,最终版本要出来看起来还需要几个月。很多特性难以领会,因此非常值得check it out来研究,不过我要指出一个(特性)——束(bundle)。束是一种非常有扩展性的工程结构,可以很容易的集成组件(components)。想想插件(plugins)。
总结
我很乐于见到在PHP领域出现的这些新变化,它们必将带来更大的成就。总有一天我们能够丢下历史包袱,专心实现我们的新鲜想法。再5年以后我们将和我们今天一样兴奋。(意味着又一个新时代的开始吗?xmory注)
浙公网安备 33010602011771号