مقدمة إلى الواجهات
جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 27 من 91.
تحدد الواجهة (interface) عقداً يجب على الأصناف (classes) اتباعه. وعلى عكس الأصناف المجردة (abstract classes) التي يمكن أن تحتوي على دوال مجردة وملموسة معاً، فإن الواجهة تعلن فقط عن تواقيع الدوال (method signatures) دون أي تنفيذ. فكر فيها كأنها وعد: أي صنف يقوم بتنفيذ واجهة يضمن أنه سيوفر تلك الدوال المحددة.
تُعرّف الواجهة باستخدام الكلمة المفتاحية interface:
<?php
interface Printable {
public function print();
}
تعلن هذه الواجهة أن أي فئة تقوم بتنفيذ Printable يجب أن تحتوي على دالة print(). لا تهتم الواجهة بكيفية عمل الدالة، بل تهتم فقط بوجودها.
إليك مثال بسيط يوضح الهيكل الأساسي:
<?php
interface Drivable {
public function start();
public function stop();
}
لاحظ أن أساليب الواجهة (interface methods) ليس لها جسم، بل مجرد التوقيع الذي ينتهي بفاصلة منقوطة. جميع الأساليب في الواجهة هي عامة (public) بشكل ضمني، لذا لا يمكنك استخدام private أو protected.
تعد الواجهات (Interfaces) قوية لأنها تسمح للفئات (classes) غير المرتبطة بمشاركة سلوك مشترك. قد لا يكون لـ Car و Motorcycle أي شيء مشترك من حيث الوراثة (inheritance)، ولكن يمكن لكليهما تنفيذ Drivable لضمان امتلاكهما لطريقتي (methods) start() و stop().
نقطة رئيسية: تحدد الواجهة (interface) ما هي الدوال (methods) التي يجب أن تمتلكها الفئة (class)، وليس كيفية عملها. فهي تضع عقداً يجب على الفئات المنفذة (implementing classes) الوفاء به.
التحدي
سهللنقم ببناء نظام رسائل بسيط يعرفك على الواجهات (interfaces). ستقوم بتعريف واجهة تضع عقداً لكيفية التعامل مع الرسائل، مما يضع الأساس للفئات المنفذة التي ستنشئها في الدرس القادم.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
Messageable.php— قم بتعريف واجهة تسمىMessageableتعلن عن توقيعين للدوال (method signatures):compose($content)لإنشاء رسالة، وdeliver()لإرسالها. تذكر أن دوال الواجهة ليس لها جسم (body) — فقط التوقيع الذي ينتهي بفاصلة منقوطة.main.php— قم بتضمين ملف Messageable. للتحقق من أن الواجهة الخاصة بك قد تم تعريفها بشكل صحيح، استخدم دالةinterface_exists()في PHP للتحقق مما إذا كانتMessageableموجودة. ثم استخدمReflectionClassلفحص الواجهة الخاصة بك وسرد دوالها. قم بإنشاء reflection لواجهتك، واحصل على دوالها باستخدامgetMethods()، واطبع اسم كل دالة في سطر مستقل.
يجب أن يعرض مخرجك اسمي الدالتين اللتين تعلن عنهما واجهتك، كل منهما في سطر منفصل، بالترتيب الذي قمت بتعريفهما به.
يركز هذا التحدي تماماً على تعريف الواجهة — العقد الذي ستحتاج الفئات المستقبلية إلى الوفاء به. أنت تحدد الدوال التي يجب أن تكون موجودة، دون القلق بشأن كيفية عملها. هذا التنفيذ سيأتي في الدرس القادم!
ورقة مرجعية
تُحدد الواجهة (interface) عقداً يجب على الفئات (classes) اتباعه. فهي تعلن فقط عن تواقيع الدوال (method signatures) دون أي تنفيذ (implementation).
قم بتعريف واجهة باستخدام الكلمة المفتاحية interface:
<?php
interface Printable {
public function print();
}
دوال الواجهة ليس لها جسم (body)، فقط التوقيع الذي ينتهي بفاصلة منقوطة. جميع الدوال في الواجهة تكون عامة (public) بشكل ضمني.
<?php
interface Drivable {
public function start();
public function stop();
}
تسمح الواجهات للفئات غير المرتبطة بمشاركة سلوك مشترك من خلال ضمان تنفيذها لدوال محددة.
جرّب بنفسك
<?php
// تضمين ملف واجهة Messageable
require_once 'Messageable.php';
// TODO: استخدم interface_exists() للتحقق مما إذا كانت واجهة Messageable موجودة
// TODO: قم بإنشاء كائن ReflectionClass لواجهة Messageable
// TODO: احصل على الطرق (methods) باستخدام getMethods()
// TODO: قم بالمرور عبر الطرق (methods) واطبع اسم كل طريقة في سطر منفصل
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsالكلمة المفتاحية $thisالـ Methodsالـ Propertiesالمنشئ (__construct)الهادم (__destruct)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةالكلمة المفتاحية parent::إعادة تعريف الدوال (Method Overriding)الكلمة المفتاحية finalالأصناف المجردة (Abstract Classes)مراجعة - هيكلية الموظفين7التغليف (Encapsulation)
العام، المحمي، الخاص (Public, Protected, Private)نظرة متعمقة على معدلات الوصولدوال Getters و Settersإخفاء المعلوماتميزة Constructor Promotion (8.0)مراجعة - نظام سجلات الطلاب10مفاهيم البرمجة كائنية التوجه المتقدمة
التركيب مقابل الوراثةحقن التبعيةالأصناف المجهولةالتعدادات (PHP 8.1)الألياف (PHP 8.1)تعمق في استنساخ الكائناتالمولدات والمكررات13أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودع2مساحات الأسماء والتحميل التلقائي
مقدمة إلى مساحات الأسماءالكلمة المفتاحية useمعيار التحميل التلقائي PSR-4أداة التحميل التلقائي Composerملخص - مشروع منظم5الواجهات والعقود
مقدمة إلى الواجهاتتنفيذ الواجهاتتنفيذ واجهات متعددةالواجهة مقابل الـ Abstract Classالـ Type Hinting مع الواجهاتملخص - حاسبة الأشكال8الميثودات السحرية (Magic Methods)
مقدمة في الميثودات السحرية__toString و __debugInfo__get, __set, __isset, __unset__call و __callStatic__clone واستنساخ الكائنات__serialize و __unserializeمراجعة - Custom Collection3خصائص الكلاس
خصائص الـ Instance مقابل الخصائص الساكنة (Static)الثوابت في الكلاساتالدوال والخصائص الساكنة (Static)الخصائص الخاصة (Private) والمحمية (Protected)خصائص للقراءة فقط (Readonly) في PHP 8.1مراجعة - مدير الحساب البنكي6تعدد الأشكال (Polymorphism)
مراجعة إعادة تعريف الدوال (Method Overriding)تعدد الأشكال عبر الـ Interfacesتلميح النوع (Type Hinting) وأنواع الاتحاد (Union Types)الربط الاستاتيكي المتأخر (Late Static Binding)ملخص - معالج الدفع (Payment Processor)