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

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

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

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

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

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

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

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

 

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

 

= 3 + 2