מימוש ממשקים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 כדי לחבר מחלקה לממשק, ואז הגדירו את כל המתודות הנדרשות. כל מחלקה שמממשת את הממשק מספקת לוגיקה משלה, תוך הבטחה שאותן חתימות מתודות קיימות.
אתגר
קלבואו נבנה מערכת הודעות שמדגימה איך מחלקות שונות יכולות לממש את אותו ממשק בדרכים ייחודיות משלהן.
תיצרו שלושה קבצים שפועלים יחד כדי לטפל בסוגים שונים של הודעות:
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
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח $thisמתודותמאפייניםבנאי (__construct)הורס (__destruct)חזרה: מחשבון פשוט4ירושה
ירושה בסיסיתמילת המפתח parent::דריסת מתודותמילת המפתח finalמחלקות מופשטותסיכום – היררכיית עובדים7כימוס
ציבורי, מוגן, פרטימפרטי גישה לעומקמתודות גישה ועדכוןהסתרת מידעקידום פרמטרים בבנאי (8.0)סיכום – מערכת רישומי תלמידים2מרחבי שמות וטעינה אוטומטית
מבוא למרחבי שמותמילת המפתח useתקן הטעינה האוטומטית PSR-4הטוען האוטומטי של Composerסיכום – פרויקט מאורגן5ממשקים וחוזים
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםממשק לעומת מחלקה מופשטתרמזי טיפוסים עם ממשקיםסיכום - מחשבון צורות8מתודות קסם
מבוא למתודות קסם__toString ו־__debugInfo__get, __set, __isset, __unset__call ו־__callStatic__clone ושיבוט אובייקטים__serialize ו־__unserializeסיכום – אוסף מותאם אישית3מאפייני מחלקה
מאפייני מופע לעומת מאפיינים סטטייםקבועים במחלקותמתודות ומאפיינים סטטייםמאפיינים פרטיים ומוגניםמאפיינים לקריאה בלבד (PHP 8.1)סיכום – מנהל חשבון בנק6פולימורפיזם
בחינה מחדש של דריסת מתודותפולימורפיזם באמצעות ממשקיםרמזי טיפוסים וטיפוסי איחודקישור סטטי מאוחרסיכום — מעבד תשלומיםתרגלו בעצמכם: קומפיילר PHP אונליין