Menu
Coddy logo textTech

מבוא לממשקים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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().

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

challenge icon

אתגר

קל

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

תארגן את הקוד שלך בשני קבצים:

  • 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: עבור על המתודות והדפס את השם של כל מתודה בשורה נפרדת

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

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

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

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