28יולי2010

משמעות המילה final ב PHP 5

אני לא יודע אם יצא לכם לראות פעם את המילה final ליד הגדרה של מחלקות ופונקציות , זה נראה כמו מילה סתמית אבל היא חשובה מאד מאד לכל מי שמתעסק עם OOP

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

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

מטרת המילה FINAL היא למנוע שינויים :

  • final class ClassName – מונעת ממחלקות אחרות להשתמש במחלקה (ClassName2 extends ClassName)
  • מונעת דריסה של פונקציות (מתודות) בתוך המחלקה

נשמע פשוט לא ?

כמה דוגמאות :

נניח שיש לנו מחלקה שנקראת "מכונית חוקית" שנראית בערך ככה :

1
2
3
4
5
6
7
class LegalCar
{
	public function __construct(){}
 
	public function Buy(){}
	function Pay(){}
}

יכול לבוא מתכנת ולעשות דבר כזה :

1
2
3
4
5
6
7
8
9
class StolenCar extends LegalCar
{
 
	public function __construct(){}
 
	public function BreakIntoCar(){}
 
	public function Pay(){}
}

כלומר לשנות את כל אופן הפעולה של "מכונית חוקית" על ידי המחלקה "מכונית גנובה"
איך נמנע ממישהו לעשות את זה ? פשוט מאד

1
2
3
4
5
6
7
final class LegalCar
{
	public function __construct(){}
 
	public function Buy(){}
	function Pay(){}
}

עכשיו שהמחלקה "מכונית גנובה" תנסה להשתמש במחלקה "מכונית חוקית" יתקבל הארור הבא :

1
Fatal error: Class StolenCar may not inherit from final class (LegalCar)

פשוט לא ?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class LegalCar
{
	public function __construct(){}
 
	public function Buy(){}
 
	public final function Pay(){}
 
}
 
 
class StolenCar extends LegalCar
{
 
	public function __construct(){}
 
	public function BreakIntoCar(){}
 
	public function Pay(){}
}

ובמקרה כזה נקבל את השגיאה הבאה :

1
Fatal error: Cannot override final method LegalCar::Pay() in

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

תגובות

4 תגובות ל "משמעות המילה final ב PHP 5"

  • מאת אלדד:

    שימושי מאוד :)
    תודה

  • נפלא ממש! לא ידעתי את זה.
    כל פוסט שמתפרסם פה הוא פשוט פנינה – כן ירבו!

    הוספתי את הר.ס.ס של הבלוג לקבוצת 'מפתחי אינטרנט בישראל'. מעכשיו הקיר של הקבוצה יעודכן בכל פוסט שמפורסם פה: http://www.facebook.com/group.php?gid=111444215533299

  • מאת admin:

    תודה רבה :) הוספתי את עצמי לקבוצה גם אבל אני לא רואה את ה RSS

    אני מאד שמח שאתם אוהבים את הפוסטים :) עושים חשק להמשיך לכתוב

  • מאת אוראל:

    מדהים עד כמה שהכל יכול להשתנות בעוד כמה אותיות.

הוסף תגובה

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word