簡(jiǎn)介
本文討論了從 php (php:hypertext preprocessor 4) 到 asp.net 的遷移,并對(duì) php 和 microsoft® visual basic® .net 的基本語(yǔ)法以及基本功能和體系結(jié)構(gòu)進(jìn)行了對(duì)比。
盡管使用 php 和 asp.net 都可以構(gòu)建復(fù)雜的 web 應(yīng)用程序(例如電子商務(wù)站點(diǎn)、intranet 和企業(yè)門戶),但兩者之間卻存在若干重要差別。與 php 不同,asp.net 并不是一種語(yǔ)言或分析器,而是 microsoft .net framework 中的一組用于構(gòu)建 web 應(yīng)用程序和 xml web service 的技術(shù)。同 php 一樣,microsoft asp.net 頁(yè)面在服務(wù)器上執(zhí)行并生成標(biāo)記(例如 html、wml 或 xml),標(biāo)記將發(fā)送給桌面應(yīng)用程序或移動(dòng)應(yīng)用程序。但不同的是,asp.net 為開(kāi)發(fā) web 頁(yè)面提供了強(qiáng)大的、面向?qū)ο蟮囊约坝墒录?qū)動(dòng)的編程模型,同時(shí)仍保留了 php 開(kāi)發(fā)人員所習(xí)慣的那種簡(jiǎn)單性。
asp.net 應(yīng)用程序是基于強(qiáng)大的面向?qū)ο缶幊?(oop) 模式,而不是基于腳本模式。這樣便可以獲得更為嚴(yán)謹(jǐn)?shù)?oop 功能,例如繼承、封裝和反射。雖然大多數(shù)基本的簡(jiǎn)單操作可以輕松地從 php 轉(zhuǎn)換到 asp.net,但要轉(zhuǎn)換更為復(fù)雜的應(yīng)用程序卻并不這么簡(jiǎn)單,這需要仔細(xì)的規(guī)劃和考慮,并采用更符合 oop 的方法。
本文假設(shè)讀者具有 php 方面的經(jīng)驗(yàn),并且對(duì)編程和軟件開(kāi)發(fā)有著基本了解。本文首先從代碼方面對(duì)兩者的基礎(chǔ)體系結(jié)構(gòu)的差別進(jìn)行簡(jiǎn)單比較,并簡(jiǎn)要介紹一下 oop 開(kāi)發(fā)模型,然后比較兩者的功能,最后將使用 php 和 asp.net 開(kāi)發(fā) web 應(yīng)用程序時(shí)的語(yǔ)法和常見(jiàn)任務(wù)作以對(duì)比。
注意:如果您希望跳過(guò)有關(guān)遷移的詳細(xì)信息,而只想嘗試 asp.net 的使用,則可以直接跳到建議的后續(xù)操作部分。
體系結(jié)構(gòu)對(duì)比
閱讀完本文后,通過(guò)比較語(yǔ)法和語(yǔ)言,您將了解 php 和 asp.net 是很相似的,它們具有類似的功能和語(yǔ)法。但是,從更基本的體系結(jié)構(gòu)層面來(lái)講,php 與 asp.net 卻有著很大差別。php 基于獨(dú)立于平臺(tái)的處理器/引擎,該處理器/引擎用于分析 php 腳本、提供數(shù)據(jù)庫(kù)連接、符合 internet 協(xié)議以及提供大多數(shù) web 應(yīng)用程序平臺(tái)所常見(jiàn)的眾多其他任務(wù)。
asp.net 是基于一系列技術(shù)(如 clr)構(gòu)建的框架,提供了大量以很好的方式組織的類庫(kù),這些類庫(kù)可滿足要在 web 應(yīng)用程序中使用的大多數(shù)功能的需要。您還可以輕松地創(chuàng)建各種組件,對(duì)該框架進(jìn)行擴(kuò)展。
雖然 php 也提供了類似的功能(例如 pear 庫(kù)),但 php 和 asp.net 并非完全相同,因?yàn)?asp.net 框架是完全基于 oop 模式和 oop 概念構(gòu)建的,而 php 則不然。這種差別在 php 和 asp.net 中類和對(duì)象的訪問(wèn)方式方面表現(xiàn)得猶為明顯。
php 和 asp.net 中的面向?qū)ο缶幊?
雖然 php 和 asp.net 都為應(yīng)用程序開(kāi)發(fā)提供了 oop 模式,但它們對(duì)各種 oop 概念(例如封裝和多態(tài))的支持卻存在差別。例如,php 僅支持部分封裝(例如,支持在類中聲明方法和字段)和部分多態(tài)(沒(méi)有重載和抽象)。此外,由于 php 的類中不存在私有 (private)、公有 (public) 或受保護(hù) (protected ) 函數(shù)等概念以及重載,因此 php 也不支持這些概念及其訪問(wèn)。oop 純粹主義者可能會(huì)說(shuō),asp.net 以及各種語(yǔ)言也沒(méi)有完全支持 oop 模式中的所有概念,對(duì)于使用 oop 的大多數(shù)語(yǔ)言(如 c++ 和 java)來(lái)說(shuō),情況確實(shí)如此。
這既有積極的一面,也有消極的一面。消極的一面是:對(duì)于某些 web 開(kāi)發(fā)人員來(lái)說(shuō),學(xué)習(xí) asp.net 要比學(xué)習(xí) php 困難些,因?yàn)?php 提供的是開(kāi)發(fā)人員創(chuàng)建 web 站點(diǎn)時(shí)所慣用的腳本模式。但是,使用過(guò) oop 語(yǔ)言和/或 v 的開(kāi)發(fā)人員會(huì)發(fā)現(xiàn) asp.net 比較親切且易于學(xué)習(xí)。
asp.net 支持 oop 概念的積極的一面是,asp.net 應(yīng)用程序的大多數(shù)部分都會(huì)得到很好的設(shè)計(jì),并且能夠?qū)?nèi)容、邏輯和數(shù)據(jù)進(jìn)行清楚的分隔,因而從應(yīng)用程序生命周期的長(zhǎng)遠(yuǎn)角度看,這通常更容易為其提供支持。此外,由于 asp.net 本身支持企業(yè)技術(shù),例如消息隊(duì)列、事務(wù)(請(qǐng)參閱 .net framework 的 system.enterpriseservices 類)snmp 和 web 服務(wù),因而可以很容易地開(kāi)發(fā)具有高度可縮放性的強(qiáng)大的應(yīng)用程序。
要大致了解面向?qū)ο缶幊蹋◤?visual basic 的角度)的主要概念,請(qǐng)參閱 object-oriented programming in visual basic。
編譯
php
請(qǐng)求 php 頁(yè)面時(shí),html 和內(nèi)聯(lián) php 腳本將編譯為 zend opcode(zend 操作代碼)。opcode 是低級(jí)的二進(jìn)制指令,是提供 php 頁(yè)面時(shí)實(shí)際使用的代碼。編譯后,zend 引擎將運(yùn)行 opcode(與 java 的運(yùn)行時(shí)引擎運(yùn)行字節(jié)碼類似),然后生成 html 并提供給客戶端。
有許多商業(yè)產(chǎn)品可用來(lái)通過(guò)優(yōu)化這些 opcode 來(lái)加快 php 頁(yè)面的執(zhí)行速度。其他提高 php 腳本性能的方法還包括對(duì) opcode 和生成的 html 進(jìn)行緩存。
asp.net
當(dāng)向 iis(internet 信息服務(wù))或其他 web 服務(wù)器請(qǐng)求 .aspx 頁(yè)面(或 asp.net 支持的任何其他擴(kuò)展名)時(shí),該請(qǐng)求將被傳遞到 asp.net 進(jìn)行處理。如果是第一次請(qǐng)求該頁(yè)面,asp.net 會(huì)將其編譯為 msil(microsoft 中間語(yǔ)言)。然后,clr(公共語(yǔ)言運(yùn)行庫(kù))會(huì)將此 msil 代碼轉(zhuǎn)換為機(jī)器碼。最后使用這個(gè)編譯后的代碼運(yùn)行該請(qǐng)求。后續(xù)的請(qǐng)求將使用相同的機(jī)器碼運(yùn)行(假設(shè)該頁(yè)面未被修改)。
需要注意的是,因?yàn)橛?clr 生成的二進(jìn)制代碼已經(jīng)最大限度地進(jìn)行了優(yōu)化,所以不必再使用其他產(chǎn)品來(lái)幫助提高性能。
此外還要注意,asp.net 中的所有內(nèi)容在運(yùn)行前都被編譯為機(jī)器碼。甚至 html 文本也被轉(zhuǎn)換為字符串常值控件,并按照適當(dāng)?shù)捻樞虿迦氲娇丶?shù)中。
功能對(duì)比
表 1 對(duì) php 和 asp.net 中的某些主要功能進(jìn)行了比較。
表 1:php 和 asp.net 的功能對(duì)比
功能 php asp.net
編碼語(yǔ)言 具有舊 asp 樣式標(biāo)記的 c、c++ 樣式腳本語(yǔ)言。支持某些 oop 概念。 支持超過(guò) 25 種語(yǔ)言,但最常用的兩種語(yǔ)言是 visual basic .net 和 c#。大多數(shù)開(kāi)發(fā)人員都選擇一種語(yǔ)言,但可以使用用任何其他支持的語(yǔ)言編寫的組件。
編譯的應(yīng)用程序邏輯 可編譯并且可以作為可執(zhí)行程序運(yùn)行。 在動(dòng)態(tài)編譯和預(yù)編譯模式下均支持。
全部頁(yè)面輸出緩存 本身并不支持。 支持,基于一個(gè)或多個(gè) url 參數(shù)、瀏覽器類型、自定義函數(shù)或任意組合來(lái)緩存頁(yè)面的不同版本。
部分頁(yè)面輸出緩存 本身并不支持。 通過(guò)使用用戶控件提供內(nèi)置支持。可使用緩存 api 和復(fù)雜的過(guò)期規(guī)則來(lái)緩存數(shù)據(jù)和其他對(duì)象。
數(shù)據(jù)庫(kù)訪問(wèn) 為市場(chǎng)上的大多數(shù)數(shù)據(jù)庫(kù)以及開(kāi)放源代碼的數(shù)據(jù)庫(kù)提供了驅(qū)動(dòng)程序。 直接支持 ole-db 和 odbc,本身還包含了 microsoft sql server™ 和 oracle 的驅(qū)動(dòng)程序。
數(shù)據(jù)庫(kù)輸出 數(shù)據(jù)集作為 php 變量返回,并且可以像任何其他變量那樣將其輸出。 以模板化的方式綁定到服務(wù)器端控件以簡(jiǎn)化開(kāi)發(fā);如果需要,也可以手動(dòng)循環(huán)。
外部組件 可以調(diào)用各種軟件包,并且開(kāi)發(fā)人員可以直接修改 zend 引擎(因?yàn)樗情_(kāi)放源代碼的)。負(fù)責(zé) zend 的編程人員還可以使 .net 對(duì)象能夠從 php 中調(diào)用。 充分支持本身的 c 庫(kù)和 com 對(duì)象以及用任何與 .net 兼容的語(yǔ)言(包括托管 c++ [managed c++])編寫的程序集。對(duì) corba 對(duì)象或 java 類未提供內(nèi)置支持。
xml/xslt 在附加軟件包和庫(kù)中支持 為 xml dom、xslt、驗(yàn)證和 xml 文檔的輕量級(jí)面向流的分析提供了廣泛和易于使用的支持。
xml web service 當(dāng)前正在開(kāi)發(fā) php 軟件包以支持基于 apache axis 引擎以及其他引擎的 web 服務(wù)。 當(dāng)前版本提供了廣泛、靈活、符合標(biāo)準(zhǔn)的支持,使得發(fā)布和使用 web 服務(wù)都非常容易。
會(huì)話狀態(tài) 基于 cookie 的會(huì)話管理 基于 cookie 或無(wú) cookie 的會(huì)話狀態(tài)(使用單個(gè)服務(wù)器內(nèi)存存儲(chǔ)、中央狀態(tài)服務(wù)器或數(shù)據(jù)庫(kù)后端)。此外,可擴(kuò)展的體系結(jié)構(gòu)還允許使用自定義的會(huì)話狀態(tài)模塊替換內(nèi)置選項(xiàng)。要啟用無(wú) cookie 的會(huì)話,只需更改配置。
內(nèi)置功能 php 的內(nèi)置功能涵蓋了基于 web 的應(yīng)用程序可能需要執(zhí)行的許多常見(jiàn)任務(wù)。通過(guò)某些額外的處理,它還可以訪問(wèn) java 類庫(kù)。 asp.net 可以直接訪問(wèn)整個(gè) .net framework 類庫(kù),這些類庫(kù)包含了大量功能。
正則表達(dá)式 支持 posix 和 perl 兼容的正則表達(dá)式語(yǔ)法。 支持 perl-5 兼容的正則表達(dá)式,以及一些其他功能,例如從右向左匹配、預(yù)編譯表達(dá)式、命名組及完全的 unicode 支持。此外,還允許用戶指定在正則表達(dá)式替換操作過(guò)程中調(diào)用的函數(shù)。
調(diào)試 php 未提供廣泛的調(diào)試功能,但可以通過(guò)各種第三方產(chǎn)品和 zend 增強(qiáng)調(diào)試和測(cè)試功能。 包含廣泛的跟蹤和環(huán)境信息,這些信息可包含在頁(yè)面中或在單獨(dú)的頁(yè)面中顯示。使用 microsoft visual studio® .net 除了可以調(diào)試客戶端腳本和 sql server 存儲(chǔ)過(guò)程外,還可以輕松地在執(zhí)行頁(yè)面時(shí)對(duì)其進(jìn)行交互式調(diào)試。
錯(cuò)誤處理 不支持錯(cuò)誤捕獲,但提供了各種錯(cuò)誤處理功能和日志。 支持結(jié)構(gòu)化的異常處理(其中新增了一個(gè)“finally”代碼塊,無(wú)論是否發(fā)生錯(cuò)誤,都將執(zhí)行該塊),支持引發(fā)自定義異常,還支持為不同類型的不可恢復(fù)錯(cuò)誤指定自定義錯(cuò)誤頁(yè)面。
圖像處理 無(wú)內(nèi)置支持,但可以使用第三方組件。 包含大量用于創(chuàng)建和處理圖像的工具。(請(qǐng)參閱 .net framework 的 system.drawing 類。)
代碼重用 用戶定義的函數(shù)、創(chuàng)建類的功能以及包含文件。 用戶控件、服務(wù)器控件、自定義類以及包含文件。
線程 php 具有很好的線程模型。 完全支持。不但可以在單獨(dú)的線程中同時(shí)請(qǐng)求多個(gè)頁(yè)面,而且每個(gè)頁(yè)面(如果需要)還可以生成自己的線程以執(zhí)行同步或異步操作。
數(shù)據(jù)緩存 具有有限的數(shù)據(jù)緩存(僅限于數(shù)據(jù)本身)。 包含大量的緩存 api,能夠存儲(chǔ)幾乎任何類型的數(shù)據(jù)(包括數(shù)據(jù)庫(kù)查詢結(jié)果),并且能夠基于時(shí)間、使用情況、文件或其他緩存項(xiàng)而過(guò)期。還允許在從緩存中刪除給定項(xiàng)時(shí)調(diào)用用戶定義的函數(shù)。
國(guó)際化 完全支持 unicode。 支持 unicode 字符串和各種字符編碼。日期、數(shù)字和貨幣函數(shù)均可區(qū)分文化環(huán)境,并根據(jù)當(dāng)前文化環(huán)境的設(shè)置更改輸出(而不要求調(diào)用其他函數(shù))。支持使用資源文件對(duì)應(yīng)用程序進(jìn)行動(dòng)態(tài)本地化。
smtp、http、ftp、pop3 本身支持各種 internet 協(xié)議。 smtp 支持依賴于 iis smtp 服務(wù)。能夠很好地支持 http。.net 不支持 ftp 和 pop3,但是有一些免費(fèi)的和銷售的第三方組件可用來(lái)實(shí)現(xiàn)此功能。
集成開(kāi)發(fā)環(huán)境 可以使用大量提供了廣泛功能的開(kāi)發(fā)工具,價(jià)格從零到幾百美元不等。 microsoft 提供了一個(gè)名為 asp.net web matrix 的免費(fèi) asp.net 開(kāi)發(fā)工具。
最常用的工具是 visual studio.net,它為所有 .net 語(yǔ)言、用于創(chuàng)建 sql 以及測(cè)試數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)工具、web 設(shè)計(jì)工具、與版本控制的集成、高級(jí)調(diào)試功能以及許多其他功能提供了充分的支持。要獲得完整的功能列表,請(qǐng)?jiān)L問(wèn) msdn® visual studio developer center。
其他工具(包括 borland c# builder 和 macromedia dreamweaver mx)也支持 asp.net。
web 服務(wù)器支持 支持幾乎所有 web 服務(wù)器。 支持 iis 以及 covalent 的商業(yè)版 apache 2.0。
操作系統(tǒng)支持 支持幾乎所有常用的操作系統(tǒng),包括 microsoft windows®、mac、os x、amiga、solaris、free bsd、linux 以及 aix 等。 當(dāng)前支持 windows 2000、windows xp 和 windows server 2003。
新聞熱點(diǎn)
疑難解答
圖片精選