Menu
Coddy logo textTech

מימוש של כמה ממשקים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 29 מתוך 91.

בניגוד לירושה, שבה מחלקה יכולה להרחיב רק מחלקת אב אחת, PHP מאפשרת למחלקה לממש כמה ממשקים. כך יש לך גמישות לשלב חוזים שונים ולהפוך את המחלקות שלך לרב־תכליתיות יותר.

כדי לממש כמה ממשקים, הפרידו ביניהם באמצעות פסיקים אחרי מילת המפתח 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 מקיימת את שני החוזים באמצעות מימוש כל המתודות של Printable ושל Savable. עליך לספק מימוש לכל מתודה שהוצהרה בכל אחד מהממשקים.

הגישה הזו עוצמתית, כי היא מאפשרת לך לבנות מחלקות שעומדות בדרישות מרובות ללא המגבלות של ירושה יחידה. מחלקה יכולה להיות ניתנת להדפסה, לשמירה, לייצוא ועוד, הכול בו-זמנית.

נקודה מרכזית: השתמשו בפסיקים כדי לממש כמה ממשקים. המחלקה שלכם חייבת לספק מימושים קונקרטיים לכל המתודות מכל ממשק שהיא מממשת.

challenge icon

אתגר

קל

נבנה מערכת קובצי מדיה שמדגימה כיצד מחלקה אחת יכולה לממש כמה ממשקים כדי לרכוש יכולות שונות.

תיצור ארבעה קבצים שפועלים יחד כדי לטפל בקובצי מדיה שאפשר גם להפעיל וגם לשתף:

  • Playable.php: הגדר ממשק Playable עם חתימת מתודה יחידה: play(). חוזה זה מבטיח שאפשר להפעיל כל מדיה הניתנת להפעלה.
  • Shareable.php: הגדר ממשק Shareable עם חתימת מתודה יחידה: share($platform). חוזה זה מבטיח שאפשר להפיץ כל תוכן הניתן לשיתוף לפלטפורמות שונות.
  • Video.php: צור מחלקה בשם Video שמממשת גם את Playable וגם את Shareable. כלול את שני קובצי הממשק בתחילת הקובץ. למחלקה צריכות להיות תכונה פרטית $title ותכונה פרטית $duration (בדקות). הבנאי מקבל את הכותרת ואת משך הזמן. ממש את play() כך שתחזיר "Playing video: [title] ([duration] min)". ממש את share($platform) כך שתחזיר "Sharing [title] on [platform]".
  • main.php: כלול את קובץ Video. יתקבלו שלוש קלטים: כותרת הסרטון, משך הזמן (כמחרוזת שיש להמיר למספר שלם) ושם של פלטפורמה. צור אובייקט Video עם הכותרת ומשך הזמן. הדפס את התוצאה של קריאה ל־play() בשורה הראשונה, ואז הדפס את התוצאה של קריאה ל־share() עם הפלטפורמה בשורה השנייה.

המחלקה Video שלך מקיימת שני חוזים נפרדים בו־זמנית. אפשר להפעיל אותה כמו כל מדיה, ואפשר לשתף אותה בפלטפורמות חברתיות. זהו הכוח שבמימוש כמה ממשקים: מחלקה יחידה רוכשת יכולות ממקורות שונים, בלי להיות מוגבלת לשרשרת ירושה יחידה.

נסו בעצמכם

<?php
// כלול את הקובץ Video
require_once 'Video.php';

// קרא את הקלטים
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));

// TODO: צור אובייקט Video עם הכותרת ומשך הזמן

// TODO: הדפס בשורה הראשונה את התוצאה של הקריאה ל-play()

// TODO: הדפס בשורה השנייה את התוצאה של הקריאה ל-share() עם הפלטפורמה

?>
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר PHP אונליין