Menu
Coddy logo textTech

מימוש ממשקים

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

עכשיו, כשאתה מבין מהן ממשקים, בוא נראה איך מממשים אותם בפועל. מחלקה מממשת ממשק באמצעות מילת המפתח implements, וחייבת לספק מימושים קונקרטיים לכל המתודות שהוצהרו בממשק הזה.

<?php
interface Printable {
    public function print();
}

class Document implements Printable {
    private $content;
    
    public function __construct($content) {
        $this->content = $content;
    }
    
    public function print() {
        return "Printing: " . $this->content;
    }
}

$doc = new Document("Hello World");
echo $doc->print();

פלט:

Printing: Hello World

המחלקה Document מממשת את Printable באמצעות אספקת גרסה משלה למתודה print(). אם תשכחו לממש מתודה נדרשת, PHP תזרוק שגיאה קטלנית.

מחלקות שונות יכולות לממש את אותו ממשק בדרכן:

<?php
class Invoice implements Printable {
    private $amount;
    
    public function __construct($amount) {
        $this->amount = $amount;
    }
    
    public function print() {
        return "Invoice Total: $" . $this->amount;
    }
}

$invoice = new Invoice(150);
echo $invoice->print();

פלט:

Invoice Total: $150

גם Document וגם Invoice מממשות את החוזה Printable, אך כל אחת מטפלת בהדפסה באופן שונה בהתאם למטרתה.

נקודה חשובה: השתמשו ב־implements כדי לחבר מחלקה לממשק, ואז הגדירו את כל המתודות הנדרשות. כל מחלקה שמממשת את הממשק מספקת לוגיקה משלה, תוך הבטחה שאותן חתימות מתודות קיימות.

challenge icon

אתגר

קל

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

תיצרו שלושה קבצים שפועלים יחד כדי לטפל בסוגים שונים של הודעות:

  • Messageable.php: הגדירו את הממשק Messageable עם חתימות של שתי מתודות: compose($content) ו-deliver(). הממשק הזה מגדיר את החוזה שכל סוגי ההודעות צריכים לקיים.
  • Email.php: צרו מחלקה Email שמממשת את Messageable. כללו את קובץ הממשק בראש הקובץ. למחלקה צריכות להיות התכונה הפרטית $recipient והתכונה הפרטית $body. הבנאי מקבל את כתובת הנמען. ממשו את compose($content) כך שתשמור את התוכן ב-$body ותחזיר "Email composed". ממשו את deliver() כך שתחזיר "Email to [recipient]: [body]".
  • SMS.php: צרו מחלקה SMS שמממשת גם היא את Messageable. כללו את קובץ הממשק בראש הקובץ. למחלקה צריכות להיות התכונה הפרטית $phoneNumber והתכונה הפרטית $text. הבנאי מקבל את מספר הטלפון. ממשו את compose($content) כך שתשמור את התוכן ב-$text ותחזיר "SMS composed". ממשו את deliver() כך שתחזיר "SMS to [phoneNumber]: [text]".

ב-main.php, כללו את שני הקבצים Email ו-SMS. תקבלו שלוש קלטים: כתובת דוא"ל, מספר טלפון ותוכן הודעה. צרו אובייקט Email עם כתובת הדוא"ל ואובייקט SMS עם מספר הטלפון. קראו ל-compose() עם תוכן ההודעה בשני האובייקטים, והדפיסו כל תוצאה בשורה נפרדת. לאחר מכן קראו ל-deliver() בשני האובייקטים, והדפיסו כל תוצאה בשורה נפרדת. הסדר צריך להיות: חיבור הודעת דוא"ל, חיבור הודעת SMS, מסירת הודעת דוא"ל, מסירת הודעת SMS.

שתי המחלקות מקיימות את אותו חוזה Messageable, אבל כל אחת מטפלת בחיבור ובהעברת הודעות בהתאם למטרה שלה: הודעות דוא"ל מציגות את כתובת הנמען, ואילו הודעות SMS מציגות את מספר הטלפון.

נסו בעצמכם

<?php
require_once 'Email.php';
require_once 'SMS.php';

// קראו את הקלטים
$emailAddress = trim(fgets(STDIN));
$phoneNumber = trim(fgets(STDIN));
$messageContent = trim(fgets(STDIN));

// TODO: צרו אובייקט Email עם כתובת האימייל

// TODO: צרו אובייקט SMS עם מספר הטלפון

// TODO: קראו ל־compose() בשני האובייקטים והדפיסו את התוצאות
// סדר: compose של email, ואז compose של SMS

// TODO: קראו ל־deliver() בשני האובייקטים והדפיסו את התוצאות
// סדר: deliver של email, ואז deliver של SMS
?>
quiz iconבחנו את עצמכם

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

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

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