🚀 احتراف الوراثة (Inheritance) في PHP: كيف تجعل الكود أذكى وأقل تكراراً؟

بعد أن تعلمت كيف تنشئ الكلاسات (Classes) والكائنات (Objects)، حان الوقت لتتعلم واحدة من أهم ركائز البرمجة كائنية التوجه (OOP)، وهي الوراثة (Inheritance).

ببساطة، الوراثة هي عملية تسمح لك بإنشاء "كلاس جديد" يرث جميع الخصائص والدوال من "كلاس موجود مسبقاً". تخيلها كعلاقة الأب والابن؛ فالابن يرث بعض الصفات من أبيه، ولكن يمكنه أيضاً أن يمتلك صفات خاصة به تميزه. 👨‍👦


🧐 لماذا نحتاج إلى الوراثة؟

قبل أن ندخل في الكود، اسأل نفسك: ماذا لو كان لدي 10 أنواع من المستخدمين في موقعي (مدير، كاتب، محرر، إلخ)، وكلهم يشتركون في صفات أساسية مثل (الاسم، البريد الإلكتروني، كلمة المرور)؟

بدلاً من كتابة هذه الصفات في كل كلاس على حدة (وهذا تكرار سيئ للكود)، نقوم بإنشاء كلاس واحد أساسي يحتوي على هذه الصفات، ثم نجعل بقية الكلاسات "ترث" منه. هذا يوفر الوقت، ويقلل الأخطاء، ويجعل الكود أسهل في الصيانة. ✅


🛠️ كيف نطبق الوراثة باستخدام كلمة extends؟

في لغة PHP، نستخدم الكلمة المحجوزة extends لإخبار اللغة بأن هذا الكلاس يرث من كلاس آخر.

  1. الكلاس الأساسي (Parent Class): وهو الكلاس الذي يحتوي على الخصائص والدوال العامة (يسمى أيضاً Base Class).
  2. الكلاس المشتق (Child Class): وهو الكلاس الذي يرث من الكلاس الأساسي (يسمى أيضاً Derived Class).

💻 مثال عملي وبسيط:

لنفرض أن لدينا كلاس يمثل "الحيوانات" بشكل عام، وكلاس آخر يمثل "الكلب" كنوع خاص من الحيوانات.

<?php

// Parent Class: Animal
class Animal {
    public $name;

    public function eat() {
        echo "This animal is eating... 🍎";
    }

    public function sleep() {
        echo "This animal is sleeping... 💤";
    }
}

// Child Class: Dog inherits from Animal
class Dog extends Animal {
    public function bark() {
        echo "The dog is barking: Woof! Woof! 🐶";
    }
}

// --- تجربة الكود ---

$myDog = new Dog();

// الوصول إلى خاصية موجودة في الكلاس الأب
$myDog->name = "Buddy"; 
echo "My dog's name is: " . $myDog->name . "<br>";

// استخدام دالة موروثة من الكلاس الأب (Animal)
$myDog->eat(); 
echo "<br>";

// استخدام دالة خاصة بالكلاس الابن فقط (Dog)
$myDog->bark(); 
?>

شرح ما حدث في الكود:

  • أنشأنا كلاس Animal يحتوي على دالة eat ودالة sleep.
  • أنشأنا كلاس Dog واستخدمنا extends Animal. هذا يعني أن الكلب أصبح يمتلك كل شيء موجود في Animal تلقائياً.
  • أضفنا دالة bark داخل كلاس Dog لأن الكلاب فقط هي من تنبح، بينما لا تنبح كل الحيوانات.
  • عندما أنشأنا كائن من Dog استطعنا استدعاء eat() (الموروثة) و bark() (الخاصة به).

⚠️ ملاحظات هامة جداً للمبتدئين

  1. الوراثة أحادية الجانب: في PHP، يمكن للكلاس أن يرث من كلاس واحد فقط. لا يمكنك كتابة class Dog extends Animal, Mammal (هذا غير مسموح).
  2. الوصول إلى الخصائص: إذا كانت الخاصية في الكلاس الأب معرفة كـ public أو protected فإن الكلاس الابن يستطيع الوصول إليها. أما إذا كانت private فلا يمكن للابن رؤيتها أو استخدامها. 🔒

💡 متى تستخدم الوراثة؟

استخدم الوراثة دائماً عندما تجد نفسك تقول: "هذا الشيء هو نوع من ذلك الشيء".

  • السيارة هي نوع من المركبات.
  • المدير هو نوع من الموظفين.
  • القالب هو نوع من العناصر الرسومية.

إذا كانت هذه العلاقة موجودة، فالوراثة هي الحل الأمثل! 🌟


⏭️ ماذا سنتعلم في الدرس القادم؟

الآن بعد أن تعلمت كيف يرث الابن صفات أبيه، قد تتساءل: "ماذا لو أراد الابن تغيير طريقة تنفيذ دالة ورثها من أبيه؟" 🧐

في الدرس القادم، سنتعرف على مفهوم "Method Overriding"، وهو كيف نقوم بتعديل سلوك الدوال الموروثة لتناسب احتياجات الكلاس المشتق. نراكم هناك! 👋