You are on page 1of 11

‫الفصل الرابع عشر ‪ :‬البرمجة غراضية التوجه‬ ‫‪230‬‬

‫;‪return self::$name‬‬
‫}‬

‫{)(‪public static function test2‬‬


‫;)(‪return self::test‬‬
‫}‬

‫}‬

‫;)(‪echo myClass8::test2‬‬

‫>?‬

‫‪ -7‬الوراثة ‪:‬‬
‫‪ -‬لماذا تستخدم الوراثة ؟‬
‫‪ -‬تستخدم الوراثة لتوفير الوقت فى إعاد ة كتابة الكواد البرمجية التى نحتاجها بإستمرار ‪,‬‬
‫وسيتضح هذا فيما يلى ‪:‬‬

‫الوراثة السم يشرح نفسه فهى عملية وراثة مكونات الفئة الموروثة فى الفئة الوارثة أى إمكانية‬
‫إستخدام مكونات الفئة الموروثة ‪ -‬من دوال ومتغيرات ‪ -‬فى الفئة الوارثة ‪.‬‬
‫وتتم عملية الوراثة بكتابة الكلمة المحجوز ة ‪ extends‬كالتالى ‪:‬‬

‫‪<?php‬‬
‫;)'‪include('A.php‬‬

‫{ ‪class B extends A‬‬

‫}‬
‫‪231‬‬ ‫الفصل الرابع عشر ‪ :‬البرمجة غراضية التوجه‬

‫>?‬
‫وهنا الفئة ‪ B‬قامت بوراثة مكونات الفئة ‪. A‬‬

‫‪ -‬ما الذى يتم وراثته وما الذى ل يتم وراثته ؟‬


‫‪ -‬يتم وراثة المكونات المعرفة على أنها عامة أو محمية ول يتم توريث المكونات المعرفة على أنها‬
‫خاصة ‪ .‬هذا مثال على ما سبق ‪:‬‬

‫‪<?php‬‬

‫{ ‪class A‬‬
‫;'‪public $name='user1‬‬
‫;'‪private $name2='user2‬‬
‫;'‪protected $name3='user3‬‬
‫}‬

‫{ ‪class B extends A‬‬


‫{)(‪public function test‬‬
‫;‪echo $this->name‬‬
‫;">‪echo "<br‬‬
‫;‪//echo $this->name2‬‬
‫;‪echo $this->name3‬‬
‫}‬
‫}‬

