מימוש של כמה ממשקים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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. עליך לספק מימוש לכל מתודה שהוצהרה בכל אחד מהממשקים.
הגישה הזו עוצמתית, כי היא מאפשרת לך לבנות מחלקות שעומדות בדרישות מרובות ללא המגבלות של ירושה יחידה. מחלקה יכולה להיות ניתנת להדפסה, לשמירה, לייצוא ועוד, הכול בו-זמנית.
נקודה מרכזית: השתמשו בפסיקים כדי לממש כמה ממשקים. המחלקה שלכם חייבת לספק מימושים קונקרטיים לכל המתודות מכל ממשק שהיא מממשת.
אתגר
קלנבנה מערכת קובצי מדיה שמדגימה כיצד מחלקה אחת יכולה לממש כמה ממשקים כדי לרכוש יכולות שונות.
תיצור ארבעה קבצים שפועלים יחד כדי לטפל בקובצי מדיה שאפשר גם להפעיל וגם לשתף:
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() עם הפלטפורמה
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין