??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 كما يلي:
??اسم الفئة
تصريحات
??نهاية الطبقة
??يمكنك الإعلان عن الأعضاء العامين أو الخاصين في البيانات هنا، بما في ذلك الوظائف والأعضاء والخصائص. فيما يتعلق بالسمات، لا بد لي من الثناء على أساليب get and set الخاصة بشركة 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 للقائمة:
<%
عقدة قائمة الفئة
المحتوى العام
العقدة التالية العامة
فئة فرعية خاصة_Initialize()
المحتوى = "العقدة"
تعيين العقدة التالية = لا شيء
نهاية الفرعية
نهاية الفصل
%>
هاها، الأمر بهذه البساطة، لكن لا تشعر بالازدراء ولا تنس تهيئة المتغيرات. إنه مشابه في VB، فقط قم بإضافة النوع عند التصريح. وعند الاستخدام:
<%
Set nh=new ListNode
قم بتعيين nh.NextNode=new ListNode
"" تصريحات أخرى ...
'اجتياز القائمة
تعيين ن = ن ح
بينما ليس n لا شيء
Response.Write n.Content+"<br />"
تعيين n=n.NextNode
ويند
%>
??إذا لم تتم إضافة أي كود آخر، فإن نتيجة التشغيل أعلاه هي "عقدتان". الأمر نفسه ينطبق على فئات وكائنات VBScript المخصصة، طالما أنك تتقن المفاهيم الأساسية ولديك فهم معين لها، فلن يكون الأمر أسهل. مرة أخرى، استخدام عبارة Set لتعيين قيمة لكائن ما يعادل التعيين في Java، وهو الحصول على مرجع. هذا أفضل بكثير من تعيين الكائن الافتراضي في PHP4 والذي يستدعي مُنشئ النسخ لإنشاء كائن جديد (حتى عبارة مثل obj=new Obj; ستنشئ كائنين! إذا كنت تريد الحصول على مرجع، فيجب عليك وضع المتغير بعده علامة المساواة المعروضة مع &) قبلها، ويبدو أن PHP5 لا يريد تعديل هذا الأسلوب في PHP4.
يمكن للجلسة نفسها في ASP تخزين الكائنات، ويمكنها حفظ المتغيرات الأساسية والمصفوفات وكائنات الأتمتة (كائنات الأتمتة)، وما إلى ذلك، ولكنها ستواجه مشكلات عند تخزين كائنات من فئات مخصصة. مثل الكود التالي:
<%
إذا كانت فارغة (Session("node")) ثم قم بتعيين Session("node")=New ListNode
تعيين ن = جلسة ("عقدة")
الاستجابة.اكتب n.Content
%>
??لا تزال فئة ListNode أعلاه، يهدف هذا الرمز إلى الاحتفاظ بكائن ListNode واحد فقط في جلسة المستخدم. لذلك، عندما يزور المستخدم صفحة الويب لأول مرة، سيتم إنشاء كائن ListNode وحفظه في الجلسة ("العقدة")؛ عندما يزور المستخدم صفحة الويب لاحقًا، لأن الجلسة ("العقدة") ليست فارغة، فهي لن يتم إنشاء كائن جديد، ولكن سيتم استرداد الكائن المحفوظ من Session("node"). من الناحية النظرية، يجب أيضًا أن يكون الناتج 100، ولكن هنا تأتي المشكلة، حيث يستمر ASP في الإبلاغ عن خطأ:
خطأ في وقت تشغيل Microsoft VBScript '800a01b6'
؟؟الكائن لا يدعم هذه الخاصية أو الأسلوب: 'n.Content'
??استخدام n.Type سيؤدي أيضًا إلى حدوث أخطاء. تتم ترجمة نفس الرمز إلى PHP ويعمل بنجاح. لماذا؟
؟؟بعد التحليل الشخصي، أعتقد أنه من الصحيح أن الجلسة يمكنها حفظ الكائنات، ولكن آلية تحويل النوع في VBScript ضعيفة جدًا، ولا يوجد تحويل إجباري صريح للنوع ليستخدمه المستخدمون، لذلك لا يمكن تنفيذ الجلسة ("العقدة") تم تحويله بشكل صحيح إلى نوع ListNode. نظرًا لأنها فئة مخصصة، لا يمكننا الحصول إلا على بيان تعريف الفئة في كل صفحة، وبهذه الطريقة، من منظور ASP، في كل مرة تتم فيها قراءة هذه الصفحة، تكون فئة ListNode فئة جديدة، لذلك لا يتم ذلك. التعرف على الفئة في كائن الجلسة لهذه الفئة.
؟؟الخلاصة: حاول عدم استخدام الجلسة أو التطبيق لتخزين كائنات الفئات المخصصة في ASP. إذا كنت في حاجة إليها حقًا، فيمكنك التفكير في استخدام COM لكتابة الفصل، ثم استخدام: Set Session("obj") = Server.CreateObject("YourApp.YourClass") في VBScript لإنشاء كائن، ومن ثم يمكنك تحقيقه الوظائف الموضحة أعلاه.