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

السمات مقابل الوراثة

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

الآن بعد أن فهمت كيفية عمل السمات، لنوضّح متى تستخدم السمات مقابل الوراثة. يتيح كلاهما إعادة استخدام التعليمات البرمجية، لكنهما يخدمان أغراضًا مختلفة ولهما خصائص متميزة.

Inheritance تنشئ علاقة من نوع "is-a". إن قيام Dog class بتمديد Animal يعني أن الكلب هو animal. ترث class الابنة هوية parent، ويمكن استخدامها في أي مكان يُتوقع فيه نوع parent.

السمات توفّر قدرة «يمتلك». عندما تستخدم class سمة Loggable، فإنها has وظيفة logging - لكنها لا تصبح مسجّلًا. تضيف السمات سلوكًا دون تغيير ماهية class الأساسية.

<?php
// الوراثة: Dog هو Animal
class Animal {
    public function breathe(): void {
        echo "Breathing";
    }
}

class Dog extends Animal {
    public function bark(): void {
        echo "Woof!";
    }
}

// السمة: Dog لديه قدرة التسجيل
trait Loggable {
    public function log(string $msg): void {
        echo "Log: $msg";
    }
}

class Cat extends Animal {
    use Loggable;
}

الفروق الرئيسية التي يجب تذكّرها:

الجانبInheritanceالسمات
العلاقةis-ahas-a capability
الحدوالد واحد فقطيُسمح بسمات متعددة
التحقق من النوعيعمل مع instanceofلا توجد هوية للنوع
الأفضل لـالعلاقات الهرميةالسلوكيات المشتركة بين الأصناف غير المرتبطة

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

challenge icon

التحدي

سهل

لنبنِ نظامًا للمركبات يوضّح متى نستخدم الوراثة ومتى نستخدم السمات. ستنشئ تسلسلاً هرميًا للمركبات التي تشترك في هوية مشتركة من خلال الوراثة، مع إضافة إمكانات مشتركة عبر السمات.

ستنظّم شيفرتك عبر أربعة ملفات:

  • Trackable.php: أنشئ سمة باسم Trackable توفّر إمكانية التتبع عبر GPS. يجب أن تحتوي السمة على:
    • خاصية خاصة $location (من النوع string)
    • دالة setLocation(string $location) تخزّن الموقع الحالي
    • دالة getLocation() تُعيد "Location: [location]"
    تمثّل هذه السمة إمكانية من نوع "has-a": يمكن لأي مركبة أن تمتلك التتبع، لكن امتلاك التتبع لا يجعل الشيء مركبة.
  • Vehicle.php: أنشئ فئة أساسية Vehicle تؤسّس علاقة "is-a". قم بتضمين ملف السمة. استخدم ترقية المُنشئ لتعريف خاصية محمية $brand. أضف دالة describe() تُعيد "Vehicle: [brand]". يجب أن تستخدم هذه الفئة سمة Trackable، لأن جميع المركبات في أسطولنا ستحتوي على GPS.
  • Car.php: أنشئ فئة Car تمتد من Vehicle. قم بتضمين ملف Vehicle. استخدم ترقية المُنشئ لقبول العلامة التجارية وخاصية خاصة $doors (من النوع integer). استدعِ مُنشئ الفئة الأب مع العلامة التجارية. أعد تعريف دالة describe() لتُعيد "Car: [brand] with [doors] doors".
  • main.php: قم بتضمين ملف Car. ستتلقى ثلاث مدخلات: اسم علامة تجارية، وعدد الأبواب، وسلسلة نصية تمثّل الموقع. أنشئ كائنًا من Car، واضبط موقعه، ثم اطبع سطرين:
    • نتيجة استدعاء describe()
    • نتيجة استدعاء getLocation()

لاحظ كيف تعمل الوراثة والسمات معًا هنا: Car is a Vehicle (تؤسّس الوراثة الهوية)، بينما Vehicle has إمكانية التتبع (تضيف السمة السلوك). يمكنك استخدام instanceof Vehicle للتحقق مما إذا كان شيء ما مركبة، لكن لا يوجد نوع "Trackable" يمكن التحقق منه: وهذا هو الفرق الأساسي بين النهجين.

جرّب بنفسك

<?php
// الملف الرئيسي - إنشاء واختبار مثيل Car

// TODO: تضمين ملف Car.php

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

// TODO: إنشاء مثيل Car باستخدام brand و doors

// TODO: تعيين موقع السيارة

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

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

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

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

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