ASP面向?qū)ο缶幊烫接懠氨容^
asp是microsoft于較早期推出的動態(tài)網(wǎng)頁編程技術(shù),但其結(jié)合ado對數(shù)據(jù)庫方便快捷的訪問、結(jié)合xml、com/activex等其它技術(shù) 實現(xiàn)服務(wù)器多層結(jié)構(gòu)的功能使它在今天還有著頑強的生命力,并且依然有著一定的發(fā)展。asp.net雖然在架構(gòu)上完全不同于asp,但它很多內(nèi)建對象也是基 于asp進行擴展的。網(wǎng)上有無數(shù)的介紹asp的文章,卻鮮有介紹asp面向?qū)ο笠约芭c其它語言比較的,這也就是我下決心寫這篇文章的原因。
因為是早期的版本,asp只提供了很弱的面向?qū)ο蟮慕涌?。眾所周知,asp的實現(xiàn)語言分為vbscript和javascript/jscript: 在vbscript中有class關(guān)鍵字,可以用來聲明一個自定義類;javascript就比較怪,它用一個函數(shù)來“聲明”類,然后在該函數(shù)里通過 this.prototype定義屬性,this.func定義方法。這里將以vbscript為主進行討論,vbscript的類聲明是這樣的:
class name
statements
end class
這里statements里可以聲明公有或私有的成員,包括函數(shù)、成員和屬性。關(guān)于屬性,不得不贊一下微軟的get和set方法,這個在com中出現(xiàn) 的理念,直到.net中一直被沿用下來,個人認為對程序員而言,比java用getprop()、setprop()兩個方法來實現(xiàn)同樣效果要方便直觀得 多。
相比之下,vbscript中的類與php4中的類各有千秋(當然跟最新的php5沒法比),vbscript中的類保持了vb的不完全面向?qū)ο蟮?nbsp;“特性”,它僅僅實現(xiàn)了最基本的構(gòu)造/析構(gòu)函數(shù)、成員函數(shù)、變量、屬性,甚至構(gòu)造函數(shù)不能帶參數(shù)。php4中則還實現(xiàn)了繼承、函數(shù)重載等類的重要性質(zhì),也 只有實現(xiàn)了這些,才能稱之為面向?qū)ο?,才有可能為實現(xiàn)多態(tài)提供基礎(chǔ)。但二者均沒有實現(xiàn)類的靜態(tài)(static)成員等功能。盡管可以用其它一些變通達到同 樣的功效,但從面向?qū)ο蟮乃枷氤霭l(fā),這都是不徹底的(由于php非常靈活,php4中可以通過成員函數(shù)的靜態(tài)變量來間接實現(xiàn)類的靜態(tài)變量;而“::”—— 可以實現(xiàn)類的靜態(tài)函數(shù)訪問的操作符——在php4中沒有嚴格檢查。換句話說,所有的成員函數(shù)都可以當成靜態(tài)函數(shù)訪問,只要你在該函數(shù)里不使用成員變量就不 會出錯。vbscript根本沒有實現(xiàn)static,只能用session或application來實現(xiàn))。所以在平常的使用中,你可以使用 vbscript的自定義類來封裝一些操作,但不要指望它像c++ / java / .net那樣為你的面向?qū)ο笏枷敕?wù)。
vbscript同樣發(fā)揚了vb中默認的參數(shù)或變量是引用的好風(fēng)格。這樣,盡管script語言中對類型不敏感,但它還能夠達到c/c++里指針/引用同樣的功效,完成很多事情。最基本的,比如說用它定義一個列表(list)的節(jié)點類listnode:
<%
class listnode
public content
public nextnode
private sub class_initialize()
content="node"
set nextnode=nothing
end sub
end class
%>
呵呵,就這么簡單,但不要感到鄙夷,也不要忘記對變量初始值。vb中也差不多,聲明時加上類型就行了。而使用時:
<%
set nh=new listnode
set nh.nextnode=new listnode
'其它語句……
'遍歷列表
set n=nh
while not n is nothing
response.write n.content+"
"
set n=n.nextnode
wend
%>
如果不加其它代碼,上面的運行結(jié)果是兩個“node”。vbscript的自定義類和對象也不外如是,只要你掌握基本的概念,對它有一定了解,就再簡單不過了。再次強調(diào),用set語句來對對象進行賦值,相當于java里的賦值,都是獲得一個引用。這比php4里默認對象賦值是調(diào)用拷貝構(gòu)造函數(shù)來創(chuàng)建一 個新的對象好多了(甚至連obj=new obj;這樣的語句都會創(chuàng)建兩個對象!如果你想獲得引用的話,要在等號后變量前顯示地加上&),而似乎php5也不想修改php4的這種做法。
asp中的session本身是可以儲存對象的,它可以保存基本變量,數(shù)組,自動化對象(automation object)等,但在儲存自定義類的對象時會碰到問題。如下面的代碼:
<%
if isempty(session("node")) then set session("node")=new listnode
set n=session("node")
response.write n.content
%>
還是上面的listnode這個類,這段代碼意圖在一個用戶會話中只保留一個listnode的對象。所以在用戶第一次訪問該網(wǎng)頁時,會生成listnode的一個對象,并保存在session(“node”)中;后面訪問該網(wǎng)頁時,因為session(“node”)不為空了,所以不會生成一個新的對象,而是到 session(“node”)中取出保存的對象。理論上應(yīng)該也會輸出100,但是問題來了,asp一直會報錯:
microsoft vbscript runtime error '800a01b6'
object doesn't support this property or method: 'n.content'
用n.type也會出錯。同樣的代碼翻譯成php,運行卻是可以通過的。為什么?
個人分析下來,認為session可以保存對象是沒錯,只是vbscript中類型轉(zhuǎn)換的機制太弱,而且沒有顯式的強制類型轉(zhuǎn)換供用戶使用,無法將 session(“node”)正確轉(zhuǎn)換為listnode類型。因為是自定義的類,我們只能在每個頁面中都出現(xiàn)類的定義語句,這樣在asp看來,每次讀 取這個頁面時,listnode類都是一個新類,所以就不認得session中的這個類的對象了。
結(jié)論:盡量不要想到用session或application來存儲asp中自定義類的對象。如果確實需要,可以考慮用com來編寫類,然后在vbscript中用:set session("obj") = server.createobject("yourapp.yourclass")來創(chuàng)建一個對象,然后即可實現(xiàn)上面預(yù)想的功能了。
相關(guān)文章
- ASP怎么談到應(yīng)用到類的?
- 檢測函數(shù) asp class
- 遭遇ASP類的事件設(shè)計
- ASP高亮類
- Object對象的一些的隱藏函數(shù)介紹
- 淺談ASP中的類
- 在VBScript中使用類
- ASP 類專題
- 代碼與頁面的分離
- ASP代碼的對象化
- 一個asp快速字符串連接類
- 一個簡單的asp數(shù)據(jù)庫操作類
- ASP類編寫詳細說明
- 實現(xiàn)支持邏輯搜索/單詞搜索/詞組搜索+支持OR/AND關(guān)鍵字的VBS CLASS!
- ASP類Class入門 推薦
- 創(chuàng)建一個ASP通用分頁類
- 如何編寫一個ASP類
- 一個ACCESS數(shù)據(jù)庫訪問的類第1/3頁
- 分頁類,異常類
- ASP 類 Class入門