引言:
隨著Ruby on Rails的火爆,PHP這個流行的Web應用腳本語言也出現(xiàn)了大量的新一代開發(fā)框架。與此同時,國內(nèi)PHP開發(fā)者也開始緊跟國外發(fā)展,推出了不同的開發(fā)框架。
Ruby on Rails催生變革
在RoR流行之前,PHP領域也有不少開發(fā)框架,例如Mojavi、WACT、PHPMvc和Seagull等。這些框架雖然也采用了MVC模式、數(shù)據(jù)庫抽象層等技術。但由于當時PHP本身不像現(xiàn)在這樣流行,所以這些框架都沒有得到大量應用,最終歸于沉寂。
而在感受到RoR提供的快速開發(fā)能力后,PHP社區(qū)像被注入了興奮劑。各種應用技術和開發(fā)框架層出不窮。
新一代框架的誕生
PHP社區(qū)在被RoR震暈后,沒有陷入過多的爭論。而是立即行動起來,開始了新一代框架的設計。首先出現(xiàn)的第一批框架幾乎都是RoR的克隆。例如PHP on Trax(連名字都借鑒Ruby on Rails)和TaniPHP、Akelos等。這些框架最大的特點就是力求100%克隆RoR,不管是采用的架構、設計模式,還是使用方法。
這幾個框架一開始確實吸引了開發(fā)者的注意,但隨著開發(fā)者的深入了解,這些框架頭上的光環(huán)逐步褪色?;逎y懂的架構、糟糕的性能,以及太多的限制,讓這些框架難以在實際項目中運用。
此時,許多PHP開發(fā)者認為可以借鑒RoR的設計思想,但不應照搬RoR的結構和實現(xiàn)。為此,一些同樣推崇快速開發(fā)的框架開始在PHP社區(qū)出現(xiàn)。這些框架中,CakePHP和Symfony可謂佼佼者。
CakePHP(http://www.cakephp.org/)
CakePHP充滿了RoR的影子,從ActiveRecord模式到視圖的布局管理都和RoR非常相似。而且CakePHP一開始也嘗試實現(xiàn)與 RoR一樣的許多東西。但CakePHP的開發(fā)團隊后來發(fā)現(xiàn)PHP語言和Ruby語言存在巨大區(qū)別,因此RoR中的許多設計即便能夠在PHP中實現(xiàn),也是缺乏實用價值的。
CakePHP在發(fā)展中逐步走出了RoR的陰影,開始探索更能發(fā)揮PHP語言本身優(yōu)勢的架構和實現(xiàn)。因此有一段時間CakePHP的API發(fā)生了劇烈的變化,以致其他開發(fā)者紛紛停下腳步處于觀望狀態(tài)。
但由于前期一些架構的不合理和對RoR太多的模仿,導致CakePHP的核心部分越來越難以理解,運行性能也不盡人意。而且CakePHP將一個龐大的數(shù)據(jù)庫操作對象作為所有業(yè)務對象的基礎。這雖然利于快速開發(fā),但卻導致對業(yè)務邏輯對象的測試非常困難。
對于較小型的項目,CakePHP非常理想。出色的快速開發(fā)能力、豐富的API和詳盡的文檔都可以幫助開發(fā)者很快完成工作。但隨著項目規(guī)模的增加,CakePHP的局限性也變得突出。
Symfony(http://www.symfony-project.com/)
Symfony是一個非常成熟的框架,大量利用了已有的開源項目。Symfony使用Mojavi的核心代碼實現(xiàn)了框架的MVC模式,利用 Propel作為數(shù)據(jù)庫抽象層。Symfony不僅功能強大,而且對Ajax有全面的支持。加上官方網(wǎng)站提供的大量文檔和教程,并擁有一個活躍的社區(qū),因此受到許多開發(fā)者的歡迎。
但是,Symfony最大的問題也在于使用了太多風格迥異的開源項目來組合成框架。由于Mojavi和Propel本身都相當復雜,因此Symfony的結構非常復雜,難以理解和學習。
不過對于希望選擇一個框架作為企業(yè)內(nèi)部系統(tǒng)基礎架構的企業(yè)來說,Symfony的成熟度、豐富的文檔和活躍的社區(qū)都是值得考慮的。畢竟企業(yè)內(nèi)部系統(tǒng)更為看重的是穩(wěn)定性和長期的支持。
商業(yè)利益與大道至簡
看到PHP開發(fā)框架的潛在商業(yè)價值后,Zend.com聯(lián)合IBM宣布將要推出一個真正能夠發(fā)揮PHP優(yōu)勢的開發(fā)框架。一時間,這個消息在整個PHP社區(qū)引起了地震。大家都開始期盼這個具有“官方”背景的開發(fā)框架能夠為PHP開發(fā)者指出一條正確的道路。
不過世事難測,就在Zend Framework團隊公布幾個代碼片斷后,立即就有開發(fā)者指出這些代碼片段是不可能實現(xiàn)的。事實證明這些代碼片段不過是美好的理想。限于PHP語言本身的能力,Zend Framework最終沒有實現(xiàn)當初承諾提供的類似RoR中ActiveRecord模式的實現(xiàn)品。
Zend Framework(http://framework.zend.com/)
Zend Framework大量應用了PHP5中面向對象的新特征:接口、異常、抽象類、SPL等等。這些東西的應用讓Zend Framework具有高度的模塊化和靈活性。同時,因為嚴格遵循“針對接口編程”和“單一對象職責”等原則,讓Zend Framework很有希望成為一個出色的企業(yè)應用開發(fā)框架。
但不幸的是Zend Framework直到今天,也沒有做出更多的突破。在使用Zend Framework開發(fā)時,框架對應用程序自身最重要的領域邏輯分離沒有提供任何幫助。如果希望開發(fā)出真正健壯的企業(yè)應用,仍然需要開發(fā)者做出相當?shù)呐?,并且在Zend Framework之上建造自己的基礎設施。
針對這點,批評者指出Zend Framework雖然大量應用PHP5的新特征,但卻沒有將這些相對于PHP4的優(yōu)勢轉化為能夠為開發(fā)者提供幫助的東西。
對于簡單和小型的項目來說,Zend Framework不但不能提高開發(fā)效率。反而因為在框架中應用了大量面向對象設計和PHP5的新特征,對開發(fā)者提出了更高的要求,間接增加了項目的開發(fā)成本。而對于較大的項目和企業(yè)應用,Zend Framework倒是一個不錯的基礎。但要創(chuàng)建一個成功的應用,仍然需要付出不小的努力。并且要時刻注意Zend Framewok的性能問題。
Code Igniter(http://www.codeigniter.com/)
Code Igniter可以說是一匹黑馬。Code Igniter出現(xiàn)之時正是Symfony和CakePHP大行其道、Zend Framework萬眾期待的時刻??蓱{借著獨特的設計思想,Code Igniter吸引了大批開發(fā)者。這點從其火爆的官方論壇就可得到證實。
Code Igniter推崇“簡單就是美”這一原則。沒有花哨的設計模式、沒有華麗的對象結構,一切都是那么簡單。幾行代碼就能開始運行,再加幾行代碼就可以進行輸出。大部分日常開發(fā)中用到的東西都可以立即找到,并且可以很容易的使用。Code Igniter可謂是“大道至簡”的典范。
但是,Code Igniter本身的實現(xiàn)不太理想。內(nèi)部結構過于混亂,雖然簡單易用,但缺乏擴展能力。因此在發(fā)展到1.5系列版本時,作者不得不通過增加各種hooks來為框架提供擴展能力。
國內(nèi)PHP開發(fā)框架
國內(nèi)雖然過去也曾有開發(fā)者發(fā)布過一些框架,但這些框架要么太過簡單,要么和某一類型的應用緊密耦合,缺乏通用性。直到進入2006年,隨著PHP在國內(nèi)的大量應用和追捧,真正的國產(chǎn)PHP開發(fā)框架才陸續(xù)發(fā)布。
FCS(http://fcs.org.cn/)
FCS是從Java的Struts結構移植過來的中文PHP開發(fā)框架,使用面向對象的開發(fā)結構和MVC模式,并且模擬實現(xiàn)了Struts的標簽庫,借鑒了國外一些不錯的思想,尤其是Java框架方面,因此熟悉Java的開發(fā)人員相對比較容易上手,其模版引擎、緩存機制、認證機制和擴展性方面均表現(xiàn)不凡。
在借鑒國外優(yōu)秀思想的同時,F(xiàn)CS也更多地考慮了國內(nèi)的應用開發(fā)需要。PHP4兼容、完全支持UTF-8,以及PATHINFO支持等,更加有利于國內(nèi)的主機環(huán)境和開發(fā)需要。秉著易用和易擴展的原則,F(xiàn)CS采用容易理解的項目、模塊和操作機制加上內(nèi)置的一些自動化操作方法,讓應用開發(fā)變得更加簡單,其功能可以通過基類庫以及各種插件的形式靈活擴展,從而滿足日益增長的業(yè)務需求。正是因為具備良好的開發(fā)結構,使得FCS在開發(fā)大型應用的時候并不會顯得有很多障礙,基于構件的方式,以及配合框架的項目管理機制同樣可以讓你在處理大型應用的時候一展所長。
FCS力求精簡的代碼和全中文化的文檔、注釋,有利于國內(nèi)PHP開發(fā)人員學習和掌握,不過根據(jù)目前的情況來看,官方的文檔和社區(qū)支持目前還比較缺乏,而且對Ajax的支持還不夠全面,因此國內(nèi)的應用成熟度還不夠。
FleaPHP(http://www.fleaphp.org/)
開発の観點から見ると、FleaPHP は歴史のあるフレームワークです。過去 3 年間で、FleaPHP は、PFC1 から PFC3 シリーズと、flea1 実験的フレームワークをリリースした後、著者によって立ち上げられた最初の真に成熟した安定した開発フレームワークです。
他の多くのフレームワークとは異なり、FleaPHP は元々、迅速な開発と PHP 自體の利點の最大限の活用という 2 つの焦點を中心に設計されました。したがって、FleaPHP の最大の特徴は、モジュール性と拡張性が非常に高いことです。
FleaPHP フレームワークのコアは非常に小さいですが、柔軟な構成により、さまざまな種類のインフラストラクチャを組み合わせることができます。単純なスクリプト ページの場合、FleaPHP は MVC モードをロードする必要はなく、アプリケーションにビジネス ロジックとデータベース サービスを提供するだけで済みます。複雑なアプリケーションの場合、FleaPHP は、MVC モードの呼び出し、アクセス制御、データ検証からファイルのアップロード、畫像処理などに至るまで、さまざまなタスクを完了できます。
この優(yōu)れたカスタマイズ機能と拡張機能があるからこそ、FleaPHP は「単純なアプリケーションからエンタープライズ開発まで、さまざまなニーズに応える」という目標に真に近づくことができるのです。また、他の多くのフレームワークとは異なり、FleaPHP は実際の開発中に完全に改良されるフレームワークです。そのため、FleaPHPの開発により、さまざまな実用的なアプリケーションが次々と登場しています。 FleaPHP 公式 Web サイトでは、さまざまな実踐的なアプリケーションをご覧いただけます。最も単純な企業(yè)プロモーション Web サイトから、複雑なコミュニティ Web サイト、企業(yè)內(nèi)部システムなどまで、數(shù)多くあります。
FleaPHP は完全國産フレームワークとして、完全な中國語ドキュメントとコードコメントを備えており、拡張機能に関しても國內(nèi)開発者の実際のニーズに配慮しています。したがって、FleaPHP は海外のさまざまなフレームワークと比較して、國內(nèi)の開発者に受け入れられやすいです。
しかし、まさに中國にあるからこそ、FleaPHP は海外の同等製品よりも多くの困難に直面しています。貢獻者の不足、失禮な批判、懐疑的な目などにより、FleaPHP の開発チームのメンバーにはさらなる獻身的な努力が求められています。また、十分な貢獻者が不足しているため、FleaPHP フレームワークは現(xiàn)在、ドキュメントや拡張機能の點で他の成熟したフレームワークに遅れをとっています。
そして、他のすべての PHP 開発フレームワークと同様に、FleaPHP は開発者がアプリケーション ドメイン ロジックを分離するのに役立つ方法を見つけていません。ガイダンス文書はありますが、ジュニア開発者にとっては、すぐに使用できるドメイン ロジックの基礎が非常に実用的です。
反省と進歩
RoR がもたらした衝撃はまだ収まっていませんが、PHP 開発者はすでに RoR の足跡を盲目的に追従することが本當に PHP 開発に質(zhì)的な変化をもたらすことができるのかを考え始めています。
RoR 自體の設計思想に加えて、RoR が大きな成功を収めたもう 1 つの重要な理由は、RoR が Ruby という言語の強みを最大限に活用していることです。 Ruby 動的言語の利點を最大限に活用してください。 PHP では、RoR のデザインをそのままコピーすると、PHP 言語自體の制限に遭遇します。これらの制限を回避するには、開発者はいくつかの理解できないトリックを使用して問題を解決する必要があります。しかし、そうすると、フレームワークの構造があいまいになり、パフォーマンスが低下することがよくあります。
この考察では、Code Igniter や FleaPHP などのフレームワークがこの質(zhì)問に対する最良の答えです。 PHP 言語自體の利點を最大限に活用することによってのみ、PHP 開発は真に簡単かつ興味深いものになります。
現(xiàn)在、さまざまな PHP 開発フレームワークがそれぞれ獨自の特徴を持っていますが、ほぼすべてのフレームワークが開発効率の向上を目指しています。しかし、これらのフレームワークの中には、アプリケーションの保守性を向上させるという問題に注目しているものもありますが、ドメイン ロジックの分離という重要な問題に対する解決策を提案したものはありません。そして、これがまさにこれらのフレームワークが將來進むべき方向です。
単純な Web アプリケーションと複雑なエンタープライズ アプリケーションの場合、この 2 つの違いは、固定されたアーキテクチャではニーズを満たすことができないことを意味します。したがって、カスタム アーキテクチャ機能を提供できる FleaPHP のようなフレームワークを使用すると、開発者はフレームワークのさまざまな組み合わせを試して、単純なものから複雑なものまでさまざまなレベルのニーズを解決できます。
將來、PHP は Web 開発の分野でますます重要なプラットフォームになるでしょう。したがって、より良い開発フレームワークがより多く出現(xiàn)すると私たちは信じています。ただし、開発者としては、問題を解決するために必ずしも特定のフレームワークを使用する必要はありません。しかし、まさにこれらの新しいフレームワークのおかげで、PHP を使用して Web アプリケーションを開発することに対する私たちの理解と把握が何度も促進されてきました。
--------------------------------------
追記: この記事の元の著者は FleaPHP の開発者の 1 人で、國內(nèi) PHP