تنفيذ واجهات متعددة
جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 29 من 91.
على عكس الوراثة حيث يمكن لـ class أن يقوم بـ extend لأب واحد فقط، تتيح PHP لـ class تنفيذ interfaces متعددة. يمنحك هذا المرونة لدمج عقود مختلفة، مما يجعل الـ classes الخاصة بك أكثر تنوعاً.
لتنفيذ واجهات متعددة، قم بالفصل بينها بفواصل بعد الكلمة المفتاحية implements:
<?php
interface Printable {
public function print();
}
interface Savable {
public function save();
}
class Report implements Printable, Savable {
private $title;
public function __construct($title) {
$this->title = $title;
}
public function print() {
return "Printing: " . $this->title;
}
public function save() {
return "Saving: " . $this->title;
}
}
$report = new Report("Sales Report");
echo $report->print() . "\n";
echo $report->save();
المخرجات:
Printing: Sales Report
Saving: Sales Reportتقوم فئة Report باستيفاء كلا العقدين من خلال تنفيذ جميع الأساليب (methods) من Printable و Savable. يجب عليك توفير تنفيذات لكل أسلوب تم التصريح عنه في كل واجهة (interface).
هذا النهج قوي لأنه يتيح لك بناء فئات (classes) تلبي متطلبات متعددة دون قيود الوراثة الأحادية. يمكن أن تكون الفئة قابلة للطباعة، وقابلة للحفظ، وقابلة للتصدير، وأكثر من ذلك، كل ذلك في وقت واحد.
نقطة رئيسية: استخدم الفواصل لتنفيذ واجهات (interfaces) متعددة. يجب أن توفر الـ class الخاصة بك تطبيقات ملموسة لجميع الـ methods من كل interface تقوم بتنفيذها.
التحدي
سهللنقم ببناء نظام ملفات وسائط يوضح كيف يمكن لفئة واحدة تنفيذ واجهات متعددة لاكتساب قدرات مختلفة.
ستقوم بإنشاء أربعة ملفات تعمل معاً للتعامل مع ملفات الوسائط التي يمكن تشغيلها ومشاركتها في آن واحد:
Playable.php— قم بتعريف واجهةPlayableمع توقيع دالة واحدة:play(). يضمن هذا العقد إمكانية بدء أي وسائط قابلة للتشغيل.Shareable.php— قم بتعريف واجهةShareableمع توقيع دالة واحدة:share($platform). يضمن هذا العقد إمكانية توزيع أي محتوى قابل للمشاركة على منصات مختلفة.Video.php— قم بإنشاء فئةVideoتنفذ كلاً منPlayableوShareable. قم بتضمين ملفي الواجهات في الأعلى. يجب أن تحتوي الفئة على خاصية خاصة$titleوخاصية خاصة$duration(بالدقائق). يقبل المنشئ (constructor) العنوان والمدة. قم بتنفيذplay()لتعيد"Playing video: [title] ([duration] min)". قم بتنفيذshare($platform)لتعيد"Sharing [title] on [platform]".main.php— قم بتضمين ملف Video. ستتلقى ثلاثة مدخلات: عنوان الفيديو، والمدة (كسلسلة نصية لتحويلها إلى عدد صحيح)، واسم المنصة. قم بإنشاء كائنVideoبالعنوان والمدة. اطبع نتيجة استدعاءplay()في السطر الأول، ثم اطبع نتيجة استدعاءshare()مع المنصة في السطر الثاني.
تلبي فئة Video الخاصة بك عقدين منفصلين في وقت واحد — حيث يمكن تشغيلها مثل أي وسائط، ويمكن مشاركتها على المنصات الاجتماعية. هذه هي قوة تنفيذ واجهات متعددة: تكتسب فئة واحدة قدرات من مصادر مختلفة دون أن تقتصر على سلسلة وراثة واحدة.
ورقة مرجعية
يمكن للفئة (class) تنفيذ واجهات متعددة عن طريق الفصل بينها بفواصل بعد الكلمة المفتاحية implements:
<?php
interface Printable {
public function print();
}
interface Savable {
public function save();
}
class Report implements Printable, Savable {
public function print() {
return "Printing report";
}
public function save() {
return "Saving report";
}
}يجب أن توفر الفئة تنفيذات ملموسة لجميع الأساليب (methods) من كل واجهة تقوم بتنفيذها. يتيح ذلك للفئة الوفاء بعقود متعددة في وقت واحد دون قيود الوراثة الفردية.
جرّب بنفسك
<?php
// تضمين ملف الفيديو
require_once 'Video.php';
// قراءة المدخلات
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));
// TODO: إنشاء كائن فيديو (Video object) بالعنوان والمدة
// TODO: طباعة نتيجة استدعاء play() في السطر الأول
// TODO: طباعة نتيجة استدعاء share() مع المنصة في السطر الثاني
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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)