從 PHP 遷移到 ASP.NET
來
本文討論了從 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 是基于一系列技術(如 CLR)構建的框架,提供了大量以很好的方式組織的類庫,這些類庫可滿足要在 Web 應用程序中使用的大多數功能的需要。您還可以輕松地創建各種組件,對該框架進行擴展。
雖然 PHP 也提供了類似的功能(例如 PEAR 庫),但 PHP 和 ASP.NET 并非完全相同,因為 ASP.NET 框架是完全基于 OOP 模式和 OOP 概念構建的,而 PHP 則不然。這種差別在 PHP 和 ASP.NET 中類和對象的訪問方式方面表現得猶為明顯。
這既有積極的一面,也有消極的一面。消極的一面是:對于某些 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。
有許多商業產品可用來通過優化這些 Opcode 來加快 PHP 頁面的執行速度。其他提高 PHP 腳本性能的方法還包括對 Opcode 和生成的 HTML 進行緩存。
需要注意的是,因為由 CLR 生成的二進制代碼已經最大限度地進行了優化,所以不必再使用其他產品來幫助提高性能。
此外還要注意,ASP.NET 中的所有內容在運行前都被編譯為機器碼。甚至 HTML 文本也被轉換為字符串常值控件,并按照適當的順序插入到控件樹中。
表 1 對 PHP 和 ASP.NET 中的某些主要功能進行了比較。
以下各部分比較了 PHP 和 .NET 的語法,并介紹了如何完成某些非常常見的編程任務。
一般來講,要在 ASP.NET 中注釋出 Visual Basic .Net 代碼,需要使用
表 2 顯示了這兩種環境中的注釋。
在 Visual Basic .NET 中聲明變量時,要指定它的變量名和特性。變量的聲明語句是
雖然這種方法最初看上去要比在 PHP 中指定變量復雜,但實際上它會給開發人員帶來方便。ASP.NET 致力于幫助開發人員創建可靠的應用程序,而指定數據類型可以使諸如變量清理、調試、異常和錯誤處理以及代碼維護等任務變得更加簡單。
表 3 顯示了在兩種環境中聲明變量的示例。
生存期這個概念很有用,因為它使開發人員在創建應用程序時不必考慮在大型應用程序中出現的許多問題,例如有效的內存管理。通過為變量選擇正確的生存期,可以使 .NET 對未在使用的變量執行清理操作。
有關生存期的詳細信息,請參閱 Lifetime。
在類或結構中,非局部變量的類別取決于該變量是否被共享。使用
變量的范圍是指可以引用它而不必限定其名稱的所有代碼集。變量的范圍取決于聲明變量的位置。位于給定區域中的代碼可以使用在該區域中定義的變量而不必限定其名稱。聲明范圍時,將遵循以下規則:
有關范圍的詳細信息,請參閱 Scope。
您可以使用上述任意關鍵字來聲明模塊、結構、類或實例變量。過程中只允許使用
然而,這些用于向瀏覽器發送輸出的方法主要是為了保持與傳統 ASP 的向后兼容性。ASP.NET 提供了新的基于控件且面向事件的模型,您只需在服務器控件上設置屬性即可將數據輸出到瀏覽器中。通過這種技術可以將布局與代碼清楚地分開,從而簡化了維護工作,并且在復雜情況下所需的代碼要比 PHP 少得多。
圖 6 對 PHP 的 switch 語句與 Visual Basic 的
在 Visual Basic 中,這種循環類型被稱為
表 8:條件循環
在 Visual Basic 中,這種循環類型稱為
下面給出了一個 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 不支持關聯數組,但是可以創建集合來代替數組。集合與關聯數組有些相似,可以使用集合來解決某些類似的問題。
在某些情況下,將項目存儲在集合中要比存儲在數組中更有效。
如果要處理一組小型的動態項目,則可以使用集合。要創建集合,只需如下面的示例代碼所示聲明并實例化一個
最重要的一個差別是,當從 ASP.NET 的 Session 對象中檢索值時,該值將作為普通的
表 12:Session 變量的使用
ASP.NET 還提供了另一種形式的狀態管理,即“應用程序狀態”,它與 Session 變量類似,但只是在應用程序的生存期中保持一致。這使您可以存儲各種內容,例如配置信息或數據庫連接字符串。這些內容在應用程序運行期間不會發生變化。
有關此主題的詳細信息,請參閱《.NET Framework Development Guide》中的 Application State 一節。
下面的示例說明了如何在 Visual Basic .NET 中進行異常處理:
在 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 中定義數據庫訪問的命名空間。要使頁面能夠訪問這些類,您需要將
表 13:執行查詢
在 PHP 中,查詢結果存儲在一個稱為 result set(結果集)的變量中,而在 ADO.NET 中,該變量稱為 Dataset 對象。結果集是返回數據的只讀視圖,而 .NET Dataset 實際上是返回數據在內存中的讀寫視圖,這使 .NET 開發人員能夠輕松地處理從數據源返回的數據。
輸出數據時,ASP.NET 提供了若干方法,用于向用戶或客戶端顯示數據。第一種方法與 PHP 類似,即使用 SQLDataReader 對象遍歷結果集以寫出我們要通過查詢顯示的數據。更常用的方法是 ASP.NET 的數據綁定(PHP 中沒有與此對應的方法)。通過該方法,開發人員可以構建用戶界面并顯示可在應用程序中使用和重用的控件,還可以進一步根據數據和邏輯提取顯示內容。數據綁定的語法很靈活,您不僅可以綁定到數據源,還可以綁定到簡單的屬性、集合、表達式,甚至是方法調用返回的結果。
要使用數據綁定,您需要向某個數據識別服務器控件(例如
例如,在表 13 中,我們使用了數據綁定語法輸出查詢結果,如下所示:
對經常訪問的數據進行緩存可以顯著縮短站點的響應時間,因為不需要等待數據庫查詢便可進行頁面處理。而緩存由頁面請求生成的 HTML 可以進一步縮短響應時間,因為根本就無需處理緩存的頁面。這兩種環境均支持上述兩種緩存策略,但與 PHP 相比,ASP.NET 提供了更多用于緩存和管理數據的方法,從而使開發人員可以針對自己應用程序的性能需要選擇相應的方法和策略。
在 ASP.NET 中,可以通過低級別的
輸出緩存將檢查頁面的過期策略和驗證策略。如果頁面位于輸出緩存中并標記了過期策略(指示該頁面自緩存時開始 60 分鐘后過期),則 60 分鐘后,該頁面將從輸出緩存中刪除。如果在過期后收到另一個請求,將執行頁面代碼并再次緩存該頁面。這種過期策略稱為絕對過期,即頁面在某個時間之前有效。
除了對整個頁面進行輸出緩存外,ASP.NET 還提供了一個簡單方法,使您可以只緩存頁面的特定部分。這種方法稱為拆分緩存。您可以使用用戶控件 (User Control) 來指定頁面區域,并使用前面介紹的
有關 ASP.NET 的輸出緩存的詳細信息,請參閱 Caching ASP.NET Pages。
ASP.NET 通過
.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 服務:
對于客戶端,該代碼是非常簡單的,如以下示例所示:
對于簡單的小型應用程序,從 PHP 遷移到 ASP.NET 通常并不復雜。對于更復雜的應用程序,由于基礎體系結構的不同以及 ASP.NET 的 OOP 模式,需要進行事先規劃和精心設計,以利用 ASP.NET 提供的將顯示與邏輯和數據明確分開的功能,以及可以節省時間的內置功能。與 PHP 相比,這些功能可以顯著減少完成相同任務所需的代碼數量。
盡管使用 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 | ASP.NET |
---|---|---|
編碼語言 | 具有舊 ASP 樣式標記的 C、C++ 樣式腳本語言。支持某些 OOP 概念。 | 支持超過 25 種語言,但最常用的兩種語言是 Visual Basic .NET 和 C#。大多數開發人員都選擇一種語言,但可以使用用任何其他支持的語言編寫的組件。 |
編譯的應用程序邏輯 | 可編譯并且可以作為可執行程序運行。 | 在動態編譯和預編譯模式下均支持。 |
全部頁面輸出緩存 | 本身并不支持。 | 支持,基于一個或多個 URL 參數、瀏覽器類型、自定義函數或任意組合來緩存頁面的不同版本。 |
部分頁面輸出緩存 | 本身并不支持。 | 通過使用用戶控件提供內置支持。可使用緩存 API 和復雜的過期規則來緩存數據和其他對象。 |
數據庫訪問 | 為市場上的大多數數據庫以及開放源代碼的數據庫提供了驅動程序。 | 直接支持 OLE-DB 和 ODBC,本身還包含了 Microsoft SQL Server™ 和 Oracle 的驅動程序。 |
數據庫輸出 | 數據集作為 PHP 變量返回,并且可以像任何其他變量那樣將其輸出。 | 以模板化的方式綁定到服務器端控件以簡化開發;如果需要,也可以手動循環。 |
外部組件 | 可以調用各種軟件包,并且開發人員可以直接修改 Zend 引擎(因為它是開放源代碼的)。負責 Zend 的編程人員還可以使 .NET 對象能夠從 PHP 中調用。 | 充分支持本身的 C 庫和 COM 對象以及用任何與 .NET 兼容的語言(包括托管 C++ [Managed C++])編寫的程序集。對 CORBA 對象或 Java 類未提供內置支持。 |
XML/XSLT | 在附加軟件包和庫中支持 | 為 XML DOM、XSLT、驗證和 XML 文檔的輕量級面向流的分析提供了廣泛和易于使用的支持。 |
XML Web Service | 當前正在開發 PHP 軟件包以支持基于 Apache AXIS 引擎以及其他引擎的 Web 服務。 | 當前版本提供了廣泛、靈活、符合標準的支持,使得發布和使用 Web 服務都非常容易。 |
會話狀態 | 基于 Cookie 的會話管理 | 基于 Cookie 或無 Cookie 的會話狀態(使用單個服務器內存存儲、中央狀態服務器或數據庫后端)。此外,可擴展的體系結構還允許使用自定義的會話狀態模塊替換內置選項。要啟用無 Cookie 的會話,只需更改配置。 |
內置功能 | PHP 的內置功能涵蓋了基于 Web 的應用程序可能需要執行的許多常見任務。通過某些額外的處理,它還可以訪問 Java 類庫。 | ASP.NET 可以直接訪問整個 .NET Framework 類庫,這些類庫包含了大量功能。 |
正則表達式 | 支持 POSIX 和 Perl 兼容的正則表達式語法。 | 支持 Perl-5 兼容的正則表達式,以及一些其他功能,例如從右向左匹配、預編譯表達式、命名組及完全的 Unicode 支持。此外,還允許用戶指定在正則表達式替換操作過程中調用的函數。 |
調試 | PHP 未提供廣泛的調試功能,但可以通過各種第三方產品和 Zend 增強調試和測試功能。 | 包含廣泛的跟蹤和環境信息,這些信息可包含在頁面中或在單獨的頁面中顯示。使用 Microsoft Visual Studio® .NET 除了可以調試客戶端腳本和 SQL Server 存儲過程外,還可以輕松地在執行頁面時對其進行交互式調試。 |
錯誤處理 | 不支持錯誤捕獲,但提供了各種錯誤處理功能和日志。 | 支持結構化的異常處理(其中新增了一個“finally”代碼塊,無論是否發生錯誤,都將執行該塊),支持引發自定義異常,還支持為不同類型的不可恢復錯誤指定自定義錯誤頁面。 |
圖像處理 | 無內置支持,但可以使用第三方組件。 | 包含大量用于創建和處理圖像的工具。(請參閱 .NET Framework 的 System.Drawing類。) |
代碼重用 | 用戶定義的函數、創建類的功能以及包含文件。 | 用戶控件、服務器控件、自定義類以及包含文件。 |
線程 | PHP 具有很好的線程模型。 | 完全支持。不但可以在單獨的線程中同時請求多個頁面,而且每個頁面(如果需要)還可以生成自己的線程以執行同步或異步操作。 |
數據緩存 | 具有有限的數據緩存(僅限于數據本身)。 | 包含大量的緩存 API,能夠存儲幾乎任何類型的數據(包括數據庫查詢結果),并且能夠基于時間、使用情況、文件或其他緩存項而過期。還允許在從緩存中刪除給定項時調用用戶定義的函數。 |
國際化 | 完全支持 Unicode。 | 支持 Unicode 字符串和各種字符編碼。日期、數字和貨幣函數均可區分文化環境,并根據當前文化環境的設置更改輸出(而不要求調用其他函數)。支持使用資源文件對應用程序進行動態本地化。 |
SMTP、HTTP、FTP、POP3 | 本身支持各種 Internet 協議。 | SMTP 支持依賴于 IIS SMTP 服務。能夠很好地支持 HTTP。.NET 不支持 FTP 和 POP3,但是有一些免費的和銷售的第三方組件可用來實現此功能。 |
集成開發環境 | 可以使用大量提供了廣泛功能的開發工具,價格從零到幾百美元不等。 | Microsoft 提供了一個名為 ASP.NET Web Matrix 的免費 ASP.NET 開發工具。最常用的工具是 Visual Studio.NET,它為所有 .NET 語言、用于創建 SQL 以及測試數據庫的數據庫工具、Web 設計工具、與版本控制的集成、高級調試功能以及許多其他功能提供了充分的支持。要獲得完整的功能列表,請訪問 MSDN® Visual Studio Developer Center。 其他工具(包括 Borland C# Builder 和 Macromedia Dreamweaver MX)也支持 ASP.NET。 |
Web 服務器支持 | 支持幾乎所有 Web 服務器。 | 支持 IIS 以及 Covalent 的商業版 Apache 2.0。 |
操作系統支持 | 支持幾乎所有常用的操作系統,包括 Microsoft Windows®、Mac、OS X、Amiga、Solaris、Free BSD、Linux 以及 AIX 等。 | 當前支持 Windows 2000、Windows XP 和 Windows Server 2003。 |
注釋
PHP 允許您使用 C、C++ 和 Unix shell 樣式語法在代碼中插入注釋,注釋指示器中的任何內容都不會被執行。一般來講,要在 ASP.NET 中注釋出 Visual Basic .Net 代碼,需要使用
<%--
打開注釋塊,并使用 --%>
關閉注釋塊。表 2 顯示了這兩種環境中的注釋。
表 2:服務器端注釋
PHP | ASP.NET |
---|---|
/* 這是被注釋出的 文本塊 */ | <%-- 這是注釋 --%> |
變量
雖然 PHP 和 Visual Basic .NET 具有類似的語言構造,但語法卻截然不同。由于 Visual Basic .NET 是基于 OOP 模型構建的,因而變量的聲明要比 PHP 中變量的聲明更嚴謹(在 PHP 中聲明變量時只需在變量名之前添加一個$
符號)。在 Visual Basic .NET 中聲明變量時,要指定它的變量名和特性。變量的聲明語句是
Dim
關鍵字。它的位置和內容決定了變量的特性。變量具有級別(例如局部變量和模塊變量)、數據類型、生存期以及可訪問性。雖然這種方法最初看上去要比在 PHP 中指定變量復雜,但實際上它會給開發人員帶來方便。ASP.NET 致力于幫助開發人員創建可靠的應用程序,而指定數據類型可以使諸如變量清理、調試、異常和錯誤處理以及代碼維護等任務變得更加簡單。
表 3 顯示了在兩種環境中聲明變量的示例。
表 3:變量聲明
PHP | Visual Basic .NET |
---|---|
$head_count $foo $X $obj | Dim head_count AS Integer Dim foo As String Dim X as Date Dim Obj as object |
聲明數據類型
聲明語句中的AS
子句用于定義所聲明變量的數據類型或對象類型。您可以為變量指定以下任意類型:- 基本數據類型,例如
Boolean
、Long
或Decimal
- 復合數據類型,例如數組或結構
- Visual Basic 或其他應用程序中的對象類型或類,例如
Label
或TextBox
numStudents
、numGTA
和numProfessors
聲明為 Integer
類型:Dim numStudents, numGTA , numProfessors AS Integer ' 三個變量都是 Integer 類型。有關數據類型的詳細信息,請參閱 Data Types。有關面向對象編程的詳細信息,請參閱 Object-Oriented Programming in Visual Basic。
聲明生存期
變量的生存期是指變量可供使用的時間段。使用Dim
語句聲明的局部變量僅在其執行過程中存在。過程終止時,該過程的所有局部變量都將消失,這些變量的值也將丟失。生存期這個概念很有用,因為它使開發人員在創建應用程序時不必考慮在大型應用程序中出現的許多問題,例如有效的內存管理。通過為變量選擇正確的生存期,可以使 .NET 對未在使用的變量執行清理操作。
有關生存期的詳細信息,請參閱 Lifetime。
聲明范圍
局部變量是在過程(過程與函數類似)中聲明的變量。非局部變量是在過程之外但在類或結構中聲明的變量。在類或結構中,非局部變量的類別取決于該變量是否被共享。使用
Shared
關鍵字聲明的變量是共享變量,它只有一個副本并且在類或結構的所有實例中共享。如果不使用 Shared
關鍵字,則該變量為實例變量,并且針對類或結構的每個實例都將創建一個單獨的變量副本。實例變量的給定副本僅可用于為之創建該副本的實例。變量的范圍是指可以引用它而不必限定其名稱的所有代碼集。變量的范圍取決于聲明變量的位置。位于給定區域中的代碼可以使用在該區域中定義的變量而不必限定其名稱。聲明范圍時,將遵循以下規則:
- 共享變量或實例變量的范圍是在其中聲明了該變量的結構或類。
- 局部變量的范圍是在其中聲明了該變量的過程。
有關范圍的詳細信息,請參閱 Scope。
聲明可訪問性
.NET 支持變量的可訪問性,從而使開發人員可以控制哪些代碼能夠訪問特定的變量。例如,如果要為某個公式設置一些常數,并且要確保這些常數不會被它們所在類以外的其他代碼更改,則可以使用 private 按如下所示聲明該變量:Private myConstant As Integer變量的可訪問性由聲明語句中使用的一個或多個關鍵字
Dim
、Public
、Protected
、Friend
、Protected Friend
或 Private
確定。開發過程中通常只使用 public 和 private。您可以使用上述任意關鍵字來聲明模塊、結構、類或實例變量。過程中只允許使用
Dim
關鍵字,并且可訪問性始終為 private。輸出
PHP 中輸出數據的典型方式是使用 echo()
語言構造。ASP.NET 中與此最相似的是 Response.Write()
方法(或 <%= %>
構造,它只是 Response.Write()
的簡寫形式)。表 4 顯示了向頁面寫入值的基本語法。
表 4:基本輸出
PHP | Visual Basic .NET |
---|---|
<?php $hello = "hi how are you\n"; echo $hello; ? > | <% Dim Hello As String = "Hi how are you" & vbcrlf Response.Write(Hello) %> |
<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"/>此示例聲明了一個名為
TheDate
的服務器端標簽 (Label
) 控件,并在該頁面的 Load
事件中將此標簽的 Text
屬性設置為當前的日期和時間。此代碼的 HTML 輸出與其他兩個版本相同,不同的是 Label
控件將自身呈現為 span
標記(其中包含所設置的任何標簽文本)。條件處理
IF/ELSE
PHP 具有若干條件處理表達式,例如 for
、while
、switch
和 foreach
,但最常用的是 if/else
表達式。Visual Basic .NET 有幾個非常類似的構造,其語法也很類似。表 5 對 PHP 和 Visual Basic .NET 中的等價條件邏輯進行了比較。
表 5:基本條件邏輯
PHP | Visual Basic .NET |
---|---|
if ($a > $b) { print "a is bigger than b"; } elseif ($a == $b) { print "a is equal to b"; } else { print "a is smaller than b"; } | If a > b Response.write ("a is bigger than b") ElseIf a = b Then Response.write ("a is equal to b") Else Response.write ("a is smaller than b") End If |
切換
切換語句是大多數編程語言的常見語言構造,用于通過多個值對單個表達式進行測試。它常用于替換包含多個elseif/else
塊的 if
語句。圖 6 對 PHP 的 switch 語句與 Visual Basic 的
Select Case
語句進行了比較。
表 6:
switch
與 select case
語句的對比PHP | Visual Basic .NET |
---|---|
switch ($i) { case 0: print "i equals 0"; break; case 1: print "i equals 1"; break; case 2: print "i equals 2"; break; default: print "i is not equal to 0, 1 or 2"; } | Select Case Number i Case 0 description = "0" response.write ("i equals 0") Case 1 description = "1" response.write ("i equals 1") Case 2 description = "2" response.write ("i equals 2") Case Else description = " i is not equal to 0, 1 or 2" response.write ("i is not equal to 0, 1 or 2 ") End Select |
循環
另一個非常常見的控制構造是循環。PHP 和 .NET 都支持若干不同的常見循環類型。
表 7:
For
循環PHP | Visual Basic .NET |
---|---|
for ($i = 1; $i <= 100; $i++) { print $i; } | Dim sum As Integer = 0 Dim counter As Integer For counter = 1 To 100 Step 5 sum += counter Next For i = 1 to 100 Response.write (i) Next I |
For...Next
循環,而在 PHP 中則稱為 For
循環。在此示例中,我們使用了+=
運算符作為 sum = sum + counter
的簡寫方式。
在 PHP 中,可以使用 Break;
語句來中斷循環。而 For...Next
循環可以通過 Exit For
語句中斷。條件循環
只要某個條件計算為 true
,條件循環便會持續重復一組指令。表 8 顯示了這兩種語言中的基本條件循環示例。表 8:條件循環
PHP | Visual Basic .NET |
---|---|
$i = 1; while ($i <= 10): print $i; $i++; endwhile; | Dim counter i As Integer = 1 Do While counter i <= 10 Response.write(i)counter i += 1 Loop |
Do...Loop
語句,或 while
循環。PHP 也支持 Do...While
循環,該循環與while
循環非常類似,不同之處在于它是在每個循環的結尾而不是開始檢查真假表達式。 Do...While
循環與常規 while
循環的主要差別是前者會確保運行第一個循環(因為只在該循環的結尾檢查真假表達式),而常規的 while
循環則不一定運行。(因為它在每個循環的開始檢查真假表達式,如果它一開始便計算為 FALSE
,該循環將立即結束執行。)下面給出了一個 PHP 中這種情況的示例:
$i = 0; do { print $i; } while ($i>0);此循環只運行一次,因為在第一次循環后檢查真假表達式時,表達式計算為
FALSE
($i
不大于 0),所以循環將停止執行。在 Visual Basic .NET 中,您可以執行同樣的操作:
Dim counter i As Integer = 0 Do response.write (i)counter Loop While counter i > 0但是,Visual Basic .NET 支持內置的循環功能,這是 PHP 所不支持的。該功能將對條件進行計算,直到條件為真時為止。
Foreach 循環
PHP 4(而非 PHP 3)包含一個 foreach
構造,它與 ASP.NET 以及某些其他語言中的構造非常類似。它只是為循環數組提供了一個簡單的途徑。foreach
只適用于數組,如果試圖將其用于其他數據類型的變量或未初始化的變量,則會導致錯誤。Visual Basic .NET 中與此等價的循環是 For Each...Next
語句。表 9 顯示了在這兩種語言中循環數組的示例。
表 9:
Foreach
循環PHP | Visual Basic .NET |
---|---|
$i = 0; foreach($a as $v) { print "\$Key[$i]$v \n"; $i++; } | for each v in a response.write a(v) (v & vbcrlf) next |
數組
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:創建數組的示例
PHP | Visual Basic .NET |
---|---|
$a = array (0,1, 2); | Dim MySingleArraya() As Integer = New Integer (2) {0,1,2} |
Dim
語句聲明的。變量名后面帶有一對或多對括號,表明它是數組而不是標量(包含單個值的變量)。創建 Visual Basic .NET 數組時,還必須將其聲明為保存特定類型的數據。如果指定的類型是
Object
(作為 .NET 中所有對象類型的基礎的普通類型),則此數組可以保存任何類型的數據,但是從數組中檢索值時,必須將值轉換為原來的類型。Visual Basic .NET 數組可以是嵌套的數組,也可以是多維數組。Visual Basic .NET 中有許多與 PHP 相對應的用于處理數組的函數,但有一個例外。由于 Visual Basic .NET 不支持關聯數組,因而不存在用于根據數組的“主鍵”來訪問、索引或執行任何操作的函數。Visual Basic .NET 中不存在這樣的“主鍵”。
雖然本文多次提到 Visual Basic .NET 不支持關聯數組,但是可以創建集合來代替數組。集合與關聯數組有些相似,可以使用集合來解決某些類似的問題。
在某些情況下,將項目存儲在集合中要比存儲在數組中更有效。
如果要處理一組小型的動態項目,則可以使用集合。要創建集合,只需如下面的示例代碼所示聲明并實例化一個
Collection
:Dim myCollection As New Collection()然后,您可以使用
Add
方法向集合中添加成員。在此示例中,我們創建了四個字符串并將它們添加到集合中。您還可以選擇添加一個唯一的 String
值作為集合成員的主鍵。該值作為 Add
方法的第二個參數傳遞給集合。Dim w, x, y, z As String w = "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
PHP | Visual Basic .NET |
---|---|
<?php $value = 'something from somewhere'; setcookie ("TestCookie", $value,time()+3600); /* expire in 1 hour */ ?> and to retive the set cookie <? echo $_COOKIE["TestCookie"]; ?> | Dim value as string = "something from somewhere" Dim myCookie As New HttpCookie = New HttpCookie("Something from somewhereTestCookie") Dim now as DateTime = DateTime.Now myCookie.Value = now.ToString()value myCookie.Expires = now.AddHour(1) Response.Cookies.Add(myCookie) 'and to retrieve the set cookie Response.Write(Request.Cookies["What we setTestCookie"}.Value} |
設置和檢索 Session 變量
ASP.NET 中的 Session 變量與 PHP 中的 Session 變量非常類似。這兩種環境中的 Session 變量都為確保 Web 應用程序訪問中的一致性提供了相應處理和 Cookie 操作。最重要的一個差別是,當從 ASP.NET 的 Session 對象中檢索值時,該值將作為普通的
System.Object
類型返回,而這種類型可以保存任何類型的數據。要使用該值,必須先將其重新轉換為原來的基本類型。表 12 顯示了一些 Session 變量的使用示例。表 12:Session 變量的使用
PHP | Visual Basic .NET |
---|---|
<?PHP session_start(); session_register('today'); $today = getdate(); ?>
<?= $today ?> | Session("Today") = DateTime.Now Dim today As Date today = CDate(Session("Today")) Response.Write(today) Response.write (session("Today")) |
有關此主題的詳細信息,請參閱《.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 框架通過一種人們所熟悉的語言構造Try/Catch
提供了結構化的異常處理,從而能夠捕獲代碼中可能出現的異常。PHP 沒有提供此功能,但 PHP 5 中將添加它。下面的示例說明了如何在 Visual Basic .NET 中進行異常處理:
Try ' 此處是可能導致錯誤的代碼 Catch e As ExceptionType ' 用于處理錯誤的代碼 ' 可選:可在此處放置更多 Catch 塊 Finally ' 始終執行的代碼 End Try要注意的是,
Try
塊可以包含一個或多個 Catch
塊,或包含一個 Finally
塊,也可以同時包含兩者。也就是說,如果您知道無法更正錯誤,但仍需要清除某些對象而不管是否發生錯誤,則可以使用不包含 Catch
語句的 Try...Finally
塊。查詢數據庫
在 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 中定義數據庫訪問的命名空間。要使頁面能夠訪問這些類,您需要將
System.Data
和 System.Data.SqlClient 命名空間導入到頁面中。<%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %>圖 13 顯示了在這兩種語言中執行查詢的示例。在 PHP 中,我們顯示了一個使用 PEAR 的連接,PEAR 不僅是用于連接 DB 的最常用方法之一,但還是與 ADO.NET 最為類似的方法。
表 13:執行查詢
PHP | Visual Basic .NET |
---|---|
<?php //connect require_once('DB.PHP'); $db=DB::connect ("mysql://mydbvie w:user@localhost/mydb"); if (DB::iserror($db)) { die($db->getMessage()); $sql = "select * from mytable"; $q= $db->query($sql); if (DB::iserror($q)) { die($q->getMessage()); } <tr> <td><?= $row[0] ?></td> <td><?= $row[1] ?></td> <td><?= $row[2] ?></td> </tr> | <script runat="server"> Sub Page_Load(Sender As Object, E As EventArgs) Dim myConnection As New SqlConnection("server=(local)\NetSDK; database=mydb;Trusted_Connection =yes") Dim myCommand As New SqlDataAdapter("select * from mytable", myConnection) Dim ds As New DataSet() myCommand.Fill(ds, "myDataset") myDataGrid.DataSource = myDataset myDataGrid.DataBind() End Sub </script> <%--- 輸出結果 ---%> <form runat="server"> <asp:DataGrid id="myDataGrid" runat="server" /> </form> |
輸出數據時,ASP.NET 提供了若干方法,用于向用戶或客戶端顯示數據。第一種方法與 PHP 類似,即使用 SQLDataReader 對象遍歷結果集以寫出我們要通過查詢顯示的數據。更常用的方法是 ASP.NET 的數據綁定(PHP 中沒有與此對應的方法)。通過該方法,開發人員可以構建用戶界面并顯示可在應用程序中使用和重用的控件,還可以進一步根據數據和邏輯提取顯示內容。數據綁定的語法很靈活,您不僅可以綁定到數據源,還可以綁定到簡單的屬性、集合、表達式,甚至是方法調用返回的結果。
要使用數據綁定,您需要向某個數據識別服務器控件(例如
DataGrid
)的 DataSource
屬性指定某個數據源(例如查詢結果)。您還可以選擇為每個列提供一些附加的格式化信息并調用 DataBind()
方法。服務器控件將負責完成剩余的工作。例如,在表 13 中,我們使用了數據綁定語法輸出查詢結果,如下所示:
<%--- 在頁面中加載事件 ---%> myDataGrid.DataSource = myDataset myDataGrid.DataBind() <%--- 輸出結果 ---%> <asp:DataGrid id="myDataGrid" runat="server" />數據識別服務器控件將提供其他功能,例如支持對顯示的數據進行分頁或內聯編輯。有關詳細信息和示例,請參閱Data Binding Server Controls。
對經常訪問的數據進行緩存可以顯著縮短站點的響應時間,因為不需要等待數據庫查詢便可進行頁面處理。而緩存由頁面請求生成的 HTML 可以進一步縮短響應時間,因為根本就無需處理緩存的頁面。這兩種環境均支持上述兩種緩存策略,但與 PHP 相比,ASP.NET 提供了更多用于緩存和管理數據的方法,從而使開發人員可以針對自己應用程序的性能需要選擇相應的方法和策略。
頁面緩存
緩存某個頁面請求的 HTML 輸出是減少 Web 應用程序的負載的一種常用方法。PHP 本身不支持頁面緩存,但是可以通過編程的方式或下載第三方軟件包來執行此操作。通常可以在服務器上通過多種方法執行頁面緩存,這些方法可用于緩存編譯的代碼,直至將頁面輸出寫出到一個單獨的文件中(該文件將隨代碼的更新而更新)。在 ASP.NET 中,可以通過低級別的
OutputCache
API 或高級別的 @ OutputCache
指令來執行頁面緩存。啟用輸出緩存后,將在對頁面進行第一個 GET
請求時創建輸出緩存條目。后續的 GET
或 HEAD
請求將由輸出緩存條目支持,直到緩存的請求過期。輸出緩存將檢查頁面的過期策略和驗證策略。如果頁面位于輸出緩存中并標記了過期策略(指示該頁面自緩存時開始 60 分鐘后過期),則 60 分鐘后,該頁面將從輸出緩存中刪除。如果在過期后收到另一個請求,將執行頁面代碼并再次緩存該頁面。這種過期策略稱為絕對過期,即頁面在某個時間之前有效。
除了對整個頁面進行輸出緩存外,ASP.NET 還提供了一個簡單方法,使您可以只緩存頁面的特定部分。這種方法稱為拆分緩存。您可以使用用戶控件 (User Control) 來指定頁面區域,并使用前面介紹的
@ OutputCache
指令將這些區域標記為緩存區域。該指令指定了用戶控件的輸出內容在服務器上緩存的時間(以秒為單位)以及影響這一時間的任何可選條件。有關 ASP.NET 的輸出緩存的詳細信息,請參閱 Caching ASP.NET Pages。
數據緩存
在 PHP 中,可以通過多種方法以編程方式將查詢結果緩存到環境中,但 PHP 本身并未提供這種方法。在 PHP 中,可以創建數據緩存類或系統。對于少量信息,只需使用 Session 變量和/或 Cookie;對于大量或復雜的信息,可以創建您自己的數據緩存類。但問題是,當處理包含很多類型的復雜數據時,這種方法的效率會很低且容易出錯,在一定程度上會加大編程的難度。ASP.NET 通過
Page.Cache
對象提供了一個系統范圍的數據緩存方法,可用于數據集 (DataSet)、數組、集合、XML 對象等。對于需要更復雜功能的應用程序,ASP.NET 緩存還支持三種特定類型的緩存:過期、清理以及文件和關鍵項相關性。- 過期類型的緩存使開發人員可以控制緩存項目的過期時間。可以將該時間定義為特定的時間(例如 01:00),也可以將其定義為相對于上次使用項目時的時間,例如自上次訪問該項目時開始 20 分鐘后過期。過期后的項目將從緩存中刪除,以后再試圖檢索該項目時,將返回空值(除非再次將其插入到緩存中)。
- 清理類型的緩存會在內存不足時嘗試刪除不經常使用或不重要的項目。開發人員可以控制清理的執行方式,并且可以在將項目插入到緩存中時向清理程序提供提示,以指示創建該項目的相對系統開銷以及為使該項目有效而必須對其進行訪問的相對頻率。
- 文件和關鍵項相關性類型的緩存將基于某個外部文件或另一個緩存項目確定該緩存項目的有效性。如果相關項發生變化,緩存項目將失效并從緩存中刪除。例如,假設您有一個較大的需要定期更新并下載給員工的報告,則可以在應用程序中使用此功能。應用程序處理文件和報告中的數據,然后緩存該數據并插入對該數據的來源文件(從該文件讀取數據)的相關性。當該文件更新時,數據將從緩存中刪除,應用程序可以重新讀取它并重新插入更新的數據副本。
Cache
對象。發送電子郵件
PHP 和 ASP.NET 都為以編程方式發送電子郵件提供了內置的支持。要在此示例中使用 ASP.NET 發送電子郵件,您需要設置 IIS SMTP 服務。因為 .NET 中的內置郵件對象依賴于該服務包含的對象,所以您必須安裝它。盡管如此,與 PHP 一樣,.NET 也允許您使用任何 SMTP 服務器或郵件服務器。表 14 對這兩種環境的基本語法進行了比較。
表 14:發送電子郵件
PHP | Visual Basic .NET |
---|---|
$to = "test@atnoaddress.com"; $from = "me@nosuchaddress.com"; $subject = "hi"; $message = "just wanted to say hi"; mail($to,$subject,$message, $from) | Dim myMail As MailMessage = New MailMessage() myMail.From = "me@nosuchaddress.com" myMail.To = "test@atnoaddress.com" myMail.Subect = "hi" myMail.Body = "just wanted to say hi" SmtpMail.Send(myMail) |
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 System Imports System.Web.Services Public Class HelloWorld :Inherits WebService <WebMethod()> Public Function SayHelloWorld() As String Return("Hello World") End Function End Class利用 .NET Framework SDK,您可以使用命令行 Web 服務描述語言工具 (
WSDL.exe
) 生成代理類。要為上述示例創建一個名為 HelloWorld.cs
的代理類,可以輸入:WSDL http://someDomain.com/someFolder/HelloWorld.asmx?WSDL此類與前面創建的類非常相似。它包含一個名為
SayHelloWorld
的方法,用于返回字符串。將此代理類編譯到應用程序中,然后調用此代理類的方法,使該代理類通過 HTTP 將 SOAP 請求打包并接收 SOAP 編碼的響應,該響應隨后被封裝為字符串。對于客戶端,該代碼是非常簡單的,如以下示例所示:
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 相比,這些功能可以顯著減少完成相同任務所需的代碼數量。
from: 中國代碼網 China-Code.Net
沒有留言:
張貼留言