‫;)(‪$obj=new B‬‬
‫;)(‪echo $obj->test‬‬
‫;">‪echo "<br‬‬
‫;‪echo $obj->name‬‬
‫>?‬
‫الفصل الرابع عشر ‪ :‬البرمجة غراضية التوجه‬ ‫‪232‬‬

‫الكود المواضوع فى التعليق هو كود خاطئ لنه يعتبر عملية وصول لمتغير خاص والمكونات‬
‫المعرفة على أنها خاصة ل تورث ‪ ,‬وعند إنشاء كائن من الفئة الجديد ة نستطيع إسخدام مكونات‬
‫الفئة ومكونات الفئة التى ورثتها أيضًا بشرط أن تكون معرفة على أنها مكونات عامة ‪.‬‬

‫‪ -‬كيف نستخدم المكونات الموروثة ؟‬


‫‪ -‬نستخدم الكلمة المحجوز ة‪ $this‬للوصول لمكونات الفئة الموروثة ولكن فى حالة الثوابت‬
‫والمكونات المعرفة على أنها ساكنة يتم إستخدام الكلمة المحجوز ة ‪ parent‬ثم يتبعها ‪ ::‬ثم اسم‬
‫الثابت أو العنصر الساكن ملحوظة ‪ ":‬الثابت ل تسبقة العلمة ‪ $‬ولكن تسبق العناصر الساكنة "‬
‫وهذا مثال على ما سبق ‪:‬‬

‫‪<?php‬‬

‫{ ‪class A‬‬
‫;"‪const NAME="User1‬‬
‫;'‪public static $name='user1‬‬
‫;'‪private static $name2='user2‬‬
‫}‬

‫{ ‪class B extends A‬‬


‫;"‪const NAME2="User2‬‬
‫;'‪private static $name3='user3‬‬

‫{)(‪public function test‬‬


‫;‪echo parent::NAME‬‬
‫;">‪echo "<br‬‬
‫;‪echo parent::$name‬‬
‫;">‪echo "<br‬‬
‫;‪echo self::NAME2‬‬
‫;">‪echo "<br‬‬
‫‪233‬‬ ‫الفصل الرابع عشر ‪ :‬البرمجة غراضية التوجه‬

‫;‪echo self::$name3‬‬
‫}‬
‫}‬

‫;‪echo B::NAME‬‬
‫;">‪echo "<br‬‬
‫;‪echo B::$name‬‬
‫;">‪echo "<br‬‬
‫;‪echo B::NAME‬‬
‫;">‪echo "<br‬‬
‫;)(‪$obj=new B‬‬
‫;)(‪echo $obj->test‬‬
‫>?‬

‫لحظ أن الفئة ‪ B‬قامت بوراثة جميع المكونات ‪ -‬عادا الخاصة ‪ -‬من الفئة ‪ A‬وبالتالى إستطعنا‬
‫إستخدامها من خلل الكائن المنشأ من الفئة ‪ , B‬ولحظ أيضًا إستخدام الكلمة ‪ parent‬للقيم‬
‫الثابتة والساكنة من الفئة العليا ‪ A‬وإستخدام ‪ self‬للقيم الثابتة والساكنة من الفئة الحالية ‪B‬‬

‫التحميل الزائد للطرق أو الدوال ‪:‬‬


‫هو عملية تعريف نفس اسم دالة موجود ة فى الفئة العليا وإعاد ة إستخدامها فى الفئة الوارثة ‪ ,‬أى‬
‫بمعنى تعمل الدالة عملها بالاضافة لعمل جديد سيضاف للدالة فى الفئة الحالية "الوارثة" مثال‬
‫على ذلك ‪:‬‬

‫‪<?php‬‬

‫{ ‪class A‬‬
‫{)(‪public function test‬‬
‫;"‪echo "user1‬‬
‫}‬
‫الفصل الرابع عشر ‪ :‬البرمجة غراضية التوجه‬ ‫‪234‬‬

‫}‬

‫{ ‪class B extends A‬‬


‫{)(‪public function test‬‬
‫;)(‪parent::test‬‬
‫;">‪echo "<br‬‬
‫;"‪echo "user2‬‬
‫}‬
‫}‬

‫;)(‪$obj=new B‬‬
‫;)(‪echo $obj->test‬‬
‫>?‬
‫‪ -‬لحظ تم إستخدام كلمة ‪ parent‬للدللة على أن تلك الدالة تنتمى للفئة العليا ‪ A‬ولو إستخدمنا‪$‬‬
‫‪ this‬لكانت الدالة سوف تستدعى نفسها أى تستدعى الدلة الموجود ة فى الفئة الحالية ‪ , B‬وعند‬
‫إنشاء كائن من الفئة ‪ B‬يتم إستخدام الدلة الموجود ة فى الفئة ‪ B‬بعد أن تمت عليها العملية التى‬
‫تعرف بالتحميل الزائد للدوال‬

‫الفئة المجردة ‪:‬‬


‫نعنى بفئة مجرد ة أى أن هذه الفئة عبار ة عن قالب ول يمكن إنشاء كائن من هذه الفئة ولكنها‬
‫تكون مخصصة فقط للتوريث ‪.‬‬
‫فإذا أردت عمل فئة ول تريد إل أن تستخدم إل فى التوريث فقط فستضع قبل اسم الفئة الكلمة‬
‫المحجوز ة ‪ abstract‬كالتالى ‪:‬‬

‫‪<?php‬‬

‫{ ‪abstract class A‬‬

‫{)(‪public function test‬‬


‫‪235‬‬ ‫الفصل الرابع عشر ‪ :‬البرمجة غراضية التوجه‬

‫;"‪echo "user‬‬
‫}‬
‫}‬

‫{ ‪class B extends A‬‬


‫{)(‪public function test2‬‬
‫;)(‪$this->test‬‬
‫}‬
‫}‬

‫;)(‪//$obj=new A‬‬
‫;)(‪//echo $obj->test‬‬

‫;)(‪$obj=new B‬‬
‫;)(‪echo $obj->test2‬‬
‫>?‬

‫لحظ الكود الموجود فى التعليق وهو محاولة إنشاء كائن من الفئة المجرد ة ‪ A‬وهذا ل يصلح‬
‫وإن فّعلت هذا الكود سينتج خطأ الوصول لفئة مجرد ة من خلل الكائن ‪.‬‬
‫يتم تعريف الدوال المجرد ة داخل الفئة المجرد ة ‪ ,‬نعنى بالدوال المجرد ة أى شكل ثابت للدوال‬
‫يجب إتباعة عند توريث هذه الفئة المجرد ة وهى كما قلت فى العلى عبار ة عن قالب ‪ ,‬ولهذا‬
‫يجب إعاد ة تعريف الدوال المجرد ة عند عملية الوراثة لهذه الفئة المجرد ة مثال على هذا ‪:‬‬

‫‪<?php‬‬

‫{ ‪abstract class A‬‬

‫;)(‪abstract public function test‬‬


‫;)(‪abstract protected function test2‬‬
‫الفصل الرابع عشر ‪ :‬البرمجة غراضية التوجه‬ ‫‪236‬‬

‫;)(‪//abstract private function test3‬‬


‫;)‪abstract public function test4($var1,$var2‬‬
‫}‬

‫{ ‪class B extends A‬‬


‫{)(‪public function test‬‬
‫;"‪echo "user1‬‬
‫}‬
‫{)(‪public function test2‬‬
‫;"‪echo "user2‬‬
‫}‬
‫{)‪public function test4($var1,$var2‬‬
‫;‪echo $var1.$var2‬‬
‫}‬
‫}‬

‫;)(‪$obj=new B‬‬
‫;)(‪echo $obj->test‬‬
‫;">‪echo "<br‬‬
‫;)(‪echo $obj->test2‬‬
‫;">‪echo "<br‬‬
‫;)"‪echo $obj->test4("user3 "," user4‬‬
‫>?‬
‫نلحظ أن تعريف الدوال المجرد ة يكون بدون جسم الدالة ‪.‬‬
‫لحظ فى الكود الموجود فى التعليق أنه ل يصلح تعريف دالة مجرد ة من النوع الخاص لن النوع‬
‫الخاص هذا كما نعلم يستخدم داخل الفئة المعرف بداخلها فقط والدوال المجرد ة مخصصة‬
‫للستخدام الخارجي عند التوريث ‪.‬‬
‫يجب إعاد ة تعريف الدوال المعرفة على أنها مجرد ة فى الفئة العليا ‪ A‬بدون واضع الكلمة‬
‫‪237‬‬ ‫الفصل الرابع عشر ‪ :‬البرمجة غراضية التوجه‬

