這是一個(gè)經(jīng)常被提出的問(wèn)題,并且它很容易把人們帶入爭論Linux還是Windows的歧途。這樣的爭論事實(shí)上反映出了對于相互競爭的Web開(kāi)發(fā)技術(shù)要進(jìn)行并行分析是多么困難的一件事情,而這一難度同時(shí)因為開(kāi)發(fā)人員對任何可比較操作系統的不同意見(jiàn)而大大增加。
所以與其繼續參與到這樣的爭論中,我們還不如來(lái)看看每一項技術(shù)對于特定Web開(kāi)發(fā)以及運行環(huán)境所表現出的優(yōu)勢。盡管ASP和PHP的相似程度大于其中任意一種與ASP.NET的相似程度,我們還是要討論ASP.NET。原因是開(kāi)發(fā)人員常常將其與ASP相混淆,并且在微軟的努力下ASP.NET的確會(huì )在將來(lái)完全取代ASP。
基本理論――特點(diǎn)概述
PHP――超文本預處理器(Hypertext Pre-processor)
PHP是開(kāi)放源代碼服務(wù)器端的腳本語(yǔ)言,在語(yǔ)法上同C語(yǔ)言非常類(lèi)似。盡管最初是被設計用于基于Linux的Apache Web 服務(wù)器系統,現在的PHP已經(jīng)被移植到了任何操作系統并兼容任何標準Web服務(wù)器軟件。由此也可以得出PHP的三大主要優(yōu)勢。首先它是跨平臺的技術(shù),因此PHP應用程序可以被方便的移植――當然這還要取決于諸如廠(chǎng)商特定數據庫等需要集成的額外組件。這樣的可移植性還帶來(lái)了另一方面的優(yōu)勢,即絕大部分的Web主機提供商都會(huì )支持PHP,因此根據需要更改主機將會(huì )非常方便。
第二點(diǎn),由于PHP同C編程語(yǔ)言有很多相似之處,對于熟悉相關(guān)語(yǔ)法的開(kāi)發(fā)人員來(lái)說(shuō),PHP則非常容易上手――這種語(yǔ)法同樣在Java、JavaScript以及Perl中得到應用。第三,由于是開(kāi)放源代碼產(chǎn)品,PHP將繼續快速發(fā)展,更為重要的是相關(guān)漏洞補丁將免費的定期植入到核心庫中。
此外,在一些特定的編程需求下,PHP對于開(kāi)發(fā)人員顯示出了更為誘人的吸引力。首先,PHP有內建庫支持對于圖片及PDF文檔的直接創(chuàng )建和相關(guān)操作。這意味著(zhù)當一個(gè)應用程序調用包含有anti-aliased類(lèi)型文本的動(dòng)態(tài)創(chuàng )建菜單圖像,或者是需要導出Acrobat格式頁(yè)面時(shí),PHP都將是解決此類(lèi)問(wèn)題的理想技術(shù)。盡管這些功能在理論上也可以通過(guò)其他與PHP相競爭的技術(shù)獲得,但往往其他技術(shù)需要安裝第三方自定義組件才能實(shí)現。
另一點(diǎn)使得PHP成為編寫(xiě)服務(wù)器腳本最佳選擇的是在處理連接mySOL或者Postgres數據庫一類(lèi)的問(wèn)題時(shí)PHP的良好表現。盡管對于mySOL或者Postgres數據庫的訪(fǎng)問(wèn)可以通過(guò)ASP技術(shù)借助ODBC連接來(lái)實(shí)現,但這常常需要系統管理員進(jìn)行額外的配置。幸運的是,這點(diǎn)限制在A(yíng)SP.NET中得到了改正,當需要建立類(lèi)似于使用MS SQL Server的直接數據庫連接時(shí)可以通過(guò)mySQL提供數據。
ASP――動(dòng)態(tài)服務(wù)頁(yè)面(Active Server Pages)
微軟將ASP引入Windows NT Server 4并將其作為IIS Web服務(wù)器下的動(dòng)態(tài)Web應用程序的默認使用平臺。由于它使用VBScript(Visual Basic語(yǔ)言的一個(gè)分支),ASP立即被熟悉Microsoft IDE――Visual Studio編程的開(kāi)發(fā)人員所追捧。隨著(zhù)腳本語(yǔ)言的不斷發(fā)展,研究人員對ASP并沒(méi)有引入太多功能使之加入到技術(shù)競爭的行列。因此,在PHP中可以看到的諸如圖像操作等功能沒(méi)有集成到ASP中。但開(kāi)發(fā)人員仍然可以通過(guò)DLL文件的形式編寫(xiě)(或者安裝)第三方COM對象來(lái)完成類(lèi)似的工作。在服務(wù)器自身允許的情況下,通過(guò)這種方式可以編寫(xiě)代碼來(lái)完成任何動(dòng)作。當然,造成的缺陷是這將導致為了配置這些服務(wù)開(kāi)發(fā)人員不得不與桌面系統進(jìn)行交互――對于Web開(kāi)發(fā)人員來(lái)說(shuō)這項功能并不是必須的。
ASP的優(yōu)勢是在企業(yè)環(huán)境中微軟服務(wù)器幾乎無(wú)處不在。此外,MS SQL Server同樣具有廣泛的市場(chǎng),并且能很好的支持ASP(這并不會(huì )讓人感到驚奇)。盡管事實(shí)上通過(guò)ODBC可以兼容任何數據來(lái)源,但SQL Server以及文件DSN訪(fǎng)問(wèn)(file DSN access)可以在代碼一級得到實(shí)現。
ASP.NET
是選擇ASP還是PHP的爭論正在隨著(zhù).NET的崛起而越來(lái)越顯得多余。的確,過(guò)去長(cháng)達數年的爭論將隨著(zhù)是選擇Java還是.NET技術(shù)(或是兩者)答案的揭曉而終結。ASP以及ASP.NET的唯一聯(lián)系是二者都使用VBScript。而單獨就.NET而言,它可以使用VBScript以及其他大約20種語(yǔ)言。
對于A(yíng)SP以及PHP來(lái)說(shuō),將ASP.NET看作是另外一種語(yǔ)言的原因是它運行在完全不同的構架之上。前者是翻譯腳本語(yǔ)言,而.NET則是經(jīng)過(guò)編譯的framework。這就意味著(zhù)首先Web頁(yè)面的運行速度將會(huì )有極大提高。同時(shí),源代碼更加安全且更為健壯。此外,ASP.NET給Web編程帶來(lái)了新的理念――即“code-behind頁(yè)面”的思想。按照code-behind思想,每一個(gè)HTML頁(yè)面都是由自身經(jīng)過(guò)編譯的程序化指令進(jìn)行驅動(dòng)。因此,HTML――或稱(chēng)之為表現層――很大程度上脫離了應用程序的商業(yè)邏輯。盡管這樣的分離也可以通過(guò)PHP和ASP來(lái)實(shí)現,但這并非同ASP.NET一樣屬于自身技術(shù)的主要部分。
ASP.NET的另一好處是它完整的集成了對XML以及Web服務(wù)的各種支持。對.NET而言可以使用非常廣泛的安全以及密碼系統庫,這對于金融機構和企業(yè)數據應用程序尤為有用。就缺陷而言,即使是具備豐富經(jīng)驗的開(kāi)發(fā)人員也會(huì )發(fā)現使用.NET可能把自己搞糊涂。不考慮開(kāi)發(fā)者對于所使用的編程語(yǔ)言的熟悉程度,對于Web開(kāi)發(fā)人員來(lái)說(shuō),在程序范例方面難度的大幅提升可能會(huì )成為他們融入ASP.NET的主要障礙。對ASP.NET應用程序來(lái)說(shuō)主機同樣是個(gè)問(wèn)題,ASP.NET并未同ASP或者PHP一樣獲得了主機提供商的廣泛支持,無(wú)法在同一級別上展開(kāi)競爭。
實(shí)踐――語(yǔ)言比較
變量聲明
在VBScript中(ASP和ASP.NET都使用VBScript),在使用變量之前并不一定要對其進(jìn)行聲明,盡管技術(shù)文檔通常建議這么做。使用Option Explicit聲明,開(kāi)發(fā)人員可以通過(guò)程序強制進(jìn)行變量聲明。在PHP中,變量可以被聲明,盡管沒(méi)有辦法強制開(kāi)發(fā)人員做到這點(diǎn)。的確,在使用之前變量都自動(dòng)進(jìn)行聲明。PHP變量的優(yōu)點(diǎn)在于變量可以被設置成為其他變量的引用(references),而在VBScript中變量只能通過(guò)值來(lái)定義。
<%
‘ VBScript Example
Option Explicit
myVar = 1
myOtherVar = myVar
myVar = 2
‘ myResult will be 3
myResult = myVar + myOtherVar
%>
<?
// PHP Example
$myVar = 1;
‘Use the ampersand to make a reference
$myOtherVar = &$myVar;
$myVar = 2;
// $myResult will be 4
$myResult = $myVar + $myOtherVar;
?>
變量收集
在PHP以及ASP中使用表單以及query string變量的方法非常相似。有很多辦法可以訪(fǎng)問(wèn)表單以及query string變量的集合,例如通過(guò)name或者將其作為數組。在A(yíng)SP.NET中情況則有很多不同,尤其是對于表單域。不同于盲目的尋找提交過(guò)的表單變量,code-behind可以對HTML頁(yè)面中的每一個(gè)表單域了如指掌,并可以按照任何已知事件的執行為條件觸發(fā)對這些表單域的值進(jìn)行檢查。其中一個(gè)事件是“postback”,當表單被用戶(hù)提交時(shí)此事件被觸發(fā)。其他的事件可以是客戶(hù)端的程序,并且可以通過(guò)JavaScript來(lái)觸發(fā)。在A(yíng)SP.NET中,二者沒(méi)有性質(zhì)上的區別。
<%
‘ ASP Example
myFormVal = request.form("myInputField")
myQSval = request.querystring("myQSitem")
myVal = request.item("myFormOrQSitem")
%>
<?
// PHP 4.1+ Example
$myFormVal = $_POST[‘myInputField‘];
$myQSval = $_REQUEST[‘myQSitem‘];
// PHP 3+ Example
$myFormVal = $HTTP_POST_VARS[‘myInputField‘];
// If register_globals = on
$myVal = $myFormOrQSitem;
?>
<!-- ASP.NET example -->
<html>
<script language="VB" runat=server>
Sub SubmitBtn_Click(Sender As Object, E As EventArgs)
Message.Text = "Hello " & Name.Text
End Sub
</script>
<body>
<form action="action.aspx" method="post" runat="server">
Name: <asp:textbox id="Name" runat="server"/>
<asp:button text="OK" OnClick="SubmitBtn_Click"
runat="server"/>
<asp:label id="Message" runat="server"/>
</form>
</body>
</html>
字符串連接(String Concatenation)
PHP似乎對此問(wèn)題給予了足夠的重視,它允許將變量插入到字符串中而無(wú)需考慮通常的串連(Concatenation)問(wèn)題。ASP.NET則把整個(gè)過(guò)程弄得比較麻煩,需要借助其StringBuilder類(lèi),但由此ASP.NET的運行速度也會(huì )快很多。
<?
// PHP Example
$link = mysql_connect("host", "user", "password")or die("mysql_error());
mysql_select_db("database") or die("Could not select database");
$query = "SELECT * FROM Table";
$result = mysql_query($query) or die(mysql_error());
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
foreach ($line as $col_value) {
//do something
}
}
?>
連接數據庫
對于數據庫的連接問(wèn)題,每種技術(shù)都表現出了各自突出的規范性。首先,每種情況都要建立到數據庫的連接。對于PHP,在建立之后選擇數據庫(對于A(yíng)SP以及ASP.NET則將在連接階段完成)。隨后將建立一個(gè)詢(xún)問(wèn),并將其傳送給數據庫,由此可能產(chǎn)生也可能不會(huì )產(chǎn)生一條返回記錄。
由于在本質(zhì)上ASP.NET更為以對象為導向,并且支持復雜的錯誤處理(error handling),因此無(wú)論是相對于PHP還是ASP,在完成簡(jiǎn)單任務(wù)方面ASP.NET可能會(huì )需要編寫(xiě)更多的代碼。但在優(yōu)勢方面,ASP.NET完成顯示數據功能所需要的代碼則大大少于PHP以及ASP――尤其如果使用內建的datagrid控制來(lái)自動(dòng)創(chuàng )建HTML輸出。
<%
‘ASP Example
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Driver={SQL Server};Server=MyServerName;" & _
"Database=myDatabaseName;Uid=;Pwd="
const strSQL = "SELECT * FROM Table" Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.OpenstrSQL, objConn
Do While Not objRS.EOF
‘do something
objRS.MoveNext
Loop
%>
‘ ASP.NET Example
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<html>
<script language="VB" runat="server">
Sub Page_Load(Sender As Object, E As EventArgs)
Dim MyConn As SqlConnection = New SqlConnection("server=(local). . . ")
Dim MyComm As SqlCommand = New SqlCommand("select * from Table", MyConn)
MyConn.Open()
Dim dr As SqlDataReader = MyComm.ExecuteReader()
MyDataGrid.DataSource = dr
MyDataGrid.DataBind()
MyConn.Close()
End Sub
</script>
<body>
<ASP:DataGrid id="MyDataGrid" runat="server"
Width="600"
BackColor="#FFFFFF"
BorderColor="#000000"
ShowFooter="false"
CellPadding=2
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#EEEEEE"
EnableViewState="false"
/>
</body>
</html>
結論
選擇ASP、PHP還是ASP.NET將最終取決于應用程序的需要,以及運行程序的系統環(huán)境。開(kāi)發(fā)人員對于相似編程語(yǔ)言或范例的熟悉程度同樣可以作為選擇的因素。記住沒(méi)有完美的方法和個(gè)人實(shí)際情況可以表明哪種技術(shù)是最佳選擇。比如,使用ASP.NET為一個(gè)Windows服務(wù)器創(chuàng )建一個(gè)單頁(yè)面的表單郵件應用程序似乎有些大材小用,但對于A(yíng)SP來(lái)說(shuō)這是極佳的應用環(huán)境。如果一個(gè)站點(diǎn)需要同Linux Apache服務(wù)器上的mySQL數據庫連接,那么使用ASP或者ASP.NET則會(huì )顯得力不從心。如果能夠提前詳細考慮用戶(hù)的個(gè)人要求,那么開(kāi)發(fā)人員在這些相互競爭的技術(shù)中進(jìn)行選擇的過(guò)程則已成功了一半。
聯(lián)系客服