一些雜談
首先是本文寫作的初衷。我拿到關於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編程語言的特點發揮得淋漓盡致,還是將自己完善、修飾成一個適應嚴肅商業環境需求的編程語言? 1