الملخص: يعرض لنا المؤلف في هذه المقالة العديد من تقنيات OOP المتقدمة في لغة PHP من خلال أمثلة تعتمد على فهمه لمفاهيم OOP، وكما قال المؤلف، "الخيال هو القيد الوحيد،
إذا كنت تفهم مفاهيم OOP الأساسية، فأنا أنت
".سيتم عرض تقنيات أكثر تقدما.
التسلسل (التسلسل)
لا يدعم PHP الكائنات المستمرة. في OOP، الكائن المستمر هو كائن يمكنه الحفاظ على الحالة والوظيفة بين المراجع في تطبيقات متعددة، وهذا يعني القدرة على حفظ الكائن في ملف أو قاعدة بيانات، وتحميل ملف كائن في وقت لاحق. هذه هي ما يسمى بآلية التسلسل. لدى PHP طريقة تسلسل يمكن استدعاؤها على كائن، ويمكن لطريقة التسلسل إرجاع تمثيل سلسلة للكائن. ومع ذلك، يقوم التسلسل بحفظ بيانات عضو الكائن فقط وليس الأساليب.
في PHP4، إذا قمت بإجراء تسلسل للكائن في السلسلة $s، ثم حررت الكائن، ثم قمت بإلغاء تسلسل الكائن إلى $obj، فيمكنك الاستمرار في استخدام أساليب الكائن! لا أوصي بالقيام بذلك لأنه (أ) لا يوجد ضمان في الوثائق بأن هذا السلوك سيظل يعمل في الإصدارات المستقبلية. (ب) قد يؤدي هذا إلى سوء فهم عند حفظ نسخة متسلسلة على القرص والخروج من البرنامج النصي. عند تشغيل هذا البرنامج النصي لاحقًا، لا يمكنك توقع أنه عند إلغاء تسلسل كائن ما، ستكون أساليب الكائن موجودة، لأن تمثيل السلسلة لا يتضمن الأساليب على الإطلاق.
بشكل عام، التسلسل في PHP مفيد جدًا لحفظ متغيرات الأعضاء في الكائن. (يمكنك أيضًا إجراء تسلسل للصفائف والمصفوفات ذات الصلة في ملف).
مثال:
<?php
$obj=new Classfoo();
$str=serialize($obj);
// احفظ $str على القرص
// بعد بضعة أشهر
// قم بتحميل str من القرص
$obj2=إلغاء التسلسل($str)
لقد قمت باستعادة بيانات العضو، ولكن ليس الطرق (وفقًا للوثائق). يؤدي هذا إلى الطريقة الوحيدة للوصول إلى متغيرات الأعضاء (ليس لديك طريقة أخرى!) عن طريق شيء مثل استخدام $obj2->x، لذا لا تجرب ذلك في المنزل.
هناك بعض الطرق لحل هذه المشكلة، سأتركها جانبًا لأنها سيئة للغاية بالنسبة لهذه المقالة الموجزة. يسعدني أن أرحب بالميزات المتسلسلة بالكامل في الإصدارات اللاحقة من PHP.
استخدام الفئات لتخزين البيانات أحد الأشياء الرائعة في PHP وOOP هو أنه يمكنك بسهولة تحديد فئة للقيام بشيء ما واستدعاء الفئة المقابلة متى أردت استخدامها. لنفترض أن لديك نموذج HTML يسمح للمستخدم بتحديد منتج عن طريق تحديد رقم معرف المنتج. توجد معلومات المنتج في قاعدة البيانات، وتريد عرض المنتج وسعره وما إلى ذلك. لديك أنواع مختلفة من المنتجات، ويمكن أن يعني الإجراء نفسه أشياء مختلفة لمنتجات مختلفة. على سبيل المثال، قد يعني عرض الصوت تشغيله، ولكن بالنسبة لأنواع أخرى من المنتجات، قد يعني ذلك عرض صورة مخزنة في قاعدة بيانات. يمكنك استخدام OOP أو PHP لتقليل الترميز وتحسين الجودة.
حدد فئة المنتج، وحدد الطرق التي يجب أن تكون بها (على سبيل المثال: العرض)، ثم حدد فئة لكل نوع من المنتجات، مشتقة من فئة المنتج (فئة SoundItem، فئة ViewableItem، وما إلى ذلك)، والتي تغطي طرق المنتجات في فصول لجعلهم يتصرفون كما تريد.
قم بتسمية الفئة وفقًا لحقل النوع لكل منتج في قاعدة البيانات. قد يحتوي جدول المنتج النموذجي على حقول (المعرف والنوع والسعر والوصف وما إلى ذلك)... ثم في البرنامج النصي للمعالجة، يمكنك استرجاعه من قاعدة البيانات. احصل على قيمة النوع من ، ثم قم بإنشاء كائن يسمى النوع:
<?php
$obj=new $type();
$obj->action();
هذه ميزة جيدة جدًا في PHP. يمكنك استدعاء طريقة العرض أو طرق أخرى لـ $obj دون النظر إلى نوع الكائن. باستخدام هذه التقنية، لا تحتاج إلى تعديل البرنامج النصي لإضافة نوع جديد من الكائنات، بل تحتاج فقط إلى فئة للتعامل معه.
هذه الوظيفة قوية جدًا. ما عليك سوى تحديد الأساليب دون النظر في أنواع جميع الكائنات، وتنفيذها في فئات مختلفة بطرق مختلفة، ثم استخدامها في البرنامج النصي الرئيسي لأي كائن، لا إذا... وإلا، فلا يتطلب الأمر مبرمجين، سعيد فقط.
هل توافق الآن على أن البرمجة سهلة، والصيانة رخيصة، وإمكانية إعادة الاستخدام صحيحة؟
إذا كنت تدير مجموعة من المبرمجين، فإن تعيين العمل يكون أمرًا بسيطًا؛ فقد يكون كل شخص مسؤولاً عن نوع الكائن والفئة التي تتعامل معه.
يمكن تحقيق التدويل من خلال هذه التقنية، فقط قم بتطبيق الفصل المقابل وفقًا لحقل اللغة الذي حدده المستخدم، وما إلى ذلك.
النسخ والاستنساخ
عند إنشاء كائن $obj، يمكنك نسخ الكائن بواسطة $obj2=$obj. الكائن الجديد هو نسخة (وليس مرجعًا) من $obj، لذا فهو يتمتع بحالة $obj في ذلك الوقت . في بعض الأحيان، لا ترغب في القيام بذلك، بل تريد فقط إنشاء كائن جديد مثل فئة obj. يمكنك استدعاء مُنشئ الفئة باستخدام العبارة الجديدة. ويمكن تحقيق ذلك أيضًا في PHP من خلال التسلسل والفئة الأساسية، ولكن يجب أن تكون جميع الفئات الأخرى مشتقة من الفئة الأساسية.
الدخول إلى منطقة الخطر
عند إجراء تسلسل لكائن ما، تحصل على سلسلة بتنسيق ما، والتي يمكنك استجوابها إذا كنت مهتمًا، حيث يوجد في السلسلة اسم الفئة (رائع!) ويمكنك وضعها يتم إخراجها مثل:
<?php
$herring=serialize($obj);
$vec=explode(':',$herring)
;
على
التوسع من الكون، يمكنك تحديد طريقة استنساخ في الكون، على النحو التالي:
<?php
function clone() {
$herring=serialize($ this);
تفجير(':',$herring);
$nam=str_replace(""",'',$vec[2]);
$ret=new $nam;
return $ret;
}
}
// ثم
$obj=new Something();
// توسيع من الكون
$other=$obj->clone();
ما تحصل عليه هو كائن فئة شيء جديد، وهو نفس الكائن الذي تم إنشاؤه باستخدام الطريقة الجديدة واستدعاء المُنشئ. لا أعرف ما إذا كان هذا سيعمل بالنسبة لك، ولكن من القواعد الأساسية الجيدة أن تعرف فئة الكون اسم الفئة المشتقة. الخيال هو الحد الوحيد.
هذا البيان يكتب الوقت الحالي.