Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الوراثة الأساسية

جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 21 من 91.

تسمح الوراثة للفئة باكتساب الخصائص والأساليب من فئة أخرى. فبدلاً من إعادة كتابة الكود نفسه، يمكنك إنشاء فئة أساسية تحتوي على وظائف مشتركة وجعل الفئات الأخرى ترث منها.

تُسمى الفئة التي يتم التوريث منها بـ الفئة الأب (أو الفئة الأساسية)، وتُسمى الفئة التي تَرِث بـ الفئة الابن. تستخدم الكلمة المفتاحية extends لإنشاء هذه العلاقة:

<?php
class Animal {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
    
    public function speak() {
        return "$this->name makes a sound";
    }
}

class Dog extends Animal {
    public function fetch() {
        return "$this->name fetches the ball";
    }
}

$dog = new Dog("Buddy");
echo $dog->speak() . "\n";
echo $dog->fetch();

المخرجات:

Buddy makes a sound
Buddy fetches the ball

تمتلك فئة Dog تلقائيًا إمكانية الوصول إلى خاصية $name، والمُنشئ (constructor)، وتابع speak() من Animal. كما أنها تُعرف تابع fetch() الخاص بها والذي تمتلكه الكلاب فقط.

هذا ينشئ تسلسلاً هرمياً واضحاً: كل كلب هو حيوان، لذا فمن المنطقي أن يرث Dog من Animal. يمكن للفئة الابنة استخدام كل شيء من الفئة الأب مع إضافة سلوكها الخاص المتخصص.

نقطة رئيسية: يعزز التوريث إعادة استخدام الكود ويقيم علاقات منطقية بين الفئات. ترث الفئة الابنة جميع الأعضاء العامة والمحمية من الفئة الأب، مما يقلل من التكرار ويجعل صيانة الكود الخاص بك أسهل.

challenge icon

التحدي

سهل

لنقم ببناء نظام تسلسل هرمي للمركبات يوضح كيف يسمح التوريث للفئات الفرعية (child classes) بمشاركة الوظائف من الفئة الأب (parent class) مع إضافة سلوكياتها المتخصصة.

ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:

  • Vehicle.php — قم بتعريف فئة Vehicle التي تعمل كأب لجميع المركبات. يجب أن تحتوي على خاصية عامة $brand ومنشئ (constructor) يقبل العلامة التجارية ويقوم بتعيينها. قم بتضمين تابع start() يعيد "[brand] is starting" وتابع stop() يعيد "[brand] is stopping".
  • Motorcycle.php — قم بتعريف فئة Motorcycle التي ترث من Vehicle. قم بتضمين ملف Vehicle في الأعلى. لا تحتاج فئة Motorcycle إلى منشئ خاص بها لأنها سترث منشئ الفئة الأب. أضف تابع wheelie() يعيد "[brand] is doing a wheelie!" — وهذا سلوك فريد للدراجات النارية.
  • main.php — قم بتضمين ملف Motorcycle (الذي يتضمن بالفعل Vehicle). ستتلقى مدخلاً واحداً: العلامة التجارية للدراجة النارية. أنشئ كائن Motorcycle بهذه العلامة التجارية. اطبع نتيجة استدعاء start()، ثم wheelie()، ثم stop()، كل منها في سطر مستقل.

لاحظ كيف ترث فئة Motorcycle تلقائياً الخاصية $brand، والمنشئ، وكلاً من تابعي start() و stop() من Vehicle. تحتاج الفئة الفرعية فقط إلى تعريف ما يجعلها فريدة — في هذه الحالة، القدرة على القيام بحركة wheelie. هذه هي قوة التوريث: كتابة الوظائف المشتركة مرة واحدة في الأب، والسماح للأبناء بإعادة استخدامها مع إضافة تخصصاتهم الخاصة.

جرّب بنفسك

<?php
// تضمين فئة Motorcycle (التي تتضمن بالفعل Vehicle)
require_once 'Motorcycle.php';

// قراءة المدخلات
$brand = trim(fgets(STDIN));

// TODO: إنشاء كائن Motorcycle باستخدام brand

// TODO: طباعة نتيجة start()

// TODO: طباعة نتيجة wheelie()

// TODO: طباعة نتيجة stop()
?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming