??ASP は、Microsoft によって初期の段階で導入された動的 Web ページ プログラミング テクノロジですが、データベースへの便利で高速なアクセスを提供する ADO と、XML、COM/ActiveX などの他のテクノロジを組み合わせて、サーバーの多層構造により、現在でも強力な活力があり、一定の発展を遂げています。 ASP.Net はアーキテクチャにおいて ASP とはまったく異なりますが、その組み込みオブジェクトの多くも ASP に基づいて拡張されています。 ASP を紹介する記事はインターネット上に無数にありますが、ASP のオブジェクト指向を紹介し、他の言語と比較する記事は少ないため、この記事を書くことにしました。
??これは初期のバージョンであるため、ASP は非常に弱いオブジェクト指向インターフェイスしか提供しません。ご存知のとおり、ASP の実装言語は VBScript と JavaScript/JScript に分かれています。VBScript には、カスタム クラスを宣言するために使用できる Class キーワードがあります。JavaScript は奇妙で、「宣言」するために関数を使用します。クラス、次に関数内 ここで、プロパティは this.prototype を通じて定義され、メソッドは this.func を通じて定義されます。ここでは VBScript に焦点を当てて説明します。VBScript のクラス宣言は次のとおりです。
??クラス名
?? ステートメント
??エンドクラス
??ここのステートメントで、関数、メンバー、プロパティなどのパブリック メンバーまたはプライベート メンバーを宣言できます。属性に関しては、COM で登場したこの概念は .Net まで使用されていたため、プログラマにとっては Java よりも getProp() と setProp() を使用する方が良いと個人的には思います。同じ効果を 1 つの方法で実現する方がはるかに便利で直感的です。
??比較すると、VBScript のクラスは PHP4 のクラスとは異なります (もちろん、最新の PHP5 とは比較できません)。VBScript のクラスは、VB の不完全なオブジェクト指向の「機能」を維持しているだけです。 Basic 基本的なコンストラクター/デストラクター、メンバー関数、変数、プロパティ、さらにはコンストラクターでもパラメーターを取ることができません。 PHP4では、継承や関数のオーバーロードといったクラスの重要な性質も実現されており、これらが実現されて初めてオブジェクト指向と呼ばれ、ポリモーフィズムを実現する基盤となります。ただし、どちらもクラスの静的メンバーなどの関数を実装していません。他のいくつかの変更を使用して同じ効果を達成することもできますが、オブジェクト指向の観点から見ると、これは不完全です (PHP は非常に柔軟であるため、PHP4 では、クラスの静的変数はメンバー関数の静的変数を通じて間接的に実装できます)。 「 ::」 - クラスの静的関数アクセスを実装できる演算子 - PHP4 には厳密なチェックはありません。つまり、関数内でメンバー変数を使用しない限り、すべてのメンバー関数は静的関数としてアクセスできます。エラーはありません。VBScript は静的をまったく実装しておらず、セッションまたはアプリケーションを使用してのみ実装できます。したがって、通常の使用では、VBScript のカスタム クラスを使用して一部の操作をカプセル化できますが、C++/Java/.Net のようなオブジェクト指向のアイデアに役立つことは期待できません。
??VBScript は、デフォルトのパラメータまたは変数が参照であるという VB の優れたスタイルも促進します。このように、スクリプト言語は型に依存しませんが、C/C++ のポインター/参照と同じ効果を実現し、多くのことを実現できます。たとえば、最も基本的なものは、リストのノード クラス ListNode を定義するために使用します。
<%
クラスリストノード
公開コンテンツ
パブリック NextNode
プライベート サブ Class_Initialize()
コンテンツ = "ノード"
NextNode=Nothing を設定します
エンドサブ
終了クラス
%>
??はは、とても単純ですが、軽蔑せずに変数を初期化することを忘れないでください。 VBでも同様で、宣言時に型を追加するだけです。そして使用するとき:
<%
nh=新しいリストノードを設定します
nh.NextNode=new ListNode を設定します
「他の発言も…
'リストを横断する
n=nh に設定します
Not n は何もありません
Response.Write n.Content+"<br />"
n=n.NextNode を設定します
ウェン
%>
??他のコードを追加しない場合、上記の実行結果は 2 つの「ノード」になります。 VBScript のカスタム クラスとオブジェクトについても同じことが言えます。基本的な概念をマスターし、ある程度理解していれば、これほど簡単なことはありません。繰り返しますが、Set ステートメントを使用してオブジェクトに値を割り当てることは、Java での割り当て、つまり参照を取得することと同等です。これは、コピー コンストラクターを呼び出して新しいオブジェクトを作成する PHP4 のデフォルトのオブジェクト割り当てよりもはるかに優れています (obj=new Obj; のようなステートメントでも 2 つのオブジェクトが作成されます! 参照を取得したい場合は、変数を後ろに置く必要があります)等号の前に &) が表示されますが、PHP5 では PHP4 のこのアプローチを変更したくないようです。
??ASP のセッション自体は、基本的な変数、配列、オートメーション オブジェクト (オートメーション オブジェクト) などを保存できますが、カスタム クラスのオブジェクトを保存するときに問題が発生します。次のようなコードです。
<%
If isempty(Session("node")) then Set Session("node")=New ListNode
n=Session("ノード") を設定します。
応答.書き込みn.内容
%>
??上記の ListNode クラスと同様に、このコードはユーザー セッション内で 1 つの ListNode オブジェクトのみを保持することを目的としています。したがって、ユーザーが初めて Web ページにアクセスすると、ListNode のオブジェクトが生成され、Session ("node") に保存されます。その後、ユーザーが Web ページにアクセスすると、Session ("node") が空ではないため、Session ("node") に保存されます。新しいオブジェクトは生成されませんが、Session("node") から保存されたオブジェクトを取得します。理論的には 100 も出力されるはずですが、ここで問題が発生します。ASP はエラーを報告し続けます。
??Microsoft VBScript ランタイム エラー '800a01b6'
??オブジェクトはこのプロパティまたはメソッドをサポートしていません: 'n.Content'
??n.Type を使用するとエラーが発生します。同じコードが PHP に変換され、正常に実行されます。なぜ?
??個人的な分析の結果、Session がオブジェクトを保存できるのは正しいと思いますが、VBScript の型変換メカニズムは弱すぎ、ユーザーが使用できる明示的な強制的な型変換がないため、Session (「ノード」) は保存できません。 ListNode 型に正しく変換されました。これはカスタム クラスであるため、すべてのページにクラスの定義ステートメントしか含めることができません。このように、ASP の観点からは、このページが読み取られるたびに、ListNode クラスは新しいクラスになるため、そうはなりません。このクラスの Session オブジェクト内のクラスを認識します。
??結論: ASP にカスタム クラスのオブジェクトを格納するためにセッションまたはアプリケーションを使用しないようにしてください。本当に必要な場合は、COM を使用してクラスを作成し、VBScript で Set Session("obj") = Server.CreateObject("YourApp.YourClass") を使用してオブジェクトを作成することを検討できます。上記で想定されている機能。