首先ASP的(VBScript)類是由事件和方法(它們就是構成類的成員了)構成的!
在 Class 塊中,成員通過相應的聲明語句被聲明為 Private(私人成員,只能在類內部調用) 或 Public(公有成員,可以在類內外部調用) 。被聲明為 Private 的將只在 Class 塊內是可見的。被聲明為 Public 不僅在 Class 塊的內部是可見的,對 Class 塊之外的代碼也是可見的。沒有使用 Private 或 Public 明確聲明的被預設為 Public。在類的塊內部被聲明為 Public 的過程(Sub 或 Function)將成為類的方法。Public 變數將成為類的屬性,同使用 Property Get、Property Let 和 Property Set 顯式聲明的屬性一樣。類的預設屬性和方法是在它們的聲明部分用 Default 關鍵字指定的。
下面我們來看一個例子
<script language=vbscript runat=server>
Class myClass
'//----聲明(聲明就是定義)myClass類的類內部(私人的[Private])變數
Private strAuthor
Private strVersion
Private strExample
'//---------------------------定義類的事件-------------------------------//
'//----Class_Initialize()是類的初始化事件,只要一開始使用該類,首先會觸發該部分的執行,下面我們會在該成員中初始化該類的作者和版本以及在螢幕上顯示一下該類已經開始了
Private Sub Class_Initialize()
strAuthor = "思源"
strVersion = "1.0"
Response.Write "<br>myClass開始了<br>"
End Sub
'//----Class_Terminate()是類的結束事件,只要一退出該類,就會觸發該事件,下面我們會該事件中設定退出該類時會在螢幕上顯示該類已結束了。
Private Sub Class_Terminate()
Response.Write "<br>myClass結束了<br>"
End Sub
'//---------------------------使用者自己定義的方法-------------------------------//
'//----該方法返回一個版本資訊
Public Sub Information()
Response.Write "<br>Coding By <a href='mailtcoder@sinobe.com'>Maxid_Zen</a> @
<a href='http://www.design60s.com'>www.design60s.com</a>.<br>"
End Sub
'//---------------------------定義類的輸出屬性-------------------------------//
'//----定類的屬性,該屬性是讓使用者初始化strExapmle變數
Public Property Let setExapmle(ByVal strVar)
strExapmle = strVar
End Property
'//---------------------------定義類的輸出屬性-------------------------------//
'//----定義類的屬性,該屬性是返回一個版本號碼
Public Property Get Version
Version = strVersion
End Property
'//----定義類的屬性,該屬性是返回該類的作者號
Public Property Get Author
Author = strAuthor
End Property
'//----定義類的屬性,該屬性是返回一個版本號碼
Public Property Get Exapmle
Exapmle = strExapmle
End Property
End Class
</script>
<%
'//-------這裡是使用該類的例子
Dim oneNewClass
Set oneNewClass = New myClass
Response.Write "作者:" & oneNewClass.Author & "<br>"
Response.Write "版本:" & oneNewClass.Version & "<br>"
oneNewClass.setExapmle = "這是一個簡單類的例子"
Response.Write "使用者自訂:" & oneNewClass.Exapmle & "<br>"
oneNewClass.Information
Set oneNewClass = Nothing
%>
ASP中的Session本身是可以儲存對象的,它可以儲存基本變數,數組,Automation 物件(Automation Object)等,但在儲存自訂類的對象時會碰到問題。
如下面的代碼:
<%
If isempty(Session("node")) Then Set Session("node")=New ListNode
Set n=Session("node")
Response.Write n.Content
%>
還是上面的ListNode這個類,這段代碼意圖在一個使用者會話中只保留一個ListNode的對 象。所以在使用者第一次訪問該網頁時,會產生ListNode的一個對象,並儲存在Session("node")中;後面訪問該網頁時,因為 Session("node")不為空白了,所以不會產生一個新的對象,而是到 Session("node")中取出儲存的對象。
理論上應該也會輸出100,但是問題來了,ASP一直會報錯:
Microsoft VBScript runtime error '800a01b6'
Object doesn't support this property or method: 'n.Content'
用n.Type也會出錯。同樣的代碼翻譯成PHP,運行卻是可以通過的。為什嗎?
個人分析下來,認為Session可以儲存對象是沒錯,只是VBScript中類型轉換的機制太 弱,而且沒有顯式的強制類型轉換供使用者使用,無法將 Session("node")正確轉換為ListNode類型。因為是自訂的類,我們只能在每個頁面中都出現類的定義語句,這樣在ASP看來,每次讀 取這個頁面時,ListNode類都是一個新類,所以就不認得Session中的這個類的對象了。
結論:盡量不要想到用Session或Application來儲存ASP中自訂類的對象。如果 確實需要,可以考慮用COM來編寫類,然後在VBScript中用:Set Session("obj") = Server.CreateObject("YourApp.YourClass")來建立一個對象,然後即可實現上面預想的功能了。