🚀 إتقان إعادة تعريف الدوال: شرح Method Overriding في PHP

بعد أن تعلمنا في الدروس السابقة كيف نقوم بعملية "الوراثة" (Inheritance) وكيف تنتقل الخصائص والدوال من الفئة الأب (Parent Class) إلى الفئة الابن (Child Class)، سنكتشف اليوم ميزة قوية جداً تسمى Method Overriding.

ببساطة، هل حدث أن ورثت شيئاً من والدك ولكنك أردت تغييره ليكون مناسباً لك أكثر؟ هذا بالضبط ما نفعله في البرمجة عند استخدام الـ Overriding! 💡


❓ ما هو الـ Method Overriding؟

Method Overriding (إعادة تعريف الدالة) هو عملية تحدث عندما تقوم الفئة الابن (Child Class) بكتابة دالة بنفس الاسم وبنفس المعاملات الموجودة في الفئة الأب (Parent Class).

عندما نقوم بذلك، فإن الفئة الابن تخبر لغة PHP بما يلي: "أنا أعلم أن لدي دالة بهذا الاسم ورثتها من الأب، ولكنني أريد تنفيذ هذه الدالة بطريقتي الخاصة وليس بطريقة الأب".

متى نستخدمه؟ نستخدمه عندما نريد أن يكون للفئة الابن "سلوك خاص" يختلف عن السلوك العام الموجود في الفئة الأب.


🛠️ مثال عملي بسيط (خطوة بخطوة)

لنفترض أن لدينا فئة عامة تسمى Animal (حيوان)، وكل الحيوانات تصدر صوتاً. ولكن، صوت الكلب يختلف عن صوت القطة. هنا سنستخدم الـ Overriding.

1. إنشاء الفئة الأب (Parent Class)

سنقوم بتعريف دالة makeSound تعطي صوتاً عاماً.

<?php
// Parent Class
class Animal {
    public function makeSound() {
        echo "The animal makes a generic sound"; // صوت عام
    }
}
?>

2. إنشاء الفئة الابن (Child Class) مع عمل Overriding

الآن سننشئ فئة Dog ترث من Animal ولكنها ستعيد تعريف دالة makeSound لتخرج صوتاً خاصاً بالكلاب.

<?php
// Child Class inheriting from Animal
class Dog extends Animal {
    // Overriding the makeSound method
    public function makeSound() {
        echo "The dog says: Woof! Woof!"; // تغيير السلوك هنا
    }
}
?>

3. تجربة الكود ومعرفة النتيجة

دعونا نرى ماذا يحدث عند تشغيل الكود:

<?php
// Create an object of the Parent class
$genericAnimal = new Animal();
$genericAnimal->makeSound(); 
// Output: The animal makes a generic sound

echo "\n"; // سطر جديد للتنظيم

// Create an object of the Child class
$myDog = new Dog();
$myDog->makeSound(); 
// Output: The dog says: Woof! Woof!
?>

ماذا حدث هنا؟ 🤔 عندما استدعينا makeSound() من كائن Dog لـ، لم يذهب البرنامج لتنفيذ الكود الموجود في Animal بل نفذ الكود الموجود داخل Dog لأننا قمنا بعمل Overriding.


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

لكي تنجح عملية الـ Overriding، يجب عليك الانتباه للنقاط التالية:

  1. تطابق الاسم: يجب أن يكون اسم الدالة في الفئة الابن مطابقاً تماماً لاسم الدالة في الفئة الأب.
  2. الوراثة: لا يمكن عمل Overriding إلا إذا كانت الفئة الابن ترث (extends) من الفئة الأب.
  3. مستوى الوصول (Visibility): يجب أن يكون مستوى الوصول (مثل public) في الفئة الابن متوافقاً مع الفئة الأب (لا يمكنك تغيير دالة public إلى private في الابن).

🌟 ملخص سريع للدرس

  • الوراثة تعطينا الدوال من الأب.
  • Method Overriding يسمح لنا بتعديل هذه الدوال داخل الابن.
  • الهدف هو تخصيص السلوك (Custom Behavior) لكل فئة فرعية.
  • يجب تطابق اسم الدالة لكي يتم التعرف على العملية كـ Overriding.