מבוא לממשקים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 27 מתוך 91.
ממשק מגדיר חוזה שמחלקות חייבות לפעול לפיו. בניגוד למחלקות מופשטות שיכולות להכיל גם מתודות מופשטות וגם מתודות ממומשות, ממשק רק מצהיר על חתימות של מתודות ללא מימוש. אפשר לחשוב עליו כהבטחה: כל מחלקה שמממשת ממשק מבטיחה לספק את המתודות המסוימות האלה.
מגדירים ממשק באמצעות מילת המפתח interface:
<?php
interface Printable {
public function print();
}
הממשק הזה מצהיר שכל מחלקה שמממשת את Printable חייבת לכלול מתודה בשם print(). הממשק לא מתעניין באופן שבו המתודה פועלת, אלא רק בכך שהיא קיימת.
הנה דוגמה פשוטה שמציגה את המבנה הבסיסי:
<?php
interface Drivable {
public function start();
public function stop();
}
שימו לב שלמתודות בממשק אין גוף, אלא רק חתימה שמסתיימת בנקודה-פסיק. כל המתודות בממשק הן ציבוריות באופן משתמע, ולכן אי אפשר להשתמש ב־private או ב־protected.
ממשקים הם רבי־עוצמה, כי הם מאפשרים למחלקות שאינן קשורות לחלוק התנהגות משותפת. ייתכן של־Car ול־Motorcycle אין שום דבר משותף מבחינת ירושה, אבל שתיהן יכולות לממש את Drivable כדי להבטיח שיש להן את המתודות start() ו־stop().
נקודה מרכזית: ממשק מגדיר אילו מתודות חייבות להיות למחלקה, ולא כיצד עליהן לפעול. הוא קובע חוזה שמחלקות המממשות אותו חייבות לקיים.
אתגר
קלבואו נבנה מערכת הודעות פשוטה שתכיר לך ממשקים. תגדיר ממשק שמבסס חוזה לאופן שבו יש לטפל בהודעות, וכך תניח את היסודות למחלקות המממשות שתיצור בשיעור הבא.
תארגן את הקוד שלך בשני קבצים:
Messageable.php: הגדר ממשק בשםMessageableשמצהיר על שתי חתימות של מתודות:compose($content)ליצירת הודעה, ו-deliver()לשליחתה. זכור, למתודות בממשק אין גוף, אלא רק חתימה שמסתיימת בנקודה-פסיק.main.php: כלול את הקובץ Messageable. כדי לוודא שהממשק שלך הוגדר כראוי, השתמש בפונקציהinterface_exists()של PHP כדי לבדוק אםMessageableקיים. לאחר מכן השתמש ב-ReflectionClassכדי לבדוק את הממשק שלך ולהציג את המתודות שלו. צור אובייקט Reflection של הממשק שלך, קבל את המתודות שלו באמצעותgetMethods()(שמחזירה אובייקטים מסוגReflectionMethod), והדפס אתgetName()של כל מתודה בשורה נפרדת.
הפלט שלך צריך להציג את שמות שתי המתודות שעליהן הממשק שלך מצהיר, כל אחת בשורה נפרדת, לפי הסדר שבו הגדרת אותן.
האתגר הזה מתמקד אך ורק בהגדרת ממשק: החוזה שמחלקות עתידיות יצטרכו לקיים. אתה מגדיר אילו מתודות חייבות להתקיים, בלי לדאוג לאופן פעולתן. המימוש יגיע בשיעור הבא!
נסו בעצמכם
<?php
// כלול את הקובץ של הממשק Messageable
require_once 'Messageable.php';
// TODO: השתמש ב-interface_exists() כדי לבדוק אם הממשק Messageable קיים
// TODO: צור אובייקט ReflectionClass עבור הממשק Messageable
// TODO: קבל את המתודות באמצעות getMethods()
// TODO: עבור על המתודות והדפס את השם של כל מתודה בשורה נפרדת
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין