🚀 اكتشف قوة الواجهات (Interfaces) في PHP: دليلك الشامل
بعد أن تعلمت كيف تبني الكلاسات وتستخدم الوراثة، حان الوقت لنتعرف على مفهوم قوي جداً في البرمجة كائنية التوجه (OOP) وهو الواجهات (Interfaces).
تخيل أن الواجهة هي بمثابة "عقد" أو "اتفاقية" تفرضها على أي كلاس يقرر استخدامها. هي لا تخبر الكلاس "كيف" يفعل الشيء، بل تخبره "ماذا" يجب أن يفعل.
❓ ما هي الواجهة (Interface) ببساطة؟ 🤔
الواجهة هي كلاس خاص، لكنه يختلف عن الكلاس العادي في أنه لا يحتوي على أي تنفيذ للدوال. بمعنى آخر، الواجهة تحتوي فقط على "أسماء الدوال" وبدون كتابة أي كود داخل هذه الدوال.
لماذا نحتاج إليها؟
تخيل أنك تعمل في فريق برمجي كبير، وتريد التأكد من أن كل مبرمج يقوم بكتابة دالة معينة (مثل دالة save) بنفس الاسم في كل الكلاسات التي تتعامل مع قواعد البيانات، سواء كانت MySQL أو MongoDB. هنا تأتي الواجهة لتجبر الجميع على الالتزام بهذا الاسم.
🛠️ كيف نقوم بتعريف الواجهة؟
لتعريف واجهة، نستخدم الكلمة المحجوزة interface بدلاً من class.
ملاحظات هامة جداً:
- جميع الدوال داخل الواجهة يجب أن تكون
public. - لا يمكننا كتابة أي كود (Logic) داخل دالة الواجهة، فقط نضع اسم الدالة وننهيها بفاصلة منقوطة
;. - لا يمكن إنشاء كائن (Object) مباشرة من الواجهة.
مثال توضيحي بسيط:
<?php
// Defining the interface
interface AnimalInterface {
public function makeSound(); // No body, just the signature
public function eat(); // Just a requirement
}
?>
🤝 كيف نستخدم الواجهة في الكلاسات؟ (Implementation)
لكي يلتزم الكلاس باتفاقية الواجهة، نستخدم الكلمة المحجوزة implements بدلاً من extends.
⚠️ تنبيه هام: إذا قرر الكلاس أن "يُنفذ" (implement) واجهة معينة، فهو مضطر لكتابة جميع الدوال الموجودة في تلك الواجهة وبنفس أسمائها، وإلا سيحدث خطأ في البرنامج.
لنطبق ذلك عملياً:
<?php
// The interface (The Contract)
interface AnimalInterface {
public function makeSound();
public function eat();
}
// Dog class implementing the interface
class Dog implements AnimalInterface {
public function makeSound() {
echo "The dog says: Woof Woof! 🐶";
}
public function eat() {
echo "The dog is eating meat... 🍖";
}
}
// Cat class implementing the interface
class Cat implements AnimalInterface {
public function makeSound() {
echo "The cat says: Meow Meow! 🐱";
}
public function eat() {
echo "The cat is eating fish... 🐟";
}
}
// Testing the code
$myDog = new Dog();
$myDog->makeSound(); // Output: The dog says: Woof Woof!
echo "\n";
$myCat = new Cat();
$myCat->makeSound(); // Output: The cat says: Meow Meow!
?>
💡 لماذا نستخدم implements وليس extends؟
قد تتساءل: "لماذا لا نستخدم الوراثة العادية (Inheritance)؟". الإجابة تكمن في المرونة:
- تعدد الواجهات: الكلاس في PHP يمكنه أن يرث من كلاس واحد فقط (
extendsواحدة)، ولكنه يستطيع تنفيذ عدة واجهات في نفس الوقت! - التوحيد: الواجهة تضمن أن أي كلاس (مهما كان نوعه) يمتلك مجموعة محددة من الوظائف.
مثال على تنفيذ أكثر من واجهة:
<?php
interface Movable {
public function move();
}
interface Soundable {
public function makeNoise();
}
// A Car can move and make noise
class Car implements Movable, Soundable {
public function move() {
echo "The car is driving on the road... 🚗";
}
public function makeNoise() {
echo "The car goes: Vroom Vroom! 🔊";
}
}
$myCar = new Car();
$myCar->move();
?>
✅ ملخص سريع للدرس
- الواجهة (Interface): هي عقد يحدد الدوال التي يجب أن تتوفر في الكلاس.
- التعريف: نستخدم
interface Animal { ... }. - التنفيذ: نستخدم
class Dog implements Animal { ... }. - القاعدة الذهبية: أي دالة في الواجهة يجب أن يتم كتابة كودها بالكامل داخل الكلاس الذي ينفذها.
- الميزة الكبرى: يمكن للكلاس الواحد تنفيذ أكثر من واجهة.
🎓 اختبر معلوماتك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال