תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

PHP - שימוש ב-interface בתור רמז לסוג

מחבר:
בתאריך:

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

לצורך ההסבר, נתחיל ברמז לסוג מחלקה, ונפתח אותו לרמז לסוג interface.

את המדריך מלווה קובץ טקסט שכולל את כל הקוד ששימש בהכנת המדריך, ומומלץ להיעזר בו. את הקובץ ניתן להוריד מכאן:

להורדה

 

רמז לסוג מחלקה

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

זו המחלקה, והנפח מחושב מהכפלת הגובה (height) בריבוע אורך הבסיס (rib):

class Bmw
{
  private $model;
  private $rib;
  private $height;
  
  public function __construct($model, $rib, $height)
  {
    $this->model = $model;
    $this->rib = $rib;
    $this->height = $height;
  }
  
  public function calcTankVolume()
  {
    return $this->rib*$this->rib*$this->height;
  }
}

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

function calcTankPrice(Bmw $bmw)
{
  echo $bmw->calcTankVolume()*7.4;
}

ועכשיו ניתן לחשב בבטחה את עלות טנק הדלק עבור רכבי BMW. בדוגמה, חישוב עבור רכב שהמודל שלו '62182791' ומידות טנק הדלק 2 ו-10:

$bmw = new Bmw('62182791',2,10);
calcTankPrice($bmw);//296

 

eBook cover The essentials of Object Oriented PHP

 

רמז לסוג interface

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

class Mercedes
{
  private $model;
  private $radius;
  private $height;
  
  public function __construct($model, $radius, $height)
  {
    $this->model = $model;
    $this->radius = $radius;
    $this->height = $height;
  }
  
  public function calcTankVolume()
  {
    return $this->radius*$this->radius*pi()*$this->height;
  }
}

אבל, אם ננסה להעביר לפונקציה calcTankPrice אובייקט מסוג Mercedes נתקל בבעיה, מפני שהפונקציה יודעת לקבל רק אובייקטים ששייכים למחלקה Bmw, וניסיון להעביר אובייקט מסוג אחר יגרום לשגיאה. כדי לפתור את הבעיה, צריך להשתמש ב-interface שיהיה משותף ל-Bmw ול-Mercedes. לדוגמה, interface ששמו Car:

interface Car
{
  public function calcTankVolume();
}

נדאג ששתי המחלקות יישמו את ה-interface:

class Bmw implements Car
{
  //….
}
class Mercedes implements Car
{
  //…
}

מה שיאפשר לנו להשתמש ב-interface בתור רמז לסוג בפונקציה calcTankPrice, ולקבל תוצאות עבור Mercedes, BMW, וכל מחלקה שתיישם את ה-interface.

function calcTankPrice(Car $bmw)
{
  echo $bmw->calcTankVolume()*7.4;
}
  
$bmw = new Bmw('62182791',2,10);
calcTankPrice($bmw);//296
  
$merc = new Mercedes('62182794',1,9);
calcTankPrice($merc);//209.23007072908

 

לסיכום

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

 

המדריך מבוסס על "The essentials of Object Oriented PHP" שמלמד PHP מונחה עצמים באמצעות דוגמאות ותרגילים הקליקו על התמונה כדי לרכוש את ה-eBook:

eBook cover The essentials of Object Oriented PHP

 

לכל מדריכי ה-PHP מונחה עצמים

 

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

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

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

שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.

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

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

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

דג למים הוא כמו ציפור ל...?