作者:Robert Lair and Jason Lefebvr Intensity Software, Inc.
翻譯:EasyChen Exlcsoft.com
概觀
開發界正在進行的一個爭論是PHP和ASP中哪一個平台更適合網站開發。這場爭論由於微軟的ASP.net帶來的巨大變化而進入了新時期。和ASP 3.0比起來,ASP.NET采用了全新的設計,有著很多新的特性和優點。究竟ASP.NET 會給PHP和ASP之間的爭論帶來什麼樣的影響呢?本文將為你提供這個問題的答案的相關信息。
架構比較
PHP
PHP4.0以Zend Technologies的開源引擎Zend Engine為核心。當用戶浏覽器向一個由PHP實現的網絡服務器發出請求時,這個請求被傳給Zend Engine,它將對php腳本進行編譯。如果編譯順利, 編譯後的代碼將被傳遞給生成發送給客戶端的最終HTML代碼的Zend Engine Executor。從開發者角度看,PHP 4.0的框架既有優點也有缺點。
因為PHP是開源的,所以它得到了很多不同平台和web服務器的支持。雖然比以前的PHP引擎大,Zend Engine仍然是輕便和強壯的。作為擴展,PHP也支持面向對象,允許用戶建立自己的類和對象。但是,由於某些原因,PHP不是真正的面向對象開發環境。最好的一個例子是類成員函數和屬性的作用域。在PHP中,一個類中的所有變量可以從外部讀寫,這使得類的實現無法隱藏。
另外,PHP不是強類型語言(就是說,如果你比較字符4和整數4,結果是相同的),這在架構大型程式時帶來問題,也使得程式的調試變得困難。使得調試更為困難的是,你甚至不需要聲明變量,這和關掉explicit 選項的ASP很像。如果PHP在腳本中遇到新的變量,它只會靜靜的創建它。
雖然被認為是寬松的PHP框架的靈活性,不過大概每個開發者在一些情況下都會花數小時去解決由這個特性導致的BUG。對象在PHP中是語言級變量。它們在很大程度上被當作簡單變量類型處理。(就像整型和字符型變量一樣)當進行像變量賦值和將對象作為參數傳遞給函數的操作時,整個對象被復制。這將導致低效。另外,不可預知的運行時行為會經常發生。
PHP缺少一些其它絕大多少現代開發框架擁有的關鍵元素。其中最重要的一個是結構化異常捕捉。雖然可以給進程錯誤注冊一個error handler,對於語言本身來說並不方便。由於"try . . . catch"錯誤捕捉的缺席,很多PHP開發者完全忘記了錯誤捕捉或者在很窄的范圍中使用。
ASP.NET
ASP.NET的核心是Microsoft .NET框架。這個框架提供了common language runtime (CLR)和類庫,ASP.NET就建立在這之上。
當ASP.NET資源第一次被請求時,高層語言代碼(像Microsoft Visual Basic® .NET 或者C#)被編譯成Microsoft Intermediate Language (MSIL) code。這個代碼將由CLR運行以產生用於網頁服務的機器代碼。
ASP.NET強制開發者使用真正的面向對象方式進行程式設計。所有的對象都是真實的OO對象,支持如繼承、多態(方法的重載)和封裝的特性。
另外,ASP.NET中的所有語言都是強類型的。舉個例子,要比較整數4和字符4,你需要先將變量轉換為整型,反之亦然。
ASP.NET采用事件驅動編程模型,這意味著,代碼片斷由在程式運行時可能發生的事件聯系起來。
舉例而言,在ASP.NET 頁面中的Page_Load()事件放置當浏覽器讀取Web form時將要運行的代碼。有很多附加事件和ASP.NET Page object相聯系,開發者可以在它們生命周期中的任何時間執行代碼。同樣的,一個Web form上的各個控件都有一系列可在觸發時可執行代碼的事件。比如,通過在一個Web form添加一個button,你可以添加一個方法(被叫做一個delegate)來在用戶點擊button時執行。幾乎所有控件都有一個或者多個事件。
你可以訪問Microsoft在QuickStart指南中提供的關於Class Browser的例子,可以在http://samples.gotdotnet.com/quickstart/aspplus/samples/classbrowser/vb/classbrowser.aspx在線運行它。
Easy注:這篇文章譯自MSDN,是 白刃之戰:PHP vs. ASP.NET 的一部分。文章的其他部分Easy將視事件和精力選譯部分。