ASP는 Microsoft가 초기 단계에 도입한 동적 웹 페이지 프로그래밍 기술이지만 데이터베이스에 대한 편리하고 빠른 액세스를 제공하는 ADO와 XML, COM/ActiveX 등과 같은 다른 기술을 결합하여 이를 실현하는 기능입니다. 서버의 다층 구조로 인해 오늘날에도 여전히 강력한 활력을 유지하고 있으며 여전히 발전하고 있습니다. ASP.Net은 아키텍처 측면에서 ASP와 완전히 다르지만 기본 제공 개체 중 상당수는 ASP를 기반으로 확장됩니다. 인터넷에 ASP를 소개하는 기사는 많지만 ASP 객체지향을 소개하고 다른 언어와 비교하는 기사는 거의 없습니다.
ASP는 초기 버전이기 때문에 객체지향 인터페이스가 매우 취약합니다. 우리 모두 알고 있듯이 ASP의 구현 언어는 VBScript와 JavaScript/JScript로 구분됩니다. VBScript에는 사용자 정의 클래스를 선언하는 데 사용할 수 있는 Class 키워드가 있습니다. JavaScript는 이상합니다. 함수를 사용하여 "선언"합니다. 클래스, 함수에서 속성은 this.prototype을 통해 정의되고, 메서드는 this.func를 통해 정의됩니다. 여기서의 논의는 VBScript에 중점을 둘 것입니다. VBScript의 클래스 선언은 다음과 같습니다.
??클래스 이름
?? 진술
??수업 종료
??함수, 멤버 및 속성을 포함하여 여기 문에서 공개 또는 비공개 멤버를 선언할 수 있습니다. 속성에 관해서는 Microsoft의 get 및 set 메소드를 칭찬해야 합니다. COM에 등장한 이 개념은 .Net까지 사용되었습니다. 개인적으로 프로그래머에게는 Java보다 getProp() 및 setProp()을 사용하는 것이 더 좋다고 생각합니다. 한 가지 방법으로 동일한 효과를 얻는 것이 훨씬 더 편리하고 직관적입니다.
이에 비해 VBScript의 클래스는 PHP4의 클래스와 다릅니다(물론 최신 PHP5와 비교할 수는 없습니다). VBScript의 클래스는 VB의 불완전한 객체 지향 "기능"만을 구현합니다. basic 기본 생성자/소멸자, 멤버 함수, 변수, 속성, 심지어 생성자도 매개 변수를 사용할 수 없습니다. PHP4에서는 상속, 함수 오버로딩 등 클래스의 중요한 속성도 구현된다. 이것이 구현되어야 객체지향이라 할 수 있고 다형성을 구현하는 기반을 제공할 수 있다. 그러나 둘 중 어느 것도 클래스의 정적 멤버와 같은 기능을 구현하지 않습니다. 동일한 효과를 얻기 위해 다른 수정을 사용할 수 있지만 객체 지향 관점에서 이것은 불완전합니다(PHP는 매우 유연하기 때문에 PHP4에서는 클래스의 정적 변수가 멤버 함수의 정적 변수를 통해 간접적으로 구현될 수 있습니다. " ::" - 클래스의 정적 함수 액세스를 구현할 수 있는 연산자 - PHP4에서는 엄격한 검사가 없습니다. 즉, 함수에서 멤버 변수를 사용하지 않는 한 모든 멤버 함수는 정적 함수로 액세스할 수 있습니다. 오류가 없습니다. VBScript는 정적을 전혀 구현하지 않으며 세션 또는 응용 프로그램을 통해서만 구현할 수 있습니다. 따라서 일반적인 사용에서는 VBScript의 사용자 정의 클래스를 사용하여 일부 작업을 캡슐화할 수 있지만 C++/Java/.Net과 같은 객체 지향 아이디어를 제공할 것이라고 기대하지는 마십시오.
VBScript는 또한 기본 매개변수나 변수가 참조되는 VB의 좋은 스타일을 장려합니다. 이런 방식으로 스크립트 언어는 유형을 구분하지 않지만 C/C++의 포인터/참조와 동일한 효과를 얻을 수 있으며 많은 작업을 수행할 수도 있습니다. 예를 들어, 가장 기본적인 것은 이를 사용하여 목록의 노드 클래스 ListNode를 정의합니다.
<%
클래스 목록노드
공개 콘텐츠
공개 NextNode
비공개 하위 클래스_Initialize()
콘텐츠="노드"
NextNode=아무것도 설정하지 않음
서브 끝
수업 종료
%>
??ㅎㅎ 간단하지만, 경멸하지 말고 변수 초기화도 잊지 마세요. VB에서도 비슷합니다. 선언할 때 유형을 추가하기만 하면 됩니다. 그리고 사용할 때:
<%
nh=new ListNode 설정
nh.NextNode=new ListNode 설정
'다른 진술...
'목록을 탐색
n=nh로 설정
Not n은 아무것도 아니지만
응답.쓰기 n.Content+"<br />"
n=n.NextNode 설정
향하게 하다
%>
??다른 코드를 추가하지 않으면 위의 실행 결과는 두 개의 "노드"입니다. VBScript의 사용자 정의 클래스와 개체도 마찬가지입니다. 기본 개념을 숙지하고 이에 대해 어느 정도 이해하고 있다면 이보다 더 쉬울 수는 없습니다. 다시 말하지만 Set 문을 사용하여 개체에 값을 할당하는 것은 참조를 얻는 Java의 할당과 동일합니다. 이는 새 객체를 생성하기 위해 복사 생성자를 호출하는 PHP4의 기본 객체 할당보다 훨씬 낫습니다(obj=new Obj;와 같은 명령문도 두 개의 객체를 생성합니다! 참조를 얻으려면 변수를 뒤에 넣어야 합니다). &) 앞에 등호가 표시되어 있으며 PHP5는 PHP4의 이러한 접근 방식을 수정하고 싶지 않은 것 같습니다.
ASP의 세션 자체는 기본 변수, 배열, 자동화 개체(자동화 개체) 등을 저장할 수 있지만 사용자 정의 클래스의 개체를 저장할 때 문제가 발생합니다. 다음 코드와 같습니다.
<%
비어 있는 경우(Session("node")) Session("node")=New ListNode를 설정합니다.
n=Session("노드") 설정
응답.쓰기 n.콘텐츠
%>
여전히 위의 ListNode 클래스이지만 이 코드는 사용자 세션에서 하나의 ListNode 개체만 유지하기 위한 것입니다. 따라서 사용자가 처음으로 웹페이지를 방문할 때 ListNode의 객체가 생성되어 세션("노드")에 저장됩니다. 세션("노드")이 비어 있지 않기 때문입니다. 새 개체를 생성하지 않지만 세션("노드")에서 저장된 개체를 검색합니다. 이론적으로는 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")를 사용하여 개체를 생성하는 것을 고려할 수 있습니다. 위에서 구상한 기능.