一些雜談 首先是本文寫作的初衷。我拿到關於Zend Engine 2.0的設計藍圖文檔已經有一段時間了(現在大家也可以去參考資料中的地址下載回來看看),看完之後就有了寫一篇評論的沖動--因為根據文檔的描述下一代的PHP將是一種更符合現有面向對象開發習慣的語言,至少是被更多的賦予了面向對象特性。但是隨之帶來的問題就是對於PHP這樣一個以Web快速開發為初始目標的語言是否值得將自己修飾得面面俱到?這個問題看來是需要一些評論文章來討論的,我也很願意提出自己的觀點。但是後來一些繁忙的事情就將這個沖動一點點又打回了肚裡,直到最近一段時間又想起,於是再拜讀幾遍設計藍圖文檔,遂有此文。(剛拿到這份英文文檔的時候我還有將這份設計藍圖文檔翻譯到中文的打算,但是考慮到一是並非最終藍圖,二是大家都應該培養直接閱讀原文的習慣,三是翻譯總是不可避免會帶來一些晦澀的地方,於是暫時作罷。不過寫成此文的時候,還是決定"冒險"翻譯一次,不能准確達意之處還請各位不吝指正。) 其次是對本文討論焦點的解釋--在這篇評論中我將主要針對將來的PHP中得以大大加強的面向對象特性進行評述。如果你是PHP的開發者,那麼我猜想你應該了解一些PHP語言中的面向對象特性;但是由於一般PHP用於"極端快速開發環境"(這是我自己生造出的一個詞語,表示進行一些以客戶為導向的網站開發的情況,特點就是工期非常短且客戶要求不甚明確),所以真正大量使用其對象特性的開發者以及開發項目並不是很多;另外,現有PHP對象模型相對C++和Java的弱勢,也限制了這方面特性的使用。不過在PHP的將來版本中,修改重點就在於語言中的面向對象模型,完善現有版本中許多不良的特性並加入其他特性。因此討論PHP的未來面貌就集中在討論PHP的面向對象特性方面。 好了,讓我們步入正題,看看Zend Engine 2.0的新特性。 歸納Zend Engine 2.0設計藍圖(草稿) 從設計藍圖(草稿)中可以非常清楚的看出下一代Zend Engine是以新的面向對象模型為基礎的。如果你曾經使用過現有PHP 4的面向對象特性,那麼也許會在找到一點點Java或者C++的感覺的同時覺得有些別扭--不但是在面向對象語法的匮乏上,而且有時會得到意想不到的運行結果--這一切都是因為在現有的支持PHP 4的Zend Engine 1.0中不那麼優雅的面向對象模型造成的。 簡單說來,下一代的Zend Engine將向Java靠攏,大量借鑒其面向對象模式。從改進特性的類型來看,應該可以分為三類:第一類是對現有面向對象模型的改進和加強,其中包括對構建器和析構器的定義,增加的私有成員變量、靜態成員變量、多重繼承、過載等面向對象特性;第二類是對於控制流程的修改和增刪,比如增加了形如try/catch/throw違例處理機制;第三類是關於函數的修改和增刪,比如對於字符串偏移量的增加函數。(對於每一類改進的詳細情況,可以查閱參考資料中所列文檔。)由此可以看出,通過第一類和第二類的改進,PHP正在逐步將自己改良成一種具有面向對象特征的語言。 不過問題恰恰就產生於此: 從積極的方面來說,如今的編程世界中更加歡迎具有面向對象特征的語言(即使語言本身並不構建於面向對象基礎之上,也可以通過增加定義的對象等手段使得該語言不至於落在潮流之後)--從這一意義上說,Zend Engine 2.0使得PHP對面向對象的支持將從現在的試探性接觸轉變為將來的全面擁護,看來更加符合編程語言發展的潮流;另外,在構建企業級應用(這也是PHP現在經常被人指責之處)之時,采用面向對象的方法建模和實現已經是事實上的標准,而PHP的這一改進也許會迎合這一需要,解決語言自身在這方面的薄弱之處。 從消極的方面來說,為開發者奉獻一個更加類似Java的新版PHP似乎沒有什麼意義。PHP被廣泛應用的原因,除了源碼公開和跨平台等之外,適應互聯網站構建的簡單、快速的web編程特點恐怕也是重要的一點。極短的學習時間、友好的語言風格(特別是如果你對C比較熟悉)和大量擴充類庫函數,足以證明其強大;但是如果將這樣的語言的下一版本改造成類似面向對象的語言,不但會使原有的大量開發者在短時間內無所適從,而且非常不利於吸引新的開發者加入--既然有Java這樣的語言,何必去學習PHP呢? 以上是我本人的一些"客觀"分析--所謂"客觀",就是在寫積極方面的時候,將自己偽裝成一個Zend Engine 2.0的忠實擁護者;而在寫消極方面的時候,則正相反(希望你在讀完我的分析之後也可以覺得還算客觀)。不過"客觀"其實也只是為我的"主觀"論調起到鋪墊作用-- 問題的關鍵--我們期望將來的PHP會是什麼樣子? 其實問題的關鍵也許在於我們期望的PHP到底會向哪一個方向發展,或者說PHP會致力於哪一個領域。 PHP之所以受到如此大的歡迎,尤其是在幾乎沒有任何商業支持(Zend公司現在對PHP提供支持,但是其實力和Microsoft以及Sun比較起來實在是微不足道的。)的情況下成為能夠與ASP以及JSP抗衡的編程語言,是因為它完全面向現實的快速web編程環境。這一情況在許多的PHP教程中可以清楚的看出--實現一些常用的web功能,采用PHP往往意味著更少的代碼量和復雜程度;同時對於某一特定領域的編程,PHP還有擴展模塊的函數可供使用(雖然沒有商業支持,但是PHP擁有開源軟件眾多的擁護者支持,他們不但為PHP的產生和發展作出貢獻,並且提供了各種擴展模塊函數。),這樣對於開發者而言,更多的立即可用的並且免費的函數庫意味著更少的工作量,所需要做的僅僅是查閱函數手冊並妥善使用它們。而PHP的競爭對手們,則顯得有些"學究"-- 靈活不足而嚴謹有余,也許大型商業公司的產物在使用的方便程度上確實不及黑客們的得意之作吧。 不過為了適應現實的快速web編程環境,PHP在注重方便易用的時候放棄了一些東西:比如開發者的自有模塊的編寫和封裝(非源碼級別),以及面向對象特性(現有版本只是不完全的支持一部分特征)等等--而這些PHP的缺少的卻是它的競爭對手們所擁有的(比如ASP可以和COM組件溝通,JSP則可以方便的使用Java Bean;JSP脫胎於Java這一完全面向對象的語言等等),因此PHP通常被排除在構建企業級應用的候選名單之外。 問題的核心已經比較清晰了--現在的PHP發展遇到了一個叉路口:是繼續將自己的快速web編程語言的特點發揮得淋漓盡致,還是將自己完善、修飾成一個適應嚴肅商業環境需求的編程語言? 究竟如何--不抱太大希望 從Zend Engine 2.0的設計藍圖中看來,PHP的創造維護者們似乎選擇了後一種策略--幾乎重寫解釋引擎的面向對象模型,加強語言的面向對象特性。我個人認為這樣的選擇是有一定的理由的: PHP在適應快速web編程方面似乎已經做得很好,在現有語言架構基礎上對於此方面已經不可能有太大改變(能夠做的僅僅是修改、增刪一些核心函數以及按部就班的增加更多的擴展函數庫),而PHP必須要發展…… J 大部分人都意識到了PHP的局限性,它的創造維護者們更加清楚--假如PHP能夠在企業級應用中獲得重視,那將是一次更大的勝利(對於開源軟件的擁護者來說也許意義更深遠)。提升其在該領域競爭力的捷徑也許就是Zend Engine 2.0設計藍圖中呈現的內容--為這個面向過程的相對傳統的語言添加全新的面向對象模型,使得開發者能夠容易的采用面向對象編程方法。 不過非常遺憾的是,試圖進入企業級計算領域的PHP欠缺的還太多--沒有足夠的商業支持,大量的擴展模塊處於試驗階段而其中的一些需要被用來在企業級應用中擔當重任,對於系統架構的規劃和支持不力等等,還有也許是最重要的是商業界的觀念能否接受開源而不是商業支持的編程語言構建整個商業系統(不過Linux的應用似乎正在展示美好的前景,但僅僅是前景而已)。即使是樂觀的PHP支持者(比如我自己),對於在企業級計算中使用PHP,還是持懷疑態度--即使是Zend Engine 2.0如設計藍圖所述的被推出之後。 因此,我對采用Zend Engine 2.0的新版PHP並不抱有太大的希望: 它的適用處還是在於快速web編程環境,比如互聯網站等;選擇PHP作為構建關鍵商業系統的主要支持語言,需要非常非常慎重。 雖然Zend Engine 2.0著重加強了面向對象特性(也許PHP的創造維護者們也會大力提倡使用它們),但是對於現有的大部分PHP開發者而言,用現在的面向過程的風格書寫PHP程序並不會受到任何影響(Zend Engine 2.0也非常周到的考慮到了向下兼容的問題)--也就是說,表面上看PHP會由於被賦予了面向對象的特征而更加強大,實際上在大多數開發者手中采用Zend Engine 2.0和1.0版本(支持現在的PHP 4的解釋引擎)的PHP並沒有什麼區別。 當然還是有一些值得期待的地方: 快速web編程環境同樣需要良好的建模,面向對象的設計和實現要比面向過程的或者說是面向頁面間的方法好得多。部分PHP開發者(包括PHP的創造維護者們)已經在大力提倡使用語言本身的面向對象特性(PEAR就是很好的例子),Zend Engine 2.0將會為他們帶來福音--更好的面向對象模型,可以幾乎不受限制的采用面向對象設計和實現(而現在的PHP由於面向對象支持的極不完全,根本作不到這一點);同時在對象的使用性能上能夠得到一定提升。 違例處理機制的引入對於PHP項目會帶來一定積極的影響,可以有效的提高代碼效率,並鼓勵妥善的處理錯誤。 由於Zend Engine 2.0面向對象模型的改進,使得PHP調用外部組件(比如COM和Java Bean)更加方便以及合理,在效率上也將得到提高。這一改進也許會增加PHP作為異種系統(比如采用Java開發的系統)前端的可能性(國內的minij2ee項目就是這方面的一個典型)。 對PHP開發者的一些建議 首先你不需要對未來的PHP有任何的擔憂--你所擁有的開發技能在新的版本中仍然適用而且運作得很好(這讓我想起Microsoft .net中Visual Basic的尴尬地位--PHP不會這樣)。即使你對面向對象一無所知,也可以按照傳統的方式(也是大部分市面上講授PHP開發的書籍中介紹的技術)進行開發。 其次是如果你對PHP的面向對象特性產生了興趣,或者已經有了積極的探索,那麼未來的PHP會更加適合你的口味--你可以完全采用面向對象方法進行項目的分析,然