يتم إنشاء البرامج الموجهة للكائنات من خلال هيكل هرمي للفئات. في لغات الوراثة الفردية مثل PHP، يكون وراثة الفئة شبيهة بالشجرة. تحتوي الفئة الجذرية على فئة فرعية واحدة أو أكثر، ثم يتم وراثة فئة فرعية واحدة أو أكثر من كل فئة فرعية المزيد من الفئات الفرعية من المستوى التالي. بالطبع، قد تكون هناك فئات جذرية متعددة تستخدم لتنفيذ وظائف مختلفة. في البنية المصممة جيدًا، يجب أن يكون لكل فئة جذر واجهة مفيدة يمكن استخدامها بواسطة كود التطبيق. إذا كان كود تطبيقنا مصممًا للعمل مع الفئة الجذرية، فيمكنه أيضًا العمل مع أي فئة فرعية ترث من الفئة الجذرية.
تشبه الطريقة المجردة عنصرًا نائبًا للطريقة العادية في فئة فرعية (تشغل مساحة ولكن ليس لها أي تأثير)، ولكن على عكس الطريقة العادية، لا تحتوي على أي تعليمات برمجية. إذا كان هناك واحد أو أكثر من الأساليب المجردة في الفصل، يصبح الفصل فصلًا مجردًا. لا يمكنك إنشاء مثيل للفئات المجردة، يجب أن ترث منها ثم إنشاء مثيل للفئات الفرعية. يمكنك أيضًا التفكير في الفئات المجردة كقالب للفئات الفرعية.
إذا قمت بتجاوز كافة الأساليب المجردة، تصبح الفئة الفرعية فئة عادية. إذا لم يتم تجاوز جميع الأساليب، فستظل الفئة الفرعية مجردة. إذا كانت الفئة تحتوي على طريقة مجردة (حتى لو كانت هناك واحدة فقط)، فيجب عليك الإعلان عن الفئة بأنها مجردة عن طريق إضافة مجردة قبل الكلمة الأساسية للفئة.
يختلف بناء جملة الإعلان عن طريقة مجردة عن أسلوب الإعلان عن طريقة عامة. لا تحتوي الطريقة المجردة على النص الرئيسي بين قوسين {} مثل الطريقة العامة، وتنتهي بفاصلة منقوطة؛.
في المثال 6.13، قمنا بتعريف فئة Shape التي تحتوي على طريقة getArea. لكن بما أنه من المستحيل تحديد مساحة الشكل دون معرفة الشكل، فقد أعلنا أن طريقة getArea هي طريقة مجردة. لا يمكنك إنشاء كائن شكل، ولكن يمكنك أن ترث منه أو تستخدمه في تعبير، كما في المثال 6.13.
إذا قمت بإنشاء فئة باستخدام الأساليب المجردة فقط، فإنك تحدد واجهة. لتوضيح هذا الموقف، PHP لديه الواجهة وينفذ الكلمات الرئيسية. يمكنك استخدام الواجهة بدلاً من الفئات المجردة والتطبيقات بدلاً من الامتدادات لوصف تعريف الفصل الخاص بك أو استخدام الواجهة. على سبيل المثال، يمكنك كتابة تطبيق myClass myIterface. يمكنك الاختيار بين هاتين الطريقتين بناءً على التفضيل الشخصي.
/*ملحوظة:
تشير الطريقتان إلى:
1. فئة مجردة aaa{} (لاحظ أن هناك طرق مجردة فقط في aaa، ولا توجد طرق عامة)
يمتد الفصل bbb aaa{} (تجاوز الطريقة المجردة في aaa في bbb)
2. الواجهة أأ{}
تنفذ الفئة bbb aaa{} (تجاوز الطريقة المجردة في aaa في bbb)
*/
القائمة 6.13 الفئات المجردة
// فئة الجذر المجردة فئة الجذر المجردة
شكل فئة مجردة
{
وظيفة مجردة getArea(); // تحديد طريقة مجردة
}
// فئة فرعية مجردة فئة فرعية مجردة
يمتد مضلع الطبقة المجردة الشكل //Polygon
{
دالة مجردة getNumberOfSides();
}
// فئة كيان فئة محددة فئة المثلث
يمتد فئة المثلث المضلع
{
قاعدة $ العامة؛
public $height
public function getArea() // تجاوز طريقة حساب المساحة {
return(($this->base * $this->height)/2);
}
الوظيفة العامة getNumberOfSides() // تجاوز طريقة العد الجانبي {
العودة (3)؛
}
}
// فئة كيان فئة ملموسة رباعي الأضلاع
يمتد فئة المستطيل المضلع
{
عرض $ العام؛
public $ height
الوظيفة العامة getArea()
{
return($this->width * $this->height);
}
الوظيفة العامة getNumberOfSides()
{
العودة (4)؛
}
}
// فئة كيان فئة محددة دائرة
دائرة الطبقة تمتد الشكل
{
public $radius
الوظيفة العامة getArea();
{
return(pi() * $this->radius * $this->radius);
}
}
// تحدد فئة الجذر الملموسة فئة اللون
classColor
{
اسم $ العام؛
}
$myCollection = array(); // أنشئ مجموعة من الأشكال وضعها في مصفوفة
// أنشئ مستطيلاً
$r = مستطيل جديد؛
$r->width = 5;
$r->الارتفاع = 7;
$myCollection[] = $r;
unset($r);
// اصنع مثلثًا
$t = مثلث جديد؛
$t->base = 4;
$t->الارتفاع = 5;
$myCollection[] = $t;
unset($t);
// اصنع دائرة
$c = دائرة جديدة؛
$c->radius = 3;
$myCollection[] = $c;
unset($c);
// اصنع لونًا
$c = لون جديد؛
$c->name = "أزرق";
$myCollection[] = $c;
unset($c);
foreach($myCollection كـ $s)
{
إذا($s مثيل للشكل) //إذا كان $s هو مثيل لفئة الشكل{
print("المنطقة: " . $s->getArea() . "n");
}
إذا($s مثيل للمضلع)
{
print("الجوانب: " .$s->getNumberOfSides()."n");
}
إذا($s مثيل اللون)
{
print("اللون: $s->name n");
}
طباعة("ن");
}
?>