🌟 احتراف الفئات المجردة (Abstract Classes) في PHP
سنتحدث اليوم عن مفهوم قوي جداً ومنظم، وهو الفئات المجردة أو ما يُعرف بـ Abstract Classes. 🚀
إذا كنت قد تعلمت كيف تنشئ كلاس (Class) وكيف تقوم بعمل وراثة (Inheritance)، فأنت الآن جاهز لفهم هذا المفهوم الذي ينقل تنظيمك للكود إلى مستوى آخر.
❓ ما هي الفئة المجردة (Abstract Class)؟
تخيل أنك تريد بناء نظام لشركة شحن، ولديك أنواع مختلفة من المركبات (شاحنة، دراجة نارية، سفينة). جميع هذه المركبات تشترك في صفة واحدة وهي أنها "مركبة"، ولكن طريقة "التحرك" تختلف من واحدة لأخرى.
هنا يأتي دور Abstract Class. هي عبارة عن كلاس "غير مكتمل"، لا يمكنك إنشاء كائن (Object) منه مباشرة. الهدف منها هو أن تكون بمثابة "مخطط" (Blueprint) أو "قاعدة" تلتزم بها جميع الكلاسات التي ترث منها.
ببساطة: الفئة المجردة تقول للكلاسات التي ترث منها: "أنا سأحدد لكم المهام التي يجب القيام بها، ولكن عليكم أنتم (الكلاسات الابنة) تحديد كيف ستقومون بتنفيذ هذه المهام!" 📋
🛠️ كيف ننشئ Abstract Class؟
لجعل الكلاس مجرداً، نستخدم الكلمة المحجوزة abstract قبل كلمة class.
مثال بسيط جداً:
<?php
// تعريف كلاس مجرد
abstract class Vehicle {
// خاصية عامة لجميع المركبات
public $brand;
// ميثود عادية (مكتملة) يمكن لجميع الأبناء استخدامها
public function setBrand($name) {
$this->brand = $name;
}
// ميثود مجردة (غير مكتملة) - يجب على الأبناء كتابة تفاصيلها
abstract public function move();
}
?>
لاحظ هنا:
- استخدمنا
abstract class Vehicleلتعريف الكلاس. - الميثود
setBrandهي ميثود عادية لأن كل المركبات تملك اسماً تجارياً بنفس الطريقة. - الميثود
move()هي Abstract Method؛ لاحظ أننا لم نضع لها أقواساً{}ولم نكتب كوداً بداخلها، بل انتهت بفاصلة منقوطة;. هذا يعني أننا نجبر أي كلاس يرث منVehicleأن يكتب دالةmoveالخاصة به.
⚠️ القاعدة الذهبية: لا يمكنك إنشاء Object من Abstract Class
بما أن الفئة المجردة هي مجرد "مخطط" وليست شيئاً مكتملاً، فإن PHP تمنعك من إنشاء كائن منها.
❌ هذا الكود سيسبب خطأ (Error):
$myCar = new Vehicle(); // خطأ! لا يمكن إنشاء كائن من كلاس مجرد
🚀 تطبيق عملي: كيف نرث من Abstract Class؟
الآن، لنقم بإنشاء كلاسات حقيقية ترث من هذا المخطط. سننشئ كلاس للسيارة وكلاس للدراجة.
<?php
// المخطط الأساسي
abstract class Vehicle {
public $brand;
public function setBrand($name) {
$this->brand = $name;
}
abstract public function move();
}
// كلاس السيارة يرث من Vehicle
class Car extends Vehicle {
// تنفيذ الميثود المجردة إجباري هنا
public function move() {
return "The car " . $this->brand . " moves on four wheels! 🚗";
}
}
// كلاس الدراجة يرث من Vehicle
class Bike extends Vehicle {
// تنفيذ الميثود المجردة إجباري هنا أيضاً
public function move() {
return "The bike " . $this->brand . " moves on two wheels! 🏍️";
}
}
// الآن يمكننا إنشاء كائنات من الكلاسات المكتملة
$myCar = new Car();
$myCar->setBrand("Toyota");
echo $myCar->move(); // المخرجات: The car Toyota moves on four wheels!
echo "\n";
$myBike = new Bike();
$myBike->setBrand("Yamaha");
echo $myBike->move(); // المخرجات: The bike Yamaha moves on two wheels!
?>
💡 ملخص سريع لما تعلمناه:
- Abstract Class: هو كلاس لا يمكن إنشاء Object منه، ويستخدم كقاعدة للكلاسات الأخرى.
- Abstract Method: هي دالة تُعرف في الكلاس المجرد بدون محتوى، وتجبر الكلاسات الوارثة على كتابة تنفيذ (Implementation) خاص بها.
- الهدف: ضمان أن جميع الكلاسات التي تنتمي لنفس النوع تمتلك دوال أساسية محددة، مما يجعل الكود منظماً وسهل الصيانة.
⏭️ ماذا سنتعلم في الدرس القادم؟
بعد أن تعلمنا كيف نضع "قواعد" للكلاسات باستخدام الـ Abstract Classes، سننتقل لموضوع آخر يشبهه كثيراً ولكن بمرونة أكبر، وهو الواجهات (Interfaces). سنتعلم الفرق بينها وبين الفئات المجردة ومتى نستخدم كل واحدة منهما. نراكم هناك! 👋
🎓 اختبر معلوماتك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال