تم تعديل الكائنات في PHP5 بشكل أكثر منهجية وشمولية، وقد يبدو مظهرها الحالي مشابهًا إلى حد ما لـ Java. يركز هذا القسم على وضع الكائن الجديد في PHP5 ويقدم بعض الأمثلة الأبسط للتوضيح. دع هذا القسم يكون نقطة بداية جديدة لرحلة PHP5 الخاصة بك. :)
* المنشئ والمدمر
* مرجع الكائن
* استنساخ الكائن
* الأوضاع الخاصة والعامة والمحمية في الكائنات
* واجهات
* فئة مجردة
* __يتصل
* __مجموعة و __الحصول على
* أعضاء ثابتة
المنشئ والمدمر
في PHP4، عندما يكون للدالة نفس اسم الكائن، ستصبح هذه الوظيفة هي منشئ الكائن، ولا يوجد مفهوم المدمر في PHP4.
في PHP5، يُسمى المُنشئ بشكل موحد __construct، ويتم تقديم مفهوم المدمر، والذي يُسمى بشكل موحد __destruct.
مثال 1: المنشئ والمدمر
فئة فو {
فار $x;
وظيفة __بناء($x) {
$this->x = $x;
}
عرض الوظيفة () {
طباعة($هذا->x);
}
وظيفة __تدمير () {
طباعة ("وداعا")؛
}
}
$o1 = جديد foo(4);
$o1->display();
?>
في المثال أعلاه، عند إنهاء استدعاء الفئة foo، سيتم استدعاء أداة التدمير الخاصة بها، وسيتم إخراج "bye bye" في المثال أعلاه.
فإن مراجع الكائنات
، في PHP4، تمرير متغير إلى دالة أو طريقة يؤدي في الواقع إلى إنشاء نسخة من المتغير، مما يعني أن ما تمرره إلى الوظيفة أو الطريقة هو نسخة من المتغير، إلا إذا كنت تستخدم مرجعًا يُستخدم الرمز "&" للإعلان عن ضرورة عمل مرجع وليس نسخة. في PHP5، الكائنات موجودة دائمًا في شكل مراجع، وعمليات الإسناد في الكائنات هي أيضًا عمليات مرجعية.
المثال 2: مرجع الكائن
فئة فو {
فار $x;
الدالة سيتكس($x) {
$this->x = $x;
}
وظيفة getX () {
إرجاع $this->x;
}
}
$o1 = جديد فو؛
$o1->setX(4);
$o2 = $o1;
$o1->setX(5);
if($o1->getX() == $o2->getX()) print("يا إلهي!");
?>
استنساخ الكائن
كما ذكرنا أعلاه، عندما يتم استدعاء كائن دائمًا في شكل مرجع، ماذا علي أن أفعل إذا كنت أرغب في الحصول على نسخة من الكائن؟ يوفر PHP5 وظيفة جديدة، وهي استنساخ الكائنات، وبناء الجملة هو __clone.
مثال 3: استنساخ الكائنات
فئة فو {
فار $x;
الدالة سيتكس($x) {
$this->x = $x;
}
وظيفة getX () {
إرجاع $this->x;
}
}
$o1 = جديد فو؛
$o1->setX(4);
$o2 = $o1->__clone();
$o1->setX(5); if($o1->getX() != $o2->getX()) print("النسخ مستقلة");
?>
توجد طرق استنساخ الكائنات في العديد من لغات التطبيقات الأخرى، لذلك لا داعي للقلق بشأن استقرارها. :)
الأوضاع الخاصة والعامة والمحمية في الكائنات
في PHP4، تكون جميع الأساليب والمتغيرات الخاصة بالكائن عامة، مما يعني أنه يمكنك تشغيل أي من المتغيرات والأساليب خارج الكائن. يقدم PHP5 ثلاثة أوضاع جديدة للتحكم في إذن الوصول هذا: عام، ومحمي، وخاص.
الوضع العام (عام): يسمح بالتحكم في التشغيل خارج الكائن.
الوضع الخاص (خاص): يُسمح فقط للطرق الموجودة داخل هذا الكائن بتشغيله والتحكم فيه.
الوضع المحمي (محمي): يسمح لهذا الكائن والكائن الأصلي الخاص به بتشغيله والتحكم فيه.
مثال 4: الأوضاع الخاصة والعامة والمحمية في الكائنات
فئة فو {
خاص $x;
الوظيفة العامة public_foo() {
طباعة("أنا عام");
}
وظيفة محمية protected_foo() {
$this->private_foo(); // حسنًا، يمكننا استدعاء الأساليب الخاصة لأننا في نفس الفصل
طباعة("أنا محمي");
}
وظيفة خاصة public_foo() {
$هذا->x = 3;
طباعة("أنا خاص");
}
}
الطبقة foo2 تمتد foo {
عرض الوظيفة العامة () {
$this->protected_foo();
$this->public_foo();
// $this->private_foo(); // الوظيفة خاصة في الفئة الأساسية
}
} $x = new foo();
$x->public_foo();
//$x->protected_foo(); // غير صالح لا يمكن استدعاء الأساليب المحمية خارج الفئة والفئات المشتقة
//$x->private_foo(); // لا يمكن استخدام الأساليب الخاصة غير الصالحة إلا داخل الفصل $x2 = new foo2();
$x2->display();
?>
نصيحة: المتغيرات في الكائنات موجودة دائمًا في شكل خاص. لا يعد تشغيل المتغيرات بشكل مباشر في كائن ما عادة جيدة للبرمجة الموجهة للكائنات.
الواجهات
كما نعلم جميعًا، تدعم الكائنات في PHP4 الوراثة لجعل كائن فئة مشتقة من كائن آخر، تحتاج إلى استخدام كود مشابه لـ "class foo Extendsparent" للتحكم فيه. في PHP4 وPHP5، يمكن وراثة الكائن مرة واحدة فقط، ولا يتم دعم الوراثة المتعددة. ومع ذلك، فقد ولد مصطلح جديد في PHP5: الواجهة هي كائن خاص بدون تعليمات برمجية محددة للمعالجة، وهي تحدد فقط أسماء ومعلمات بعض الأساليب، وبعد ذلك يمكن استخدام الكائن بسهولة مع الكلمة الأساسية "تنفيذ". يتم دمج الواجهات المطلوبة ومن ثم يتم إضافة كود التنفيذ المحدد.
مثال 5: الواجهة
واجهة قابلة للعرض {
عرض الوظيفة () ؛
}
واجهة قابلة للطباعة {
وظيفة دوبرينت ()؛
}
فئة foo تنفذ قابلة للعرض، قابلة للطباعة {
عرض الوظيفة () {
// شفرة
} وظيفة دوبرينت () {
// شفرة
}
}
?>
وهذا مفيد جدًا لتحسين إمكانية قراءة الكود وشعبيته، من المثال أعلاه، يمكننا أن نرى أن الكائن foo يحتوي على واجهتين، قابلة للعرض وقابلة للطباعة. في هذا الوقت، يمكننا أن نعرف بوضوح أن الكائن foo يجب أن يحتوي على شاشة () وطريقة print ()، ما عليك سوى فهم جزء الواجهة، ويمكنك تشغيل الكائن بسهولة دون الحاجة إلى الاهتمام بكيفية عمل الكائن داخليًا.
لا يمكن إنشاء مثيل للفئات المجردة
.
تسمح الفئات المجردة، مثل الفئات الأخرى، بتعريف المتغيرات والأساليب.
يمكن للفئة المجردة أيضًا تحديد طريقة مجردة. لن يتم تنفيذ طريقة الفئة المجردة، ولكن يمكن تنفيذها في فئتها المشتقة.
مثال 6: فئة مجردة
فئة مجردة فو {
محمي $x;
عرض وظيفة مجردة ()؛
الدالة سيتكس($x) {
$this->x = $x;
}
}
الطبقة foo2 تمتد foo {
عرض الوظيفة () {
// شفرة
}
}
?>
__call
PHP5 على طريقة مخصصة جديدة __call()، والتي تُستخدم لمراقبة الطرق الأخرى في الكائن. إذا حاولت استدعاء أسلوب غير موجود في الكائن، فسيتم استدعاء الأسلوب __call تلقائيًا.
مثال 7: __call
فئة فو {
الدالة __call(اسم $,$arguments) {
طباعة("هل اتصلت بي؟ أنا $name!");
}
} $x = new foo();
$x->doStuff();
$x->fancy_stuff();
?>
يمكن استخدام هذه الطريقة الخاصة لتنفيذ إجراءات "التحميل الزائد"، بحيث يمكنك التحقق من المعلمات الخاصة بك وتمريرها عن طريق استدعاء طريقة خاصة.
مثال 8: استخدام __call لتنفيذ إجراء "التحميل الزائد".
فئة السحر {
الدالة __call(اسم $,$arguments) {
إذا($name=='foo') {
if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
}
} وظيفة خاصة foo_for_int($x) {
طباعة("يا إنت!");
} وظيفة خاصة foo_for_string($x) {
طباعة ("يا سلسلة!")؛
}
} $x = new Magic();
$x->foo(3);
$x->foo("3");
?>
__set و __get
هذه طريقة رائعة يمكن استخدام الأساليب __set و __get لالتقاط المتغيرات والأساليب غير الموجودة في الكائن.
المثال 9: __set و __get
فئة فو {
الدالة __مجموعة(اسم $،$val) {
print("مرحبًا، لقد حاولت وضع $val في $name");
}
وظيفة __الحصول على(اسم $) {
print("مرحبًا، لقد طلبت اسم $");
}
}
$x = جديد foo();
$x->bar = 3;
طباعة($x->winky_winky);
?>
اكتب الإشارة
في PHP5، يمكنك تحديد طريقة الكائن بأن المعلمة الخاصة به يجب أن تكون مثيلًا لكائن آخر.
مثال 10: نوع الإشارة
فئة فو {
// شفرة ...
}
شريط الفئة {
الوظيفة العامةprocess_a_foo(foo $foo) {
// بعض التعليمات البرمجية
}
}
$b = شريط جديد();
$f = جديد foo();
$b->process_a_foo($f);
?>
كما نرى، يمكننا تحديد اسم الكائن بشكل صريح قبل المعلمة، وسوف يتعرف PHP5 على أن المعلمة ستكون نسخة كائن.
الأعضاء الثابتون
يُطلق على الأعضاء الثابتين والأساليب الثابتة اسم "أساليب الكائن (أساليب الفئة)" و"متغيرات الكائنات (متغيرات الفئة)" في مصطلحات البرمجة الشيئية.
يُسمح باستدعاء "طرق الكائن" قبل إنشاء مثيل للكائن. وبالمثل، يمكن التحكم في "متغيرات الكائن" بشكل مستقل قبل إنشاء كائن (دون استخدام أساليب الكائن للتحكم فيه).
المثال 11: أساليب الكائن ومتغيرات الكائن
حاسبة الصف {
ثابت عام $pi = 3.14151692؛
إضافة وظيفة عامة ثابتة($x,$y) {
إرجاع $x + $y؛
}
}
$s = الآلة الحاسبة::$pi;
النتيجة $ = الآلة الحاسبة::add(3,7);
طباعة("نتيجة $");
?>
معالجة الاستثناءات
تعتبر معالجة الاستثناءات طريقة مثالية لمعالجة أخطاء البرنامج. ويسعدنا أن نرى إضافة هذا التطبيق إلى PHP5. يمكنك تجربة استخدام "try" و"catch" للتحكم في أخطاء البرنامج.
مثال 12: معالجة الاستثناءات
فئة فو {
تقسيم الدالة($x,$y) {
if($y==0) throw new Exception("لا يمكن القسمة على صفر");
إرجاع $x/$y;
}
}
$x = جديد foo();
يحاول {
$x->تقسيم(3,0);
} التقاط (استثناء $e) {
echo $e->getMessage();
صدى "ن
ن"؛
// بعض التدابير الكارثية هنا
}
?>
في المثال أعلاه، استخدمنا "محاولة" لتنفيذ العبارة بين قوسين متعرجين. عند حدوث خطأ، سيقوم الكود بتسليم الخطأ إلى عبارة "catch" للمعالجة، وفي جملة "catch"، تحتاج إلى التحديد معالجة الأخطاء لكائن ما يمكن أن تجعل بنية التعليمات البرمجية تبدو أكثر وضوحًا، لأنه يمكننا الآن تسليم جميع معلومات الخطأ إلى كائن لمعالجتها.
معالجة الأخطاء المخصصة
يمكنك بسهولة التحكم في الحوادث في برنامجك باستخدام رمز معالجة الأخطاء المخصص. تحتاج فقط إلى اشتقاق فئة التحكم في الأخطاء الخاصة بك من فئة الاستثناء. في فئة التحكم في الأخطاء الخاصة بك، يجب أن يكون لديك مُنشئ وطريقة getMessage، وفيما يلي مثال على ذلك.
مثال 13: معالجة الأخطاء المخصصة
فئة WeirdProblem تمتد الاستثناء {
بيانات $ الخاصة؛
وظيفة مشكلة غريبة($data) {
الأصل::استثناء();
$this->data = $data;
}
وظيفة getMessage () {
return $this->data "تسبب في حدوث استثناء غريب!";
}
}
?>
يمكننا الآن استخدام "throw new WeirdProblem($foo)" لرمي معالج الأخطاء إذا حدث خطأ في كتلة التعليمات البرمجية "try"، فسيقوم PHP5 تلقائيًا بتسليم الخطأ إلى الجزء "catch" للمعالجة.
مساحات الأسماء
مساحات الأسماء مفيدة لتجميع الفئات أو تجميع الوظائف. يمكنه تجميع بعض الفئات أو الوظائف ذات الصلة معًا لسهولة الاتصال بها لاحقًا.
المثال 14: مساحة الاسم
مساحة الاسم الرياضيات {
مجمع الصف {
//...شفرة...
وظيفة __ بناء () {
طباعة("مرحبا");
}
}
} $m = new Math::Complex();
?>
انتبه إلى الظروف التي تحتاج فيها إلى استخدام مساحات الأسماء في التطبيقات العملية، قد تحتاج إلى الإعلان عن كائنين أو أكثر بنفس الاسم للقيام بأشياء مختلفة، ثم يمكنك وضعها في مساحات أسماء مختلفة (ولكن يجب أن تكون الواجهة نفس الشيء).