נגישות       נגישות
שינוי גודל טקסט:
א א א
שינוי צבעי האתר:
? מקשי קיצור:

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

הפעלת מקשי הקיצור תלויה בדפדפן שבו אתם משתמשים.

Internet Explorer, Chrome ובגרסאות ישנות של Firefox: לחצו על מקש Alt ועל מקש המספר או האות על-פי הרשימה. ב Firefox 3 ומעלה: לחצו על המקשים Alt + Shift + המספר או האות.

S - עבור לתוכן הדף
L - חיפוש
1- עמוד הבית
2 - פרוייקטים
3 - מדריכים
4 - אודות
5 - צרו קשר
6 - הצהרת נגישות
 

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 מונחה עצמים

 

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

 

= 7 + 7