משמעות המילה 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 תשלם כסף לספק , ותדאג ליצור הזמנה חדשה לסחורה עבור מעקב על הסחורה,
אם נאפשר לדרוס את הפונקציה של התשלום יכול להיות שמי שידרוס את הפונקצייה לא ידאג לכל החלקים של התשלום, וכן זה יכול להיות גם אתם כי כשבונים מערכת גדולה לא תמיד זוכרים את כל הפעולות שפונקציה מסויימת צריכה לעשות.
מקווה שנהנתם מהפוסט
שימושי מאוד
תודה
נפלא ממש! לא ידעתי את זה.
כל פוסט שמתפרסם פה הוא פשוט פנינה – כן ירבו!
הוספתי את הר.ס.ס של הבלוג לקבוצת 'מפתחי אינטרנט בישראל'. מעכשיו הקיר של הקבוצה יעודכן בכל פוסט שמפורסם פה: http://www.facebook.com/group.php?gid=111444215533299
תודה רבה
הוספתי את עצמי לקבוצה גם אבל אני לא רואה את ה RSS
אני מאד שמח שאתם אוהבים את הפוסטים
עושים חשק להמשיך לכתוב
מדהים עד כמה שהכל יכול להשתנות בעוד כמה אותיות.