簡介 本文討論了從 PHP (PHP:Hypertext Preprocessor 4) 到 ASP.NET 的遷移,并對 PHP 和 Microsoft® Visual Basic® .NET 的基本語法以及基本功能和體系結構進行了對比。 盡管使用 PHP 和 ASP.NET 都可以構建復雜的 Web 應用程序(例如電子商務站點、Intranet 和企業門戶),但兩者之間卻存在若干重要差別。與 PHP 不同,ASP.NET 并不是一種語言或分析器,而是 Microsoft .NET Framework 中的一組用于構建 Web 應用程序和 XML Web Service 的技術。同 PHP 一樣,Microsoft ASP.NET 頁面在服務器上執行并生成標記(例如 HTML、WML 或 XML),標記將發送給桌面應用程序或移動應用程序。但不同的是,ASP.NET 為開發 Web 頁面提供了強大的、面向對象的以及由事件驅動的編程模型,同時仍保留了 PHP 開發人員所習慣的那種簡單性。 ASP.NET 應用程序是基于強大的面向對象編程 (OOP) 模式,而不是基于腳本模式。這樣便可以獲得更為嚴謹的 OOP 功能,例如繼承、封裝和反射。雖然大多數基本的簡單操作可以輕松地從 PHP 轉換到 ASP.NET,但要轉換更為復雜的應用程序卻并不這么簡單,這需要仔細的規劃和考慮,并采用更符合 OOP 的方法。 本文假設讀者具有 PHP 方面的經驗,并且對編程和軟件開發有著基本了解。本文首先從代碼方面對兩者的基礎體系結構的差別進行簡單比較,并簡要介紹一下 OOP 開發模型,然后比較兩者的功能,最后將使用 PHP 和 ASP.NET 開發 Web 應用程序時的語法和常見任務作以對比。 注意:如果您希望跳過有關遷移的詳細信息,而只想嘗試 ASP.NET 的使用,則可以直接跳到建議的后續操作部分。 體系結構對比 閱讀完本文后,通過比較語法和語言,您將了解 PHP 和 ASP.NET 是很相似的,它們具有類似的功能和語法。但是,從更基本的體系結構層面來講,PHP 與 ASP.NET 卻有著很大差別。PHP 基于獨立于平臺的處理器/引擎,該處理器/引擎用于分析 PHP 腳本、提供數據庫連接、符合 Internet 協議以及提供大多數 Web 應用程序平臺所常見的眾多其他任務。 ASP.NET 是基于一系列技術(如 CLR)構建的框架,提供了大量以很好的方式組織的類庫,這些類庫可滿足要在 Web 應用程序中使用的大多數功能的需要。您還可以輕松地創建各種組件,對該框架進行擴展。 雖然 PHP 也提供了類似的功能(例如 PEAR 庫),但 PHP 和 ASP.NET 并非完全相同,因為 ASP.NET 框架是完全基于 OOP 模式和 OOP 概念構建的,而 PHP 則不然。這種差別在 PHP 和 ASP.NET 中類和對象的訪問方式方面表現得猶為明顯。 PHP 和 ASP.NET 中的面向對象編程雖然 PHP 和 ASP.NET 都為應用程序開發提供了 OOP 模式,但它們對各種 OOP 概念(例如封裝和多態)的支持卻存在差別。例如,PHP 僅支持部分封裝(例如,支持在類中聲明方法和字段)和部分多態(沒有重載和抽象)。此外,由于 PHP 的類中不存在私有 (private)、公有 (public) 或受保護 (protected ) 函數等概念以及重載,因此 PHP 也不支持這些概念及其訪問。OOP 純粹主義者可能會說,ASP.NET 以及各種語言也沒有完全支持 OOP 模式中的所有概念,對于使用 OOP 的大多數語言(如 C++ 和 Java)來說,情況確實如此。 這既有積極的一面,也有消極的一面。消極的一面是:對于某些 Web 開發人員來說,學習 ASP.NET 要比學習 PHP 困難些,因為 PHP 提供的是開發人員創建 Web 站點時所慣用的腳本模式。但是,使用過 OOP 語言和/或 V 的開發人員會發現 ASP.NET 比較親切且易于學習。 ASP.NET 支持 OOP 概念的積極的一面是,ASP.NET 應用程序的大多數部分都會得到很好的設計,并且能夠對內容、邏輯和數據進行清楚的分隔,因而從應用程序生命周期的長遠角度看,這通常更容易為其提供支持。此外,由于 ASP.NET 本身支持企業技術,例如消息隊列、事務(請參閱 .NET Framework 的 System.EnterpriseServices 類)SNMP 和 Web 服務,因而可以很容易地開發具有高度可縮放性的強大的應用程序。 要大致了解面向對象編程(從 Visual Basic 的角度)的主要概念,請參閱 Object-Oriented Programming in Visual Basic。 編譯PHP請求 PHP 頁面時,HTML 和內聯 PHP 腳本將編譯為 Zend Opcode(Zend 操作代碼)。Opcode 是低級的二進制指令,是提供 PHP 頁面時實際使用的代碼。編譯后,Zend 引擎將運行 Opcode(與 Java 的運行時引擎運行字節碼類似),然后生成 HTML 并提供給客戶端。 有許多商業產品可用來通過優化這些 Opcode 來加快 PHP 頁面的執行速度。其他提高 PHP 腳本性能的方法還包括對 Opcode 和生成的 HTML 進行緩存。 ASP.NET當向 IIS(Internet 信息服務)或其他 Web 服務器請求 .aspx 頁面(或 ASP.NET 支持的任何其他擴展名)時,該請求將被傳遞到 ASP.NET 進行處理。如果是第一次請求該頁面,ASP.NET 會將其編譯為 MSIL(Microsoft 中間語言)。然后,CLR(公共語言運行庫)會將此 MSIL 代碼轉換為機器碼。最后使用這個編譯后的代碼運行該請求。后續的請求將使用相同的機器碼運行(假設該頁面未被修改)。 需要注意的是,因為由 CLR 生成的二進制代碼已經最大限度地進行了優化,所以不必再使用其他產品來幫助提高性能。 此外還要注意,ASP.NET 中的所有內容在運行前都被編譯為機器碼。甚至 HTML 文本也被轉換為字符串常值控件,并按照適當的順序插入到控件樹中。 功能對比 表 1 對 PHP 和 ASP.NET 中的某些主要功能進行了比較。 表 1:PHP 和 ASP.NET 的功能對比
語法和常見任務對比 以下各部分比較了 PHP 和 .NET 的語法,并介紹了如何完成某些非常常見的編程任務。 注釋PHP 允許您使用 C、C++ 和 Unix shell 樣式語法在代碼中插入注釋,注釋指示器中的任何內容都不會被執行。 一般來講,要在 ASP.NET 中注釋出 Visual Basic .Net 代碼,需要使用 表 2 顯示了這兩種環境中的注釋。 表 2:服務器端注釋
變量雖然 PHP 和 Visual Basic .NET 具有類似的語言構造,但語法卻截然不同。由于 Visual Basic .NET 是基于 OOP 模型構建的,因而變量的聲明要比 PHP 中變量的聲明更嚴謹(在 PHP 中聲明變量時只需在變量名之前添加一個 在 Visual Basic .NET 中聲明變量時,要指定它的變量名和特性。變量的聲明語句是 雖然這種方法最初看上去要比在 PHP 中指定變量復雜,但實際上它會給開發人員帶來方便。ASP.NET 致力于幫助開發人員創建可靠的應用程序,而指定數據類型可以使諸如變量清理、調試、異常和錯誤處理以及代碼維護等任務變得更加簡單。 表 3 顯示了在兩種環境中聲明變量的示例。 表 3:變量聲明
聲明數據類型聲明語句中的
您可以在一個語句中聲明多個相同類型的變量而不必重復數據類型。下面的語句將變量 Dim numStudents, numGTA , numProfessors AS Integer ' 三個變量都是 Integer 類型。 有關數據類型的詳細信息,請參閱 Data Types。有關面向對象編程的詳細信息,請參閱 Object-Oriented Programming in Visual Basic。 聲明生存期變量的生存期是指變量可供使用的時間段。使用 生存期這個概念很有用,因為它使開發人員在創建應用程序時不必考慮在大型應用程序中出現的許多問題,例如有效的內存管理。通過為變量選擇正確的生存期,可以使 .NET 對未在使用的變量執行清理操作。 有關生存期的詳細信息,請參閱 Lifetime。 聲明范圍局部變量是在過程(過程與函數類似)中聲明的變量。非局部變量是在過程之外但在類或結構中聲明的變量。 在類或結構中,非局部變量的類別取決于該變量是否被共享。使用 變量的范圍是指可以引用它而不必限定其名稱的所有代碼集。變量的范圍取決于聲明變量的位置。位于給定區域中的代碼可以使用在該區域中定義的變量而不必限定其名稱。聲明范圍時,將遵循以下規則:
但是,如果您在塊中聲明一個局部變量,則它的范圍將只限于該塊。局部變量在定義它的控制塊中處于活動狀態。控制塊可以是過程、if 語句以及循環語句等。 有關范圍的詳細信息,請參閱 Scope。 聲明可訪問性.NET 支持變量的可訪問性,從而使開發人員可以控制哪些代碼能夠訪問特定的變量。例如,如果要為某個公式設置一些常數,并且要確保這些常數不會被它們所在類以外的其他代碼更改,則可以使用 private 按如下所示聲明該變量: Private myConstant As Integer 變量的可訪問性由聲明語句中使用的一個或多個關鍵字 您可以使用上述任意關鍵字來聲明模塊、結構、類或實例變量。過程中只允許使用 輸出PHP 中輸出數據的典型方式是使用 表 4:基本輸出
然而,這些用于向瀏覽器發送輸出的方法主要是為了保持與傳統 ASP 的向后兼容性。ASP.NET 提供了新的基于控件且面向事件的模型,您只需在服務器控件上設置屬性即可將數據輸出到瀏覽器中。通過這種技術可以將布局與代碼清楚地分開,從而簡化了維護工作,并且在復雜情況下所需的代碼要比 PHP 少得多。 <script language="VB" runat="server">Sub Page_Load(sender As Object, e As EventArgs) TheDate.Text = DateTime.Now End Sub</script>The current date is: <asp:Label id="TheDate" runat="server"/> 此示例聲明了一個名為 條件處理IF/ELSEPHP 具有若干條件處理表達式,例如 表 5:基本條件邏輯
切換切換語句是大多數編程語言的常見語言構造,用于通過多個值對單個表達式進行測試。它常用于替換包含多個 圖 6 對 PHP 的 switch 語句與 Visual Basic 的 表 6:
循環另一個非常常見的控制構造是循環。PHP 和 .NET 都支持若干不同的常見循環類型。 表 7:
在 Visual Basic 中,這種循環類型被稱為 條件循環只要某個條件計算為 表 8:條件循環
在 Visual Basic 中,這種循環類型稱為 下面給出了一個 PHP 中這種情況的示例: $i = 0;do { print $i;} while ($i>0); 此循環只運行一次,因為在第一次循環后檢查真假表達式時,表達式計算為 在 Visual Basic .NET 中,您可以執行同樣的操作: Dim counter i As Integer = 0Do response.write (i)counterLoop While counter i > 0 但是,Visual Basic .NET 支持內置的循環功能,這是 PHP 所不支持的。該功能將對條件進行計算,直到條件為真時為止。 Foreach 循環PHP 4(而非 PHP 3)包含一個 表 9:
數組PHP 中的數組的功能與 Visual Basic .NET 中的數組的功能截然不同。PHP 中的數組實際上是關聯數組,但是可以像索引或關聯數組那樣使用。而 Visual Basic .NET 中的數組是索引數組。Visual Basic .NET 不支持關聯數組(但您可以自己創建它們,請參閱下面的“集合”)。其他 ASP.NET 語言支持這些類型的數組,但 Visual Basic .NET 并不支持,這可能給 PHP 開發人員提出了一個難題,因為他們并不習慣使用這種更常見的索引數組,并且可能會希望在 Visual Basic .NET 中創建關聯數組模型。表 10 顯示了 PHP 和 Visual Basic .NET 中的簡單數組示例。 表 10:創建數組的示例
與其他變量一樣,Visual Basic .NET 數組中的變量也是使用 創建 Visual Basic .NET 數組時,還必須將其聲明為保存特定類型的數據。如果指定的類型是 Visual Basic .NET 數組可以是嵌套的數組,也可以是多維數組。Visual Basic .NET 中有許多與 PHP 相對應的用于處理數組的函數,但有一個例外。由于 Visual Basic .NET 不支持關聯數組,因而不存在用于根據數組的“主鍵”來訪問、索引或執行任何操作的函數。Visual Basic .NET 中不存在這樣的“主鍵”。 雖然本文多次提到 Visual Basic .NET 不支持關聯數組,但是可以創建集合來代替數組。集合與關聯數組有些相似,可以使用集合來解決某些類似的問題。 在某些情況下,將項目存儲在集合中要比存儲在數組中更有效。 如果要處理一組小型的動態項目,則可以使用集合。要創建集合,只需如下面的示例代碼所示聲明并實例化一個 Dim myCollection As New Collection() 然后,您可以使用 Dim w, x, y, z As Stringw = "key1"x = "key2"y = "key3"z = "key4"myCollection.Add(w, "1")myCollection.Add(x, "2")myCollection.Add(y, "3")myCollection.Add(z, "4") 雖然這看起來類似于在 PHP 中創建關聯數組,但集合是一種截然不同的事物,因為它本身就是一個對象。對于轉到 ASP 的 PHP 開發人員,我們建議在嘗試在 Visual Basic .NET 中創建關聯數組模型之前先了解一下 Microsoft 的 Visual Basic .NET Language Specification。 管理狀態任何 Web 應用程序中都很常見的一個任務就是管理狀態,該任務通常是使用 Cookie 或應用程序狀態管理構造(如 Session 變量)來完成的。Visual Basic .NET 具有與 PHP 類似的用于處理狀態的方法。 設置和檢索 Cookie在這兩種環境中設置 Cookie 都是比較繁瑣的。表 11 顯示了在這兩種語言中編寫然后讀取 Cookie 的示例。 表 11:設置和檢索 Cookie
設置和檢索 Session 變量ASP.NET 中的 Session 變量與 PHP 中的 Session 變量非常類似。這兩種環境中的 Session 變量都為確保 Web 應用程序訪問中的一致性提供了相應處理和 Cookie 操作。 最重要的一個差別是,當從 ASP.NET 的 Session 對象中檢索值時,該值將作為普通的 表 12:Session 變量的使用
ASP.NET 還提供了另一種形式的狀態管理,即“應用程序狀態”,它與 Session 變量類似,但只是在應用程序的生存期中保持一致。這使您可以存儲各種內容,例如配置信息或數據庫連接字符串。這些內容在應用程序運行期間不會發生變化。 有關此主題的詳細信息,請參閱《.NET Framework Development Guide》中的 Application State 一節。 正則表達式ASP.NET 支持其他正則表達式實現(例如 Perl 和 awk 中的正則表達式)的大多數常見功能。這實際上是為了保持與 Perl 5 正則表達式兼容。ASP.NET 還支持其他正則表達式實現中未提供的正則表達式功能,例如從右向左匹配以及實時編譯。由于 ASP.NET 與 Perl 正則表達式兼容,并且大多數 PHP 開發人員都使用了 Perl 兼容的正則表達式,因而通常無須將語法從一種形式轉換為另一種形式。有關 .NET 正則表達式支持的詳細信息,請參閱 .NET Framework Regular Expressions。 異常處理ASP.NET 框架通過一種人們所熟悉的語言構造 下面的示例說明了如何在 Visual Basic .NET 中進行異常處理: Try ' 此處是可能導致錯誤的代碼Catch e As ExceptionType ' 用于處理錯誤的代碼' 可選:可在此處放置更多 Catch 塊Finally ' 始終執行的代碼End Try 要注意的是, 查詢數據庫在 PHP 中,通常可以通過兩種常見方法訪問數據庫:使用數據庫的特定擴展名或使用獨立于數據庫的 PEAR DB 庫。 在 ASP.NET 中,可以通過一組稱為 ADO.NET 的對象來訪問數據庫,這些對象與 PEAR DB 庫的功能基本相同。數據庫查詢實際上是通過一組連接、命令、參數和數據適配器對象完成的。其中的每個對象都有多個版本,具體情況取決于所訪問的數據庫的類型。例如,有一組對象用于具有 OLE-DB 驅動程序的數據庫(例如 Microsoft Access),還有一組對象用于具有 ODBC 驅動程序而沒有 OLE-DB 驅動程序的數據庫。針對 Oracle 和 Microsoft SQL Server 也有專門的數據提供者,它們已經過優化,可以分別為每種特定的數據庫提供高性能的訪問。某些第三方還提供了其他數據庫支持,例如 MySQL。本節中的示例將使用 SQL Server 對象,因為它是 ASP.NET 最常用的數據庫。 System.Data、System.Data.SqlClient 和 System.Data.oledb 是用于在 ADO.NET 中定義數據庫訪問的命名空間。要使頁面能夠訪問這些類,您需要將 <%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.SqlClient" %> 圖 13 顯示了在這兩種語言中執行查詢的示例。在 PHP 中,我們顯示了一個使用 PEAR 的連接,PEAR 不僅是用于連接 DB 的最常用方法之一,但還是與 ADO.NET 最為類似的方法。 表 13:執行查詢
在 PHP 中,查詢結果存儲在一個稱為 result set(結果集)的變量中,而在 ADO.NET 中,該變量稱為 Dataset 對象。結果集是返回數據的只讀視圖,而 .NET Dataset 實際上是返回數據在內存中的讀寫視圖,這使 .NET 開發人員能夠輕松地處理從數據源返回的數據。 輸出數據時,ASP.NET 提供了若干方法,用于向用戶或客戶端顯示數據。第一種方法與 PHP 類似,即使用 SQLDataReader 對象遍歷結果集以寫出我們要通過查詢顯示的數據。更常用的方法是 ASP.NET 的數據綁定(PHP 中沒有與此對應的方法)。通過該方法,開發人員可以構建用戶界面并顯示可在應用程序中使用和重用的控件,還可以進一步根據數據和邏輯提取顯示內容。數據綁定的語法很靈活,您不僅可以綁定到數據源,還可以綁定到簡單的屬性、集合、表達式,甚至是方法調用返回的結果。 要使用數據綁定,您需要向某個數據識別服務器控件(例如 例如,在表 13 中,我們使用了數據綁定語法輸出查詢結果,如下所示: <%--- 在頁面中加載事件---%>myDataGrid.DataSource = myDatasetmyDataGrid.DataBind()<%--- 輸出結果 ---%><asp:DataGrid id="myDataGrid" runat="server" /> 數據識別服務器控件將提供其他功能,例如支持對顯示的數據進行分頁或內聯編輯。有關詳細信息和示例,請參閱 Data Binding Server Controls。 數據緩存和頁面緩存 對經常訪問的數據進行緩存可以顯著縮短站點的響應時間,因為不需要等待數據庫查詢便可進行頁面處理。而緩存由頁面請求生成的 HTML 可以進一步縮短響應時間,因為根本就無需處理緩存的頁面。這兩種環境均支持上述兩種緩存策略,但與 PHP 相比,ASP.NET 提供了更多用于緩存和管理數據的方法,從而使開發人員可以針對自己應用程序的性能需要選擇相應的方法和策略。 頁面緩存緩存某個頁面請求的 HTML 輸出是減少 Web 應用程序的負載的一種常用方法。PHP 本身不支持頁面緩存,但是可以通過編程的方式或下載第三方軟件包來執行此操作。通常可以在服務器上通過多種方法執行頁面緩存,這些方法可用于緩存編譯的代碼,直至將頁面輸出寫出到一個單獨的文件中(該文件將隨代碼的更新而更新)。 在 ASP.NET 中,可以通過低級別的 輸出緩存將檢查頁面的過期策略和驗證策略。如果頁面位于輸出緩存中并標記了過期策略(指示該頁面自緩存時開始 60 分鐘后過期),則 60 分鐘后,該頁面將從輸出緩存中刪除。如果在過期后收到另一個請求,將執行頁面代碼并再次緩存該頁面。這種過期策略稱為絕對過期,即頁面在某個時間之前有效。 除了對整個頁面進行輸出緩存外,ASP.NET 還提供了一個簡單方法,使您可以只緩存頁面的特定部分。這種方法稱為拆分緩存。您可以使用用戶控件 (User Control) 來指定頁面區域,并使用前面介紹的 有關 ASP.NET 的輸出緩存的詳細信息,請參閱 Caching ASP.NET Pages。 數據緩存在 PHP 中,可以通過多種方法以編程方式將查詢結果緩存到環境中,但 PHP 本身并未提供這種方法。在 PHP 中,可以創建數據緩存類或系統。對于少量信息,只需使用 Session 變量和/或 Cookie;對于大量或復雜的信息,可以創建您自己的數據緩存類。但問題是,當處理包含很多類型的復雜數據時,這種方法的效率會很低且容易出錯,在一定程度上會加大編程的難度。 ASP.NET 通過
ASP.NET 數據緩存為編程人員提供了許多不同的方法來管理應用程序并提高應用程序的響應速度和效率。有關詳細信息,請參閱 Cache Class 文檔以了解 發送電子郵件PHP 和 ASP.NET 都為以編程方式發送電子郵件提供了內置的支持。要在此示例中使用 ASP.NET 發送電子郵件,您需要設置 IIS SMTP 服務。因為 .NET 中的內置郵件對象依賴于該服務包含的對象,所以您必須安裝它。盡管如此,與 PHP 一樣,.NET 也允許您使用任何 SMTP 服務器或郵件服務器。表 14 對這兩種環境的基本語法進行了比較。 表 14:發送電子郵件
XML 處理和 Web 服務在 PHP 中,為分析和處理 XML 所提供的內置支持功能非常薄弱。雖然開發人員可以用它來分析和處理 XML,但它不支持 DOM 分析(該分析盡管比 PHP 的 SAX 分析器速度慢,但更容易使用)。PHP 也不支持根據 DTD 或 XML SCHEME 對 XML 文檔進行本地驗證,它也不支持 XSL/XSLT 以及市場上許多 Web 應用程序常用的各種其他技術。雖然 PHP 可以通過很多 PHP 軟件包完成許多與 XML 相關的任務,但 .NET 和 ASP.NET 為處理 XML 提供了廣泛的內置支持。XML 是 .Net 平臺的核心技術之一。有關 Web 服務的詳細信息,請參閱 How ASP.NET Web Services Work。 .NET Framework 為 W3C 定義的所有 XML 建議提供了廣泛的支持,此外還支持 XSL/XSLT、XPath、XQuery 以及各種其他技術,例如用于 Web 服務的 UDDI、WSDL 以及 SOAP。 雖然可以在 PHP 中創建 XML-RPC 類型的機制,但創建 Web 服務(使開發人員能夠使用常用協議和標準來交換數據和過程并將其用于查找、數據綁定和描述)。.NET 為 Web 服務和相關技術(如 SOAP、WSDL 和 UDDI)提供了廣泛的支持。使用 .NET,開發人員還可以輕松地創建和開發 Web 服務。例如,以下代碼將創建一個簡單的 hello world Web 服務: <%@ WebService Language="VB" Class="HelloWorld" %>Imports SystemImports System.Web.ServicesPublic Class HelloWorld :Inherits WebService <WebMethod()> Public Function SayHelloWorld() As String Return("Hello World") End FunctionEnd Class 利用 .NET Framework SDK,您可以使用命令行 Web 服務描述語言工具 ( WSDL http://someDomain.com/someFolder/HelloWorld.asmx?WSDL 此類與前面創建的類非常相似。它包含一個名為 對于客戶端,該代碼是非常簡單的,如以下示例所示: Dim myHelloWorld As New HelloWorld()Dim sReturn As String = myHelloWorld.SayHelloWorld() 這就是創建一個簡單 Web 服務的全過程。有關 XML 的一般信息以及 Web 服務的特定信息,請參閱 Employing XML in the .NET Framework。 小結 對于簡單的小型應用程序,從 PHP 遷移到 ASP.NET 通常并不復雜。對于更復雜的應用程序,由于基礎體系結構的不同以及 ASP.NET 的 OOP 模式,需要進行事先規劃和精心設計,以利用 ASP.NET 提供的將顯示與邏輯和數據明確分開的功能,以及可以節省時間的內置功能。與 PHP 相比,這些功能可以顯著減少完成相同任務所需的代碼數量。 |
溫馨提示:喜歡本站的話,請收藏一下本站!