如今當提到 Web 開發時,您有許多選擇。這些方法中許多都涉及到預處理 — 即,利用特定的標記將代碼嵌入到 HTML 頁面中,這些標記告訴預處理器,它們包含代碼,並且應對它們作出處理。與 CGI 非常相似,這些代碼在服務器上運行,並返回一些內容,這些內容表現為發回給浏覽器的結果 HTML 頁面的部分外觀。開放源代碼腳本語言 PHP 和 Microsoft 的 ASP.NET 框架中的語言都屬於這種類型;JavaServer Pages (JSP) 和 Perl/Mason 也以這種方式運行。 在本文中,我將重點講述 PHP — Oracle 已選擇合並到其產品中的技術 — 和 ASP.NET。我將概述兩者的各種優勢和弱點,並著重討論那些將幫助您決定開發項目應選擇哪種技術的因素。有很多因素需要考慮,不同的項目可能訴諸於不同的技術。總之,您將看到在價格、速度和效率、安全性、跨平台支持等方面的逐項比較,以及開放源代碼解決方案的優勢。 什麼是 ASP.NET? ASP 最新的版本 ASP.NET 並不完全與 ASP 早期的版本後向兼容,因為該軟件進行了完全重寫。早期的 ASP 技術實際上與 PHP 的共同之處比與 ASP.NET 的共同之處多得多,ASP.NET 是用於構建 Web 應用程序的一個完整的框架。這個模型的主要特性之一是選擇編程語言的靈活性。ASP.NET 可以使用腳本語言(如 VBScript、JScript、Perlscript 和 Python)以及編譯語言(如 VB、C#、C、Cobol、Smalltalk 和 Lisp)。新框架使用通用語言運行環境 (CLR);先將您語言的源代碼編譯成 Microsoft 中間語言代碼,然後 CLR 執行這些代碼。 這個框架還提供真正的面向對象編程 (OOP),並支持真正的繼承、多態和封裝。.NET 類庫根據特定的任務(例如,使用 XML 或圖像處理)組織成可繼承的類。 除了編程語言和方法之外,數據庫訪問也是要著重關心的一個因素。當您用 ASP.NET 編程時,可以用 ODBC 來集成數據庫;ODBC 提供了一組一致的調用函數來訪問您的目標數據庫。 優勢和弱點 ASP.NET 的優勢很明顯在於它簡潔的設計和實施。這是面向對象的編程人員的夢想:語言靈活,並支持復雜的面向對象特性。在這種意義下,它真正能夠與編程人員現有的技能進行互操作。 ASP.NET 的另一個優勢是其開發環境。例如,開發人員可以使用 WebMatrix(一個社區支持的工具)、Visual Studio .NET 或各種 Borland 工具(如 Delphi 和 C++ Builder)。例如,Visual Studio 允許設置斷點、跟蹤代碼段和查看調用堆棧。總而言之,它是一個復雜的調試環境。許多其他第三方的 ASP.NET IDE 解決方案也將必然出現。 但您得到了強健性,就將以損失效率為代價。ASP.NET 在內存使用和執行時間方面耗費非常大,這大部分歸因於較長的代碼路徑。對基於 Web 的應用程序,這些局限可能是一個嚴重的問題,因為在 Web 上,您的應用程序可能擴展為每秒成千上萬的用戶。內存使用率還可能成為 Web 服務器上的一個問題。 什麼是 PHP? PHP 是基於預處理 HTML 頁面模型的一種腳本語言。當 Web 服務器中的 PHP 預處理器發現像下面這樣的 PHP 語言標記時,將調用 PHP 引擎來執行該代碼: 任何使用過命令式編程語言的編程人員都會對 PHP 非常熟悉;您會發現它與 Perl、C 和 Java 在語法上的相似處。嚴格來講,Java 是一種命令式編程語言,但它也利用了面向對象的結構和概念。PHP 在適宜的時候借鑒了這種結構,但它不是一種純粹的 OOP 語言。 在上面對 ASP.NET 的討論中,我提到了 ODBC 驅動程序,以及在考慮數據庫抽象的情況下如何構建應用程序。在 PHP 中,您也可以使用 ODBC 與數據庫對話,因此您已經有了一系列支持的數據庫可供選擇。也有 MySQL、Oracle 和 Postgres 的原生驅動程序。此外,如果要使用 Oracle,則有一個特殊的 OCI8 庫將提供對 Oracle 更多訪問功能,從而允許您使用諸如 LOB、BLOB、CLOB 和 BFILE 之類的特性。 這時您可能會問“為什麼與數據庫相關的資料庫被稱為 PHP 的特性?”數據庫抽象或獨立性是您在設法構建使用多種數據庫或需要在數據庫間移植(例如,從開發到投產時的移植)的應用程序時所要考慮的一個因素。而這些確實是應該關心和考慮的。 但正如 Tom Kyte 在他的新書 — Effective Oracle by Design (Oracle 出版社) — 中指出的那樣,數據庫相關性將成為您真正的目標,因為這將使您在該技術中的投資最大化。如果您對 Oracle 進行一般的訪問 — 無論通過 ODBC 或 Perl 的 DBI 庫,那麼您將無法使用其他數據庫所不具有的特性。此外,優化查詢在各個數據庫中各不相同。 Zend Technologies 是一家商業軟件公司,它對 PHP 作出了重大貢獻。它創建了一個稱為 Zend Studio 的商業開發環境,這個環境包含了一個復雜的調試器、一個監測器和其他特性。該公司還構建了免費的 Zend Optimizer,它與 Zend Encoder 結合使用來編譯 PHP 代碼,以提升性能。還有其他商業產品,如 Zend Performance Suite,它可以緩存預編譯的 PHP 頁面,從而進一步顯著提升總體性能。 優勢和弱點 到測試版 4 為止,PHP 5 仍然有一些缺點,包括缺少異常和基於事件的錯誤處理例程 — 它們能夠中斷正常的程序流,並將代碼跳轉到一個特殊的錯誤處理部分。Java 也提供了用於錯誤處理的異常,而 C++ 通過 try、catch 和 throw 語法提供異常處理。當然,您仍然可以在 PHP 中管理錯誤,但其結構不是標准化的,因而使得編程人員必須使用自己的工具來決定執行錯誤處理的方式,這將導致更低的一致性並往往導致推倒重來。 另一個弱點是 PHP 的函數名是不區分大小寫的。雖然這不是一個嚴重的缺點,但有些程序員可能會覺得這一特性很討厭。 不過,我的確對 PHP 的對象模型心存疑慮。PHP 不是專門設計為一種面向對象的語言。這些特性中的一部分是後來添加的 — 盡管注意了保持與 PHP 3 的後向兼容性,因此兩種模型的特性都留有一些。實際上,在 PHP 5 中這些弱點中的許多都得到了解決。請留心關注。 PHP 在一些領域中缺少什麼,它就會在擅長的領域中迅速地彌補什麼。價格合理,因此您不需要擔心許可問題。它也是開放源代碼的,因此整個社區將密切關注開發過程:發現錯誤並將其修復。如果有一個特性您不喜歡,那麼您可以修改代碼。此外,PHP 可與 Apache 自然結合:它可以作為一個模塊編譯,或直接編譯成 Apache 二進制文件。 但在 Apache 上運行意味著,利用 PHP,您能夠利用您已經在任意服務器投資,這是因為 Apache 能夠運行在 Windows、Linux、Solaris 和各種其他 Unix 平台上。此外,使用擁有 Apache 的跟蹤記錄的 web 服務器意味著安全性能夠保持在最高的優先級上。最後,PHP 擁有更小的代碼路徑,這意味著更少的分析和執行 PHP 頁面服務器端代碼,這將帶來更高效的內存和使用率以及更快的運行。 在 PHP 5 中新增了哪些特性? PHP 5 的第 4 個測試版在 2003 年 12 月底推出,更改日志清楚地顯示已發現許多錯誤並已將其消除。雖然它仍在進行測試,但它的所有新特性和進步都確實值得關注。 PHP 5 的主要新成就在於它的異常處理和一個新對象,這個新對象引入的特性賦予了 PHP 真正的 OOP。異常處理無疑是 PHP 4 中最顯著的缺憾之一,而 PHP 5 對異常處理的引入無疑是一個成熟的標志。異常處理意味著您在您的軟件中擁有了根據語言定義的和標准化的錯誤處理方法。只需使用 try、catch 和 throw 方法,您的 PHP 代碼就變得更加強健和簡潔。 openFile (/home/shull/file.txt); } catch (Exception $myException) { echo $myException->getMessage (); # rest of exception handling code here } # rest of blue methods here ?> 新的對象模型為用 PHP 編寫的程序帶來許多積極的影響。在 PHP 4 中,當把將一個對象傳遞給函數或方法時,是通過值來傳遞的 — 除非您另行顯式告知 PHP。這個過程意味著必須復制對象的一個副本(內存中的所有數據結構)。這個步驟使用內存,使得訪問變慢和擁塞。而在 PHP 5 中,通常通過引用傳遞對象。 PHP 5 中新的面向對象的特性(包括構造器和析構器)值得關注。與 C++ 和 Java 相同,它們提供了一種標准方法,即通過一個構造器方法來創建對象、分配內存和執行任何必要的設置,並通過一個析構器方法來執行清理。 PHP 5 還引入了對類中方法和變量的更精細控制。在 PHP 4,一切都是公有的:您可以從類外或在繼承類中訪問您類中的變量。在 PHP 5 中,您仍然可以使變量或方法為公有,但您也可以使它們為私有,以使得只能在類本身中使用它們。還可以將它們保護起來,也就是說,可以在類內或在子類中查看方法和變量。 此外,PHP 5 引進了類型提示或更好的類型檢查。當您將一個對象傳遞給一個例程時,PHP 能夠檢查它是否是正確的類型,並在檢查失敗時產生類型不匹配錯誤。 由於還有其他特性(如靜態方法和變量以及抽象類),因此請務必查看文檔,以獲取詳細信息。 (未完待續)