數組
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}
與其他變量一樣,visual basic .net 數組中的變量也是使用 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"))
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 框架通過一種人們所熟悉的語言構造 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:[email protected]/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>
在 php 中,查詢結果存儲在一個稱為 result set(結果集)的變量中,而在 ado.net 中,該變量稱為 dataset 對象。結果集是返回數據的只讀視圖,而 .net dataset 實際上是返回數據在內存中的讀寫視圖,這使 .net 開發人員能夠輕松地處理從數據源返回的數據。
輸出數據時,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 分鐘后過期。過期后的項目將從緩存中刪除,以后再試圖檢索該項目時,將返回空值(除非再次將其插入到緩存中)。
清理類型的緩存會在內存不足時嘗試刪除不經常使用或不重要的項目。開發人員可以控制清理的執行方式,并且可以在將項目插入到緩存中時向清理程序提供提示,以指示創建該項目的相對系統開銷以及為使該項目有效而必須對其進行訪問的相對頻率。
文件和關鍵項相關性類型的緩存將基于某個外部文件或另一個緩存項目確定該緩存項目的有效性。如果相關項發生變化,緩存項目將失效并從緩存中刪除。例如,假設您有一個較大的需要定期更新并下載給員工的報告,則可以在應用程序中使用此功能。應用程序處理文件和報告中的數據,然后緩存該數據并插入對該數據的來源文件(從該文件讀取數據)的相關性。當該文件更新時,數據將從緩存中刪除,應用程序可以重新讀取它并重新插入更新的數據副本。
asp.net 數據緩存為編程人員提供了許多不同的方法來管理應用程序并提高應用程序的響應速度和效率。有關詳細信息,請參閱 cache class 文檔以了解 cache 對象。
發送電子郵件
php 和 asp.net 都為以編程方式發送電子郵件提供了內置的支持。要在此示例中使用 asp.net 發送電子郵件,您需要設置 iis smtp 服務。因為 .net 中的內置郵件對象依賴于該服務包含的對象,所以您必須安裝它。盡管如此,與 php 一樣,.net 也允許您使用任何 smtp 服務器或郵件服務器。表 14 對這兩種環境的基本語法進行了比較。
表 14:發送電子郵件
php visual basic .net
$to = "[email protected]";
$from =
"[email protected]";
$subject = "hi";
$message = "just wanted to say
hi";
mail($to,$subject,$message,
$from)
dim mymail as mailmessage = new
mailmessage()
mymail.from = "[email protected]"
mymail.to = "[email protected]"
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 相比,這些功能可以顯著減少完成相同任務所需的代碼數量。
新聞熱點
疑難解答
圖片精選