‫‪ abstract‬وبعد ذلك يتم واضع جسم الدالة المراد عمله ‪.‬‬

‫الفئات النهائية ‪:‬‬


‫هى فئات ليصلح توريثها ‪ ,‬ويتم تعريف الفئة على أنها نهائية بإستخدام الكلمة المحجوز ة ‪final‬‬
‫كالتالى ‪:‬‬

‫‪<?php‬‬

‫{ ‪final class A‬‬


‫;"‪public $name="user1‬‬
‫;"‪private $name2="user2‬‬
‫;"‪protected $name3="user3‬‬
‫}‬

‫{ ‪/*class B extends A‬‬

‫}‬

‫;)(‪$obj=new B‬‬
‫;‪echo $obj->name‬‬
‫‪*/‬‬

‫;)(‪$obj=new A‬‬
‫;‪echo $obj->name‬‬
‫;‪//echo $obj->name2‬‬
‫;‪//echo $obj->name3‬‬
‫>?‬
‫ولحظ أنه لو تم تفعيل الكود الموجود فى التعليق سيحدث خطأ لنها عملية وراثة لفئة نهاية ‪.‬‬
‫وأيضًا لحظ أنه فى حالة الفئة النهائية يكون عمل ‪ private‬مساوى لعمل ‪ protected‬حيث أن‬
‫الفصل الرابع عشر ‪ :‬البرمجة غراضية التوجه‬ ‫‪238‬‬

‫هذه الفئة ليمكن توريثها ‪.‬‬

‫الواجهات ‪: interfaces‬‬
‫وهى تشبه الفئات المجرد ة إل أنها ليمكن تعريف دوال كاملة بها بل يتم تعريف الدوال بدون‬
‫جسم فقط أى ل تكتب دوال تقوم بعمل ما داخلها ‪ ,‬ويمكن للواجهات أن ترث بعضها البعض‬
‫بإستخدام الكلمة المحجوز ة ‪ extends‬وعندما ترث الفئة الواجهة نستخدم الكلمة المحجوز ة‬
‫‪ implements‬ويمكن للفئة أن ترث أكثر من واجهه ويفصل بينها بفاصلة مثال على ما سبق ‪:‬‬

‫‪<?php‬‬
‫{ ‪interface A‬‬
‫;)(‪public function test‬‬
‫}‬

‫{ ‪interface B‬‬
‫;)(‪public function test2‬‬
‫}‬

‫{ ‪interface C extends A‬‬


‫;)(‪public function test3‬‬
‫}‬

‫{‪class D implements B,C‬‬


‫{)(‪public function test‬‬
‫;"‪echo "test‬‬
‫}‬
‫{)(‪public function test2‬‬
‫;"‪echo "test2‬‬
‫}‬
‫{)(‪public function test3‬‬
‫‪239‬‬ ‫الفصل الرابع عشر ‪ :‬البرمجة غراضية التوجه‬

‫;"‪echo "test3‬‬
‫}‬
‫}‬

‫;)(‪$obj=new D‬‬
‫;)(‪$obj->test‬‬
‫;">‪echo "<br‬‬
‫;)(‪$obj->test2‬‬
‫;">‪echo "<br‬‬
‫;)(‪$obj->test3‬‬
‫>?‬

‫السمات ‪: trait‬‬
‫السمات هى عبار ة عن طريقة للتخلص من القيود التى فراضتها الوراثة الفردية وأعنى بالوراثة‬
‫الفردية هى أن لفة ‪ php‬ل تدعم الوراثة المتعدده كما فى لغة ‪ c++‬لن الوراثة المتعدد ة على رغم‬
‫قوتها فى تسبب كثير من المشاكل والتعقيد ولهذا أنتجت ‪ php‬ما يعرف بالسمات ‪.‬‬
‫يتم تعريف السمة من خلل الكلمة المحجوز ة ‪ trait‬ويتم إستخدام السمات فى الفئة من خلل‬
‫الكلمة المحجوز ة ‪ use‬وهذا مثال لتواضيح عمل السمات ‪:‬‬

‫‪<?php‬‬
‫{‪trait A‬‬
‫‪public‬‬ ‫{ )(‪function test‬‬
‫‪return‬‬ ‫;"‪"user1‬‬
‫}‬
‫}‬
‫{‪trait B‬‬
‫‪public‬‬ ‫{ )(‪function test2‬‬
‫‪return‬‬ ‫;"‪"user2‬‬
‫الفصل الرابع عشر ‪ :‬البرمجة غراضية التوجه‬ ‫‪240‬‬

‫}‬
‫}‬
‫{‪class C‬‬
‫;‪use A,B‬‬
‫}‬
‫;)(‪$obj = new C‬‬
‫;)(‪echo $obj->test‬‬
‫;">‪echo "<br‬‬
‫;)(‪echo $obj->test2‬‬
‫>?‬
‫تم إنشاء كائن من الفئة ‪ C‬ومن خللة تم الوصول للدوال الموجود ة فى السمة ‪ A‬والسمة ‪ B‬وكأن‬
‫الفئة ‪ C‬قامت بعملية وراثة متعدد ة لكلً من ‪A,B‬‬

‫ملحظة ‪ :‬يجب إستخدام نسخة ‪ php 5.4‬فما فوق حتى تعمل معك جميع الكواد‬
‫بشكل صحيح ‪.‬‬

‫دوال البناء والهدم ‪:‬‬


‫ماهى دوال البناء والهدم ؟‬
‫‪ -‬هى دوال معرفة مسبقًا فى اللغة لغرض معين ‪.‬‬
‫‪ -1‬دالة البناء )(‪: __construct‬‬
‫‪ -‬وتقوم الفئة بشغيل هذه الدالة أول شئ ‪ ,‬وتستخدم فى إسناد القيم للمتغيرات وتشغيل دوال‬
‫تريد تشغيلها عند بدأ عمل الفئة وأشياء أخرى من هذا القبيل ‪.‬‬
‫‪ -2‬دالة الهدم )(‪: __destruct‬‬
‫‪ -‬وتقوم الفئة بتشغيل هذه الدالة أخر شئ ‪ ,‬وتستخدم فى إنهاء أو تنفيذ شئ معين عند الوصول‬
‫لنهاية الفئة ‪.‬‬

‫‪<?php‬‬

You might also like