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

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

מתודות קסם וקבועי קסם ב-PHP

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

PHP מונחה עצמים מציע מספר מתודות קסם וקבועי קסם, שמבצעים פעולות נפוצות, תמורת עלות מסוימת בביצועים. במדריך זה אציג שלוש דוגמאות שימושיות ביותר, ובכלל כך את מתודות הקסם __construct() ו-__destruct(), ואת קבוע הקסם __CLASS__.

 

מתודת הקסם __construct()

מתודת הקסם __construct() (השם מתחיל בשני קווים תחתונים) יכולה לבצע את הפעולות הרצויות לנו מיד כשיוצרים אובייקט מהמחלקה. בקלאס הפשוט הבא, המתודה __construct() צריכה לקבל את ערך המשתנה $model

class Car
  private $model;
  public function __construct($model){
    $this -> model = $model;
  }
}

עכשיו מיד כשניצור את האובייקט עלינו להעביר לו את ערך המשתנה $model.

$newCar = new Car('מרצדס');

נציג דוגמה יותר שלמה:

<?php
class Car{
  private $model;
  //__construct
  public function __construct($model){
      $this -> model = $model;
     echo ' נבנה ' . __CLASS__ . ' האובייקט ' . '<br />';
  }
 
  public function getCarModel(){
    return ' מודל המכונית: ' . $this -> model;
  }
}
//מיד כשיוצרים את האובייקט מעבירים לו את ערך המשתנה
$newCar = new Car('מרצדס');
 
echo $newCar -> getCarModel();
?>

והתוצאה:

האובייקט Carנבנה
מודל המכונית: מרצדס

 

שימו לב לבעיה שזה יוצר, מפני שבמידה ולא נעביר פרמטר לקונסטרקטור נקבל שגיאה פטאלית. כדי למנוע את זה, נגדיר ערך דיפולטי שאותו תקבל הפונקציה __construct(). כדוגמת מחרוזת ריקה, $model = ''. אפשרות אחרת היא להגדיר את הדיפולט כ-NULL, ואז להשתמש בתנאי לוגי, שמגדיר את ערך התכונה רק אם הועבר הפרמטר. ראו דוגמה:

<?php
class Car{
  private $model = '';
  //__construct
  public function __construct($model = NULL ){
    if($model){
    $this -> model = $model;
    }
    echo ' נבנה ' . __CLASS__ . ' האובייקט ' . '<br />';
  }
 
  public function getCarModel(){
    return ' מודל המכונית: ' . $this -> model;
  }
}
//מיד כשיוצרים את האובייקט מעבירים לו את ערך המשתנה
$newCar = new Car('מרצדס');
 
echo $newCar -> getCarModel();
?>

 

קבועי קסם

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

קבועי קסם נוספים שעשויים להועיל, בפרט לצרכי דיבוג של הקוד, הם __FILE__ שהוא הנתיב המלא לקובץ, ו-__DIR__ שהוא הנתיב המלא לתיקייה שבה יושב הקוד.

 

eBook cover The essentials of Object Oriented PHP

 

מתודת הקסם __destruct()

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

<?php
class Car{
  private $model;
  //__construct
  public function __construct($model = NULL){
   if($model){
     $this -> model = $model;
   }
    echo ' נבנה ' . __CLASS__ . ' האובייקט ' . '<br />';
  }
  //__destruct
  public function __destruct(){
    echo ' נהרס ' . __CLASS__ . <br />';
  }
 
  public function getCarModel(){
    return ' מודל המכונית: ' . $this -> model . '<br />';
  }
}
//מיד כשיוצרים את האובייקט מעבירים לו את ערך המשתנה
$newCar = new Car('מרצדס');
 
echo $newCar -> getCarModel();
 
echo 'סוף הדף' . '<br />';  
echo '<br /><br />';
?>

והתוצאה:

האובייקט Car נבנה
מודל המכונית: מרצדס
סוף הדף
 
Car נהרס

 

הרס יזום של אובייקט באמצעות unset

כפי שראינו בדוגמה בסעיף הקודם, אובייקט מגיע לסוף חייו באופן אוטומטי, אחרי שהדף שבו הוא נמצא מסתיים. בנוסף, ביכולתנו ליזום את הרס האובייקט באמצעות unset(), הכולל את שמו של האובייקט. (שימו לב ש-unset אינו מתודת קסם אלא פונקציה רגילה שמספק לנו PHP). לדוגמה, כך עושים unset של האובייקט $newCar.

unset($newCar);

נראה את דוגמת הקוד הבאה:

<?php
class Car{
  private $model;
  //__construct
  public function __construct($model){
    $this -> model = $model;
    echo ' נבנה ' . __CLASS__ . ' האובייקט ' . '<br />';
  }
  //__destruct
  public function __destruct(){
    echo ' נהרס ' . __CLASS__ . <br />';
  }
 
  public function getCarModel(){
    return ' מודל המכונית: ' . $this -> model . <br />';
  }
}
//מיד כשיוצרים את האובייקט מעבירים לו את ערך המשתנה
$newCar = new Car('מרצדס');
 
echo $newCar -> getCarModel();
 
//הרס האובייקט
unset($newCar);

echo 'סוף הדף' . '<br />';
 
echo '<br /><br />';  
?>

והתוצאה:

האובייקט Car נבנה
מודל המכונית: מרצדס
Car נהרס
סוף הדף

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

 

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

 

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

eBook cover The essentials of Object Oriented PHP

 

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

 

 

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

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

 

 

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

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

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

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

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

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

 

 

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

איך קוראים בעברית לצ`ופצ`יק של הקומקום?