Professional Documents
Culture Documents
;return self::$name
}
}
;)(echo myClass8::test2
>?
-7الوراثة :
-لماذا تستخدم الوراثة ؟
-تستخدم الوراثة لتوفير الوقت فى إعاد ة كتابة الكواد البرمجية التى نحتاجها بإستمرار ,
وسيتضح هذا فيما يلى :
الوراثة السم يشرح نفسه فهى عملية وراثة مكونات الفئة الموروثة فى الفئة الوارثة أى إمكانية
إستخدام مكونات الفئة الموروثة -من دوال ومتغيرات -فى الفئة الوارثة .
وتتم عملية الوراثة بكتابة الكلمة المحجوز ة extendsكالتالى :
<?php
;)'include('A.php
}
231 الفصل الرابع عشر :البرمجة غراضية التوجه
>?
وهنا الفئة Bقامت بوراثة مكونات الفئة . A
<?php
{ class A
;'public $name='user1
;'private $name2='user2
;'protected $name3='user3
}
;)($obj=new B
;)(echo $obj->test
;">echo "<br
;echo $obj->name
>?
الفصل الرابع عشر :البرمجة غراضية التوجه 232
الكود المواضوع فى التعليق هو كود خاطئ لنه يعتبر عملية وصول لمتغير خاص والمكونات
المعرفة على أنها خاصة ل تورث ,وعند إنشاء كائن من الفئة الجديد ة نستطيع إسخدام مكونات
الفئة ومكونات الفئة التى ورثتها أيضًا بشرط أن تكون معرفة على أنها مكونات عامة .
<?php
{ class A
;"const NAME="User1
;'public static $name='user1
;'private static $name2='user2
}
;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
}
;)($obj=new B
;)(echo $obj->test
>?
-لحظ تم إستخدام كلمة parentللدللة على أن تلك الدالة تنتمى للفئة العليا Aولو إستخدمنا$
thisلكانت الدالة سوف تستدعى نفسها أى تستدعى الدلة الموجود ة فى الفئة الحالية , Bوعند
إنشاء كائن من الفئة Bيتم إستخدام الدلة الموجود ة فى الفئة Bبعد أن تمت عليها العملية التى
تعرف بالتحميل الزائد للدوال
<?php
;"echo "user
}
}
;)(//$obj=new A
;)(//echo $obj->test
;)($obj=new B
;)(echo $obj->test2
>?
لحظ الكود الموجود فى التعليق وهو محاولة إنشاء كائن من الفئة المجرد ة Aوهذا ل يصلح
وإن فّعلت هذا الكود سينتج خطأ الوصول لفئة مجرد ة من خلل الكائن .
يتم تعريف الدوال المجرد ة داخل الفئة المجرد ة ,نعنى بالدوال المجرد ة أى شكل ثابت للدوال
يجب إتباعة عند توريث هذه الفئة المجرد ة وهى كما قلت فى العلى عبار ة عن قالب ,ولهذا
يجب إعاد ة تعريف الدوال المجرد ة عند عملية الوراثة لهذه الفئة المجرد ة مثال على هذا :
<?php
;)($obj=new B
;)(echo $obj->test
;">echo "<br
;)(echo $obj->test2
;">echo "<br
;)"echo $obj->test4("user3 "," user4
>?
نلحظ أن تعريف الدوال المجرد ة يكون بدون جسم الدالة .
لحظ فى الكود الموجود فى التعليق أنه ل يصلح تعريف دالة مجرد ة من النوع الخاص لن النوع
الخاص هذا كما نعلم يستخدم داخل الفئة المعرف بداخلها فقط والدوال المجرد ة مخصصة
للستخدام الخارجي عند التوريث .
يجب إعاد ة تعريف الدوال المعرفة على أنها مجرد ة فى الفئة العليا Aبدون واضع الكلمة
237 الفصل الرابع عشر :البرمجة غراضية التوجه
<?php
}
;)($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
}
;"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فما فوق حتى تعمل معك جميع الكواد
بشكل صحيح .
<?php