引言:
随着Ruby on Rails的火爆,PHP这个流行的Web应用脚本语言也出现了大量的新一代开发框架。与此同时,国内PHP开发者也开始紧跟国外发展,推出了不同的开发框架。
Ruby on Rails催生变革
在RoR流行之前,PHP领域也有不少开发框架,例如Mojavi、WACT、PHPMvc和Seagull等。这些框架虽然也采用了MVC模式、数据库抽象层等技术。但由于当时PHP本身不像现在这样流行,所以这些框架都没有得到大量应用,最终归于沉寂。
而在感受到RoR提供的快速开发能力后,PHP社区像被注入了兴奋剂。各种应用技术和开发框架层出不穷。
新一代框架的诞生
PHP社区在被RoR震晕后,没有陷入过多的争论。而是立即行动起来,开始了新一代框架的设计。首先出现的第一批框架几乎都是RoR的克隆。例如PHP on Trax(连名字都借鉴Ruby on Rails)和TaniPHP、Akelos等。这些框架最大的特点就是力求100%克隆RoR,不管是采用的架构、设计模式,还是使用方法。
这几个框架一开始确实吸引了开发者的注意,但随着开发者的深入了解,这些框架头上的光环逐步褪色。晦涩难懂的架构、糟糕的性能,以及太多的限制,让这些框架难以在实际项目中运用。
此时,许多PHP开发者认为可以借鉴RoR的设计思想,但不应照搬RoR的结构和实现。为此,一些同样推崇快速开发的框架开始在PHP社区出现。这些框架中,CakePHP和Symfony可谓佼佼者。
CakePHP(http://www.cakephp.org/)
CakePHP充满了RoR的影子,从ActiveRecord模式到视图的布局管理都和RoR非常相似。而且CakePHP一开始也尝试实现与 RoR一样的许多东西。但CakePHP的开发团队后来发现PHP语言和Ruby语言存在巨大区别,因此RoR中的许多设计即便能够在PHP中实现,也是缺乏实用价值的。
CakePHP在发展中逐步走出了RoR的阴影,开始探索更能发挥PHP语言本身优势的架构和实现。因此有一段时间CakePHP的API发生了剧烈的变化,以致其他开发者纷纷停下脚步处于观望状态。
但由于前期一些架构的不合理和对RoR太多的模仿,导致CakePHP的核心部分越来越难以理解,运行性能也不尽人意。而且CakePHP将一个庞大的数据库操作对象作为所有业务对象的基础。这虽然利于快速开发,但却导致对业务逻辑对象的测试非常困难。
对于较小型的项目,CakePHP非常理想。出色的快速开发能力、丰富的API和详尽的文档都可以帮助开发者很快完成工作。但随着项目规模的增加,CakePHP的局限性也变得突出。
Symfony(http://www.symfony-project.com/)
Symfony是一个非常成熟的框架,大量利用了已有的开源项目。Symfony使用Mojavi的核心代码实现了框架的MVC模式,利用 Propel作为数据库抽象层。Symfony不仅功能强大,而且对Ajax有全面的支持。加上官方网站提供的大量文档和教程,并拥有一个活跃的社区,因此受到许多开发者的欢迎。
但是,Symfony最大的问题也在于使用了太多风格迥异的开源项目来组合成框架。由于Mojavi和Propel本身都相当复杂,因此Symfony的结构非常复杂,难以理解和学习。
不过对于希望选择一个框架作为企业内部系统基础架构的企业来说,Symfony的成熟度、丰富的文档和活跃的社区都是值得考虑的。毕竟企业内部系统更为看重的是稳定性和长期的支持。
商业利益与大道至简
看到PHP开发框架的潜在商业价值后,Zend.com联合IBM宣布将要推出一个真正能够发挥PHP优势的开发框架。一时间,这个消息在整个PHP社区引起了地震。大家都开始期盼这个具有“官方”背景的开发框架能够为PHP开发者指出一条正确的道路。
不过世事难测,就在Zend Framework团队公布几个代码片断后,立即就有开发者指出这些代码片段是不可能实现的。事实证明这些代码片段不过是美好的理想。限于PHP语言本身的能力,Zend Framework最终没有实现当初承诺提供的类似RoR中ActiveRecord模式的实现品。
Zend Framework(http://framework.zend.com/)
Zend Framework大量应用了PHP5中面向对象的新特征:接口、异常、抽象类、SPL等等。这些东西的应用让Zend Framework具有高度的模块化和灵活性。同时,因为严格遵循“针对接口编程”和“单一对象职责”等原则,让Zend Framework很有希望成为一个出色的企业应用开发框架。
但不幸的是Zend Framework直到今天,也没有做出更多的突破。在使用Zend Framework开发时,框架对应用程序自身最重要的领域逻辑分离没有提供任何帮助。如果希望开发出真正健壮的企业应用,仍然需要开发者做出相当的努力,并且在Zend Framework之上建造自己的基础设施。
针对这点,批评者指出Zend Framework虽然大量应用PHP5的新特征,但却没有将这些相对于PHP4的优势转化为能够为开发者提供帮助的东西。
对于简单和小型的项目来说,Zend Framework不但不能提高开发效率。反而因为在框架中应用了大量面向对象设计和PHP5的新特征,对开发者提出了更高的要求,间接增加了项目的开发成本。而对于较大的项目和企业应用,Zend Framework倒是一个不错的基础。但要创建一个成功的应用,仍然需要付出不小的努力。并且要时刻注意Zend Framewok的性能问题。
Code Igniter(http://www.codeigniter.com/)
Code Igniter可以说是一匹黑马。Code Igniter出现之时正是Symfony和CakePHP大行其道、Zend Framework万众期待的时刻。可凭借着独特的设计思想,Code Igniter吸引了大批开发者。这点从其火爆的官方论坛就可得到证实。
Code Igniter推崇“简单就是美”这一原则。没有花哨的设计模式、没有华丽的对象结构,一切都是那么简单。几行代码就能开始运行,再加几行代码就可以进行输出。大部分日常开发中用到的东西都可以立即找到,并且可以很容易的使用。Code Igniter可谓是“大道至简”的典范。
但是,Code Igniter本身的实现不太理想。内部结构过于混乱,虽然简单易用,但缺乏扩展能力。因此在发展到1.5系列版本时,作者不得不通过增加各种hooks来为框架提供扩展能力。
国内PHP开发框架
国内虽然过去也曾有开发者发布过一些框架,但这些框架要么太过简单,要么和某一类型的应用紧密耦合,缺乏通用性。直到进入2006年,随着PHP在国内的大量应用和追捧,真正的国产PHP开发框架才陆续发布。
FCS(http://fcs.org.cn/)
FCS是从Java的Struts结构移植过来的中文PHP开发框架,使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,借鉴了国外一些不错的思想,尤其是Java框架方面,因此熟悉Java的开发人员相对比较容易上手,其模版引擎、缓存机制、认证机制和扩展性方面均表现不凡。
在借鉴国外优秀思想的同时,FCS也更多地考虑了国内的应用开发需要。PHP4兼容、完全支持UTF-8,以及PATHINFO支持等,更加有利于国内的主机环境和开发需要。秉着易用和易扩展的原则,FCS采用容易理解的项目、模块和操作机制加上内置的一些自动化操作方法,让应用开发变得更加简单,其功能可以通过基类库以及各种插件的形式灵活扩展,从而满足日益增长的业务需求。正是因为具备良好的开发结构,使得FCS在开发大型应用的时候并不会显得有很多障碍,基于构件的方式,以及配合框架的项目管理机制同样可以让你在处理大型应用的时候一展所长。
FCS力求精简的代码和全中文化的文档、注释,有利于国内PHP开发人员学习和掌握,不过根据目前的情况来看,官方的文档和社区支持目前还比较缺乏,而且对Ajax的支持还不够全面,因此国内的应用成熟度还不够。
FleaPHP(http://www.fleaphp.org/)
開発の観点から見ると、FleaPHP は歴史のあるフレームワークです。過去 3 年間で、FleaPHP は、PFC1 から PFC3 シリーズと、flea1 実験的フレームワークをリリースした後、著者によって立ち上げられた最初の真に成熟した安定した開発フレームワークです。
他の多くのフレームワークとは異なり、FleaPHP は元々、迅速な開発と PHP 自体の利点の最大限の活用という 2 つの焦点を中心に設計されました。したがって、FleaPHP の最大の特徴は、モジュール性と拡張性が非常に高いことです。
FleaPHP フレームワークのコアは非常に小さいですが、柔軟な構成により、さまざまな種類のインフラストラクチャを組み合わせることができます。単純なスクリプト ページの場合、FleaPHP は MVC モードをロードする必要はなく、アプリケーションにビジネス ロジックとデータベース サービスを提供するだけで済みます。複雑なアプリケーションの場合、FleaPHP は、MVC モードの呼び出し、アクセス制御、データ検証からファイルのアップロード、画像処理などに至るまで、さまざまなタスクを完了できます。
この優れたカスタマイズ機能と拡張機能があるからこそ、FleaPHP は「単純なアプリケーションからエンタープライズ開発まで、さまざまなニーズに応える」という目標に真に近づくことができるのです。また、他の多くのフレームワークとは異なり、FleaPHP は実際の開発中に完全に改良されるフレームワークです。そのため、FleaPHPの開発により、さまざまな実用的なアプリケーションが次々と登場しています。 FleaPHP 公式 Web サイトでは、さまざまな実践的なアプリケーションをご覧いただけます。最も単純な企業プロモーション Web サイトから、複雑なコミュニティ Web サイト、企業内部システムなどまで、数多くあります。
FleaPHP は完全国産フレームワークとして、完全な中国語ドキュメントとコードコメントを備えており、拡張機能に関しても国内開発者の実際のニーズに配慮しています。したがって、FleaPHP は海外のさまざまなフレームワークと比較して、国内の開発者に受け入れられやすいです。
しかし、まさに中国にあるからこそ、FleaPHP は海外の同等製品よりも多くの困難に直面しています。貢献者の不足、失礼な批判、懐疑的な目などにより、FleaPHP の開発チームのメンバーにはさらなる献身的な努力が求められています。また、十分な貢献者が不足しているため、FleaPHP フレームワークは現在、ドキュメントや拡張機能の点で他の成熟したフレームワークに遅れをとっています。
そして、他のすべての PHP 開発フレームワークと同様に、FleaPHP は開発者がアプリケーション ドメイン ロジックを分離するのに役立つ方法を見つけていません。ガイダンス文書はありますが、ジュニア開発者にとっては、すぐに使用できるドメイン ロジックの基礎が非常に実用的です。
反省と進歩
RoR がもたらした衝撃はまだ収まっていませんが、PHP 開発者はすでに RoR の足跡を盲目的に追従することが本当に PHP 開発に質的な変化をもたらすことができるのかを考え始めています。
RoR 自体の設計思想に加えて、RoR が大きな成功を収めたもう 1 つの重要な理由は、RoR が Ruby という言語の強みを最大限に活用していることです。 Ruby 動的言語の利点を最大限に活用してください。 PHP では、RoR のデザインをそのままコピーすると、PHP 言語自体の制限に遭遇します。これらの制限を回避するには、開発者はいくつかの理解できないトリックを使用して問題を解決する必要があります。しかし、そうすると、フレームワークの構造があいまいになり、パフォーマンスが低下することがよくあります。
この考察では、Code Igniter や FleaPHP などのフレームワークがこの質問に対する最良の答えです。 PHP 言語自体の利点を最大限に活用することによってのみ、PHP 開発は真に簡単かつ興味深いものになります。
現在、さまざまな PHP 開発フレームワークがそれぞれ独自の特徴を持っていますが、ほぼすべてのフレームワークが開発効率の向上を目指しています。しかし、これらのフレームワークの中には、アプリケーションの保守性を向上させるという問題に注目しているものもありますが、ドメイン ロジックの分離という重要な問題に対する解決策を提案したものはありません。そして、これがまさにこれらのフレームワークが将来進むべき方向です。
単純な Web アプリケーションと複雑なエンタープライズ アプリケーションの場合、この 2 つの違いは、固定されたアーキテクチャではニーズを満たすことができないことを意味します。したがって、カスタム アーキテクチャ機能を提供できる FleaPHP のようなフレームワークを使用すると、開発者はフレームワークのさまざまな組み合わせを試して、単純なものから複雑なものまでさまざまなレベルのニーズを解決できます。
将来、PHP は Web 開発の分野でますます重要なプラットフォームになるでしょう。したがって、より良い開発フレームワークがより多く出現すると私たちは信じています。ただし、開発者としては、問題を解決するために必ずしも特定のフレームワークを使用する必要はありません。しかし、まさにこれらの新しいフレームワークのおかげで、PHP を使用して Web アプリケーションを開発することに対する私たちの理解と把握が何度も促進されてきました。
--------------------------------------
追記: この記事の元の著者は FleaPHP の開発者の 1 人で、国内 PHP