??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 แนวคิดที่ปรากฏใน COM นี้ถูกนำมาใช้จนถึง .Net โดยส่วนตัวแล้วฉันคิดว่าสำหรับโปรแกรมเมอร์ควรใช้ getProp() และ setProp() มากกว่า Java สะดวกและใช้งานง่ายกว่ามากเพื่อให้ได้เอฟเฟกต์เดียวกันในทางเดียว
ในการเปรียบเทียบ คลาสใน VBScript นั้นแตกต่างจากคลาสใน PHP4 (แน่นอนว่าไม่สามารถเทียบเคียงได้กับ PHP5 ล่าสุด) คลาสใน VBScript จะรักษา "คุณสมบัติ" เชิงวัตถุที่ไม่สมบูรณ์ของ VB เท่านั้น ตัวสร้าง/ตัวทำลายพื้นฐานพื้นฐาน ฟังก์ชันสมาชิก ตัวแปร คุณสมบัติ และแม้แต่ตัวสร้างก็ไม่สามารถรับพารามิเตอร์ได้ ใน PHP4 คุณสมบัติที่สำคัญของคลาสเช่นการสืบทอดและฟังก์ชันโอเวอร์โหลดจะถูกรับรู้เช่นกัน เมื่อสิ่งเหล่านี้ถูกรับรู้เท่านั้นจึงจะเรียกว่าเชิงวัตถุได้ และจะสามารถเป็นพื้นฐานสำหรับการตระหนักถึงความหลากหลาย แต่ทั้งสองไม่ได้ใช้ฟังก์ชันต่างๆ เช่น สมาชิกแบบคงที่ของคลาส แม้ว่าการปรับเปลี่ยนอื่นๆ บางอย่างสามารถนำมาใช้เพื่อให้ได้ผลเช่นเดียวกัน จากมุมมองเชิงวัตถุ สิ่งนี้ยังไม่สมบูรณ์ (เนื่องจาก PHP มีความยืดหยุ่นสูง ใน PHP4 ตัวแปรคงที่ของคลาสสามารถนำไปใช้ทางอ้อมผ่านตัวแปรคงที่ของฟังก์ชันสมาชิก และ " ::" - ตัวดำเนินการที่สามารถเข้าถึงฟังก์ชันคงที่ของคลาสได้ - ไม่มีการตรวจสอบที่เข้มงวดใน PHP4 กล่าวอีกนัยหนึ่ง ฟังก์ชันสมาชิกทั้งหมดสามารถเข้าถึงได้เป็นฟังก์ชันคงที่ ตราบใดที่คุณไม่ได้ใช้ตัวแปรสมาชิกในฟังก์ชัน ไม่มีข้อผิดพลาด VBScript ไม่ได้ใช้แบบคงที่เลยและสามารถใช้งานได้โดยใช้เซสชันหรือแอปพลิเคชันเท่านั้น) ดังนั้นในการใช้งานปกติ คุณสามารถใช้คลาสที่กำหนดเองของ VBScript เพื่อสรุปการดำเนินการบางอย่างได้ แต่อย่าคาดหวังว่ามันจะรองรับแนวคิดเชิงวัตถุของคุณ เช่น C++/Java/.Net
??VBScript ยังส่งเสริมรูปแบบที่ดีใน VB ที่พารามิเตอร์หรือตัวแปรเริ่มต้นมีการอ้างอิง ด้วยวิธีนี้ แม้ว่าภาษาสคริปต์จะไม่ไวต่อการพิมพ์ แต่ก็สามารถบรรลุผลแบบเดียวกันของพอยน์เตอร์/การอ้างอิงใน C/C++ และบรรลุผลสำเร็จหลายๆ อย่างได้ ตัวอย่างพื้นฐานที่สุด ใช้เพื่อกำหนดคลาสโหนด ListNode ของรายการ:
-
คลาสลิสต์โหนด
เนื้อหาสาธารณะ
สาธารณะ NextNode
ส่วนตัวย่อย Class_Initialize()
เนื้อหา = "โหนด"
ตั้งค่า NextNode=ไม่มีอะไร
จบหมวดย่อย
จบคลาส
-
??555 ง่ายๆ ขนาดนั้น แต่อย่าดูถูก และอย่าลืมกำหนดค่าเริ่มต้นให้กับตัวแปรด้วย มันคล้ายกันใน VB เพียงเพิ่มประเภทเมื่อประกาศ และเมื่อใช้:
-
ตั้งค่า nh=ListNode ใหม่
ตั้งค่า nh.NextNode=new ListNode
'ข้อความอื่นๆ...
'สำรวจรายการ
ตั้งค่า n=nh
ในขณะที่ไม่ใช่ n ก็ไม่มีอะไร
Response.Write n.Content+"<br />"
ตั้งค่า n=n.NextNode
เวนด์
-
??หากไม่มีการเพิ่มโค้ดอื่น ผลการรันด้านบนจะเป็น "โหนด" สองอัน เช่นเดียวกับคลาสและอ็อบเจ็กต์ที่กำหนดเองของ VBScript ตราบใดที่คุณเชี่ยวชาญแนวคิดพื้นฐานและมีความเข้าใจบางอย่าง มันก็ไม่มีอะไรง่ายไปกว่านี้อีกแล้ว ขอย้ำอีกครั้งว่า การใช้คำสั่ง Set เพื่อกำหนดค่าให้กับอ็อบเจ็กต์จะเทียบเท่ากับการกำหนดใน Java ซึ่งก็คือการรับข้อมูลอ้างอิง สิ่งนี้ดีกว่าการกำหนดอ็อบเจ็กต์เริ่มต้นใน PHP4 มาก ซึ่งเรียกใช้ตัวสร้างการคัดลอกเพื่อสร้างอ็อบเจ็กต์ใหม่ (แม้แต่คำสั่งเช่น obj=new Obj; จะสร้างสองอ็อบเจ็กต์! หากคุณต้องการรับข้อมูลอ้างอิง คุณต้องใส่ตัวแปรไว้หลัง เครื่องหมายเท่ากับแสดงด้วย &) ก่อนหน้า และดูเหมือนว่า PHP5 ไม่ต้องการแก้ไขแนวทางของ PHP4 นี้
??เซสชันใน ASP สามารถจัดเก็บอ็อบเจ็กต์ได้ โดยสามารถบันทึกตัวแปรพื้นฐาน, อาร์เรย์, อ็อบเจ็กต์อัตโนมัติ (ออบเจ็กต์อัตโนมัติ) ฯลฯ แต่จะประสบปัญหาเมื่อจัดเก็บอ็อบเจ็กต์ของคลาสแบบกำหนดเอง เช่นรหัสต่อไปนี้:
-
ถ้า isempty(Session("node")) ให้ Set Session("node")=New ListNode
ตั้งค่า n=เซสชัน("โหนด")
การตอบสนองเขียน n.เนื้อหา
-
??ยังคงเป็นคลาส ListNode ข้างต้น รหัสนี้มีวัตถุประสงค์เพื่อเก็บวัตถุ ListNode เดียวเท่านั้นในเซสชันผู้ใช้ ดังนั้นเมื่อผู้ใช้เยี่ยมชมเว็บเพจเป็นครั้งแรก ออบเจ็กต์ของ ListNode จะถูกสร้างขึ้นและบันทึกในเซสชัน ("โหนด") เมื่อผู้ใช้เยี่ยมชมหน้าเว็บในภายหลัง เนื่องจากเซสชัน ("โหนด") ไม่ว่างเปล่า จะไม่สร้างวัตถุใหม่ แต่ดึงวัตถุที่บันทึกไว้จากเซสชัน ("โหนด") ตามทฤษฎีแล้ว 100 ควรเป็นเอาต์พุตด้วย แต่ปัญหาเกิดขึ้น ASP ยังคงรายงานข้อผิดพลาดต่อไป:
??ข้อผิดพลาดรันไทม์ Microsoft VBScript '800a01b6'
??Object ไม่รองรับคุณสมบัติหรือเมธอดนี้: 'n.Content'
??การใช้ n.Type จะทำให้เกิดข้อผิดพลาดด้วย รหัสเดียวกันนี้ถูกแปลเป็น PHP และทำงานได้สำเร็จ ทำไม
??หลังจากวิเคราะห์ส่วนตัวแล้ว ฉันคิดว่ามันถูกต้องแล้วที่ Session สามารถบันทึกอ็อบเจ็กต์ได้ แต่กลไกการแปลงประเภทใน VBScript นั้นอ่อนแอเกินไป และไม่มีการบังคับให้ผู้ใช้แปลงประเภทอย่างชัดเจน ดังนั้น Session ("node") จึงไม่สามารถ แปลงเป็นประเภท ListNode อย่างถูกต้อง เนื่องจากเป็นคลาสแบบกำหนดเอง เราจึงสามารถมีได้เฉพาะคำสั่งคำจำกัดความของคลาสในทุกเพจ ด้วยวิธีนี้ จากมุมมองของ ASP ทุกครั้งที่อ่านเพจนี้ คลาส ListNode จะเป็นคลาสใหม่ ดังนั้นจึงไม่มี รู้จักคลาสในวัตถุเซสชันของคลาสนี้
??สรุป: พยายามอย่าใช้เซสชันหรือแอปพลิเคชันเพื่อจัดเก็บอ็อบเจ็กต์ของคลาสแบบกำหนดเองใน ASP หากคุณต้องการมันจริงๆ คุณสามารถลองใช้ COM เพื่อเขียนคลาส จากนั้นใช้: Set Session("obj") = Server.CreateObject("YourApp.YourClass") ใน VBScript เพื่อสร้างอ็อบเจ็กต์ จากนั้นคุณก็สามารถทำได้ ฟังก์ชั่นที่จินตนาการไว้ข้างต้น