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

التركيب مقابل الوراثة

جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 56 من 91.

في الفصل السابق، تعلمت أن السمات توفر قدرة "has-a"، بينما تُنشئ الوراثة علاقة "is-a". يأخذ التركيب مفهوم "has-a" إلى أبعد من ذلك من خلال بناء objects معقدة من عناصر أبسط، وتخزينها كـ properties بدلًا من الوراثة منها.

مع الوراثة، قد تمتد Car من Vehicle. ومع التركيب، تحتوي Car على كائن Engine:

<?php
class Engine {
    public function start(): string {
        return "Engine started";
    }
}

class Car {
    private Engine $engine;
    
    public function __construct() {
        $this->engine = new Engine();
    }
    
    public function start(): string {
        return $this->engine->start();
    }
}

$car = new Car();
echo $car->start();

الناتج:

Engine started

لا ترث Car من Engine، بل تمتلك واحدًا منه. يقدّم هذا الأسلوب مزايا كبيرة: يمكنك استبدال المحرك بتطبيق مختلف، وتظل الفئات غير مترابطة بإحكام، وتتجنب التسلسلات الهرمية الجامدة التي ينشئها التوريث العميق.

من الإرشادات الشائعة في OOP هي "فضّل التركيب على الوراثة." تعمل الوراثة بشكل جيد مع التسلسلات الهرمية الحقيقية للأنواع (فـ Dog هو بالفعل Animal)، لكن التركيب يتألق عندما تجمع الوظائف من أجزاء مستقلة. يمكنك دمج عدة objects، واستبدالها أثناء وقت التشغيل، واختبار المكوّنات بشكل منفصل.

يستكشف الدرس التالي حقن التبعيات، الذي يبني مباشرةً على التركيب من خلال التحكم في كيفية تلقّي الكائنات لتبعياتها.

challenge icon

التحدي

سهل

لنبنِ نظام كمبيوتر باستخدام التركيب، حيث يتم تجميع Computer من كائنات مكوّنات منفصلة بدلاً من التوريث منها. يوضّح هذا كيف يتيح لك التركيب بناء كائنات معقّدة من أجزاء أبسط ومستقلة.

ستنظّم التعليمات البرمجية في ثلاثة ملفات:

  • Processor.php: أنشئ فئة Processor تمثّل وحدة المعالجة المركزية (CPU). استخدم ترقية المُنشئ لتعريف $model خاص (نصي) و$cores خاص (عدد صحيح). أضف أسلوبًا getSpecs() يعيد "[model] ([cores] cores)".
  • Memory.php: أنشئ فئة Memory تمثّل ذاكرة RAM. استخدم ترقية المُنشئ لتعريف $size خاص (عدد صحيح يمثّل GB). أضف أسلوبًا getCapacity() يعيد "[size]GB RAM".
  • main.php: ضمّن ملفَي المكوّنين وأنشئ فئة Computer تستخدم التركيب. يجب أن تقوم Computer بما يلي:
    • تخزين كائن Processor وكائن Memory كخصائص خاصة
    • قبول طراز المعالج، وعدد النوى، وحجم الذاكرة في المُنشئ
    • إنشاء كائنات المكوّنات داخليًا أثناء الإنشاء
    • امتلاك أسلوب describe() يعيد "Computer with [processor specs] and [memory capacity]"

    ستتلقى ثلاث مُدخلات: طراز المعالج، وعدد النوى، وحجم الذاكرة بوحدة GB. أنشئ Computer بهذه المواصفات واطبع نتيجة استدعاء describe().

لاحظ أن Computer لا يرث من Processor أو Memory. بل يحتوي عليهما. تحافظ علاقة «يمتلك» هذه، من خلال التركيب، على استقلال كل مكوّن وقابليته لإعادة الاستخدام، مع السماح لـ Computer بتفويض المهام إلى أجزائه عند الحاجة.

جرّب بنفسك

<?php
require_once 'Processor.php';
require_once 'Memory.php';

class Computer
{
    // TODO: عرّف خصائص خاصة لتخزين كائنات Processor و Memory

    // TODO: يجب أن يقبل المُنشئ نموذج المعالج وعدد الأنوية وحجم الذاكرة
    // وينشئ كائنات المكونات داخليًا
    public function __construct()
    {
        // TODO: أنشئ كائنات Processor و Memory وخزّنها
    }

    // TODO: نفّذ الدالة describe() التي تُرجع
    // "Computer with [processor specs] and [memory capacity]"
    public function describe(): string
    {
        // TODO: فوّض إلى كائنات المكونات وأرجع سلسلة منسّقة
    }
}

// اقرأ المدخلات
$processorModel = trim(fgets(STDIN));
$cores = intval(fgets(STDIN));
$memorySize = intval(fgets(STDIN));

// TODO: أنشئ Computer بالمواصفات المعطاة واطبع نتيجة describe()

?>
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم PHP عبر الإنترنت