Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تنفيذ واجهات متعددة

جزء من قسم 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 تقوم بتنفيذها.

challenge icon

التحدي

سهل

لنقم ببناء نظام ملفات وسائط يوضح كيف يمكن لفئة واحدة تنفيذ واجهات متعددة لاكتساب قدرات مختلفة.

ستقوم بإنشاء أربعة ملفات تعمل معاً للتعامل مع ملفات الوسائط التي يمكن تشغيلها ومشاركتها في آن واحد:

  • 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() مع المنصة في السطر الثاني

?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming