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

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

תכונות ומתודות סטטיים

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

ב-PHP מונחה עצמים קיימים ארבעה מודיפיירים שעל שלושה מהם כבר כתבתי: public, protected, private , שתפקידם העיקרי להגדיר מי מורשה להשתמש בתכונה או במתודה בתוך מחלקה.

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

 

המודיפייר static

כדי להגדיר משתנים ומתודות כסטטיים משתמשים במילה השמורה static.

כדי לגשת למשתנה הסטטי משתמשים בפעמיים נקודתיים (::).
בדוגמה, הגישה למשתנה הסטטי static $num_cars
ולמתודה הסטטית static function new_bought_car()
שנמצאים בתוך המחלקה Cars נעשית באמצעות פעמיים נקודתיים:

Cars::new_bought_car("white");
Cars::$num_cars = 33;

הקוד:

<?php
class Cars{
  static $num_cars = 0;

  static function new_bought_car(){
    return "A new car was bought.<br />";
  }
}

echo Cars::new_bought_car();

echo Cars::$num_cars . "<br />";
Cars::$num_cars = 33;
echo Cars::$num_cars . "<br />";
?>

והתוצאה:

A new car was bought.
0
33

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

באותו אופן שניתן לגשת למשתנה ולמתודה סטטית מחוץ למחלקה, ניתן לגשת אליהם מתוך המחלקה. אולם בניגוד למתודות ולתכונות רגילות שדורשות $this מתודות ומשתנים סטטיים, דורשים פעמיים נקודותיים (scope resolution operator), ולפניהם self:

self::שם_מתודה
self::שם_תכונה

לדוגמה:

<?php
class Cars0{
  static $num_cars = 0;
 
  static function new_bought_car(){
    return "The number that goes with the car is: <strong>" . self::$num_cars . "</strong><br />";
  }
}
 
echo Cars0::new_bought_car();
?>

והתוצאה:

The number that goes with the car is: 0

 

eBook cover The essentials of Object Oriented PHP

 

משתנה סטטי שומר את הערך האחרון שהוצב לתוכו, ולכן ניתן להשתמש בו כמונה.

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

<?php
class Cars1{
  static $num_cars = 0;
 
  static function new_bought_car(){
    Cars1::$num_cars++;
    return "A new car was bought.<br />";
  }
}
echo Cars1::$num_cars . "<br />";
 
echo Cars1::new_bought_car();
echo Cars1::$num_cars . "<br />";
 
echo Cars1::new_bought_car();
echo Cars1::$num_cars . "<br />";
 
echo Cars1::new_bought_car();
echo Cars1::$num_cars . "<br />";
?>

והתוצאה:

0
A new car was bought.
1
A new car was bought.
2
A new car was bought.
3

בכל פעם שקוראים לפונקציה נוסף 1 למשתנה $num_cars שמתפקד עתה כמונה.

 

הורשה של משתנה סטטי

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

<?php
class CarsA{
  static $num_cars = 0;
}

class CarsB extends CarsA{
 
}
 
class CarsC extends CarsB{
 
}
 
CarsB::$num_cars = 22;
CarsC::$num_cars = 33;
 
echo "The grandfather's value is: " . CarsA::$num_cars . "<br />";
echo "The parent's value is: " . CarsB::$num_cars . "<br />";
echo "The sons's value is: " . CarsC::$num_cars . "<br />";
?>

והתוצאה:

The grandfather's value is: 33
The parent's value is: 33
The sons's value is: 33

הערך שהוצב בנכד, הוא ערך המשתנה בהורה ובסב.

בגלל ההתנהגות המוזרה של תכונות ומתודות סטטיים, מתכנתים רבים נוהגים להשתמש בהם במשורה ורק במקרים מאוד מסוימים.

 

מתי נשתמש בתכונה או במתודה סטטית?

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

מקרה נפוץ של שימוש במתודות סטטיות הוא עבור פונקציות תועלתיות (utility methods), שיש להם תפקיד שאינו תלוי במופע. לדוגמה, פונקציה שממירה תאריך מפורמט אמריקאי לפורמט שמקובל בישראל, המרת שערים של מטבעות, הצפנת ססמאות וכיו"ב. דוגמת הקוד הבאה מציגה מתודה סטטית שמפנה לדפים אחרים.

class Direct
{
  public static function to($loc){
    header("Location: $loc ");
    exit;
  }
}

כדי לקרוא למתודה לא צריך מופע, צריך רק לקרוא לה מתוך הקלאס שאליו היא שייכת. כך:

Direct::to('index.php');

מה שיגרום להפנייה לדף 'index.php'.

 

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

eBook cover The essentials of Object Oriented PHP

 

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

 

 

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

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

 

 

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

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

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

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

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

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

 

 

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

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