מדריך PHP: תכנות מונחה עצמים – הקדמה
נשאלת השאלה למה בדיוק ללמוד תכנות מונחה עצמים? יש לכך שתי תשובות ברורות:
1. יש לא מעט מערכות בשוק שמשתמשות בתכנות מונחה עצמים. מערכת כמו ג'ומלה למשל היא מונחית עצמים. אי ידיעת תכנות מונחה עצמים תחסום בפניכם באופן אוטומטי את השימוש במערכות האלו וגם תחסום משרות או פרויקטים משתלמים הקשורים במערכות האלו.
2. במערכות גדולות השימוש בתכנות מונחה עצמים הוא חובה ולא אפשרות.
המעבר לתכנות מונחה עצמים הוא לא כל כך קשה כמו שחושבים, מדובר פשוט בשינוי של תפיסה מסוימת. אם בתכנות הפרוצדורלי שלמדנו עד כה חשבנו במונחים של פונקציות. בתכנות מונחה עצמים אנו חושבים במונחים של.. ובכן, עצמים. לכל עצם יש פונקציות משלו (שנקראות מתודות) ומשתנים משלו (שנקראים תכונות). העצמים ב-PHP נקראים class. בואו וניצור class פשוט שבפשוטים:
<?php class my_class { public $my_prperty = 'hello world!'; public function my_method() { $a = 1; $b = 2; return $a + $b; } }
מה יש לנו כאן? יש לנו את המילה class ואת שם ה-class כפי שבחרתי. במקרה הזה בחרתי ב-my_class אבל זה יכול להיות כמעט כל שם אחר.
אנחנו יכולים לראות שבתוך ה-class שלי יש משתנה (משתנה בתוך class נקרא תכונה) בשם my_property וגם פונקציה (פונקציה בתוך class נקראת מתודה) בשם my_method. לפני כל הגדרה של פונקציה או משתנה יש גם את המילה public שעליה ארחיב בהמשך.
או קיי, אז יצרנו class, אבל class זה משהו שהוא מאד אבסטרקטי, סוג של 'blue print' או תוכנית אדריכלית. על מנת להשתמש ב-class אני צריך להפיח בה רוח חיים – לקחת את הבלו פרינט הזה וליצור ממנו משהו. איך עושים את זה? כך:
$instance = new my_class(); print $instance->my_prperty; print $instance->my_method();
ראשית אנו יוצרים את ה-instance, המשתנה שיכיל את ה-class שלי. כמובן שה-instance יכול להיות משתנה בעל שם כלשהו. ברגע שיצרתי את ה-instance, יש לי גישה למה שהוא עושה, אני יכול לקבל גישה למשתנים שלו, למתודות שלו ולהשתמש בו.
למה זה טוב? תחשבו למשל שיש לי class שאחראי על תקשורת עם מסד הנתונים. כל מה שעלי לעשות אם אני צריך לייצר תקשורת עם מסד נתונים זה ליצור instance ל-class הזה. סוג של מיני תוכנה בתוך התוכנה הכללית. במערכות מורכבות יש class לכל דבר – לתקשורת עם מסד הנתונים, הצגת פלט HTML, הצגת פלטים מסוגים אחרים, תקשורת עם webservices ואנו מבצעים instance לכל class כזה. מאד נוח ומאד קל לטפל בכל class בנפרד. אם אנחנו מחליטים לבצע שינויים במסד הנתונים, כל מה שעלינו לעשות זה לשנות את ה-class הרלוונטי – כל עוד אנו שומרים על המתודות תקינות, דבר לא ישתנה ביחס לעצמים האחרים והקוד שלנו ימשיך לעבוד.
This
אם יש משהו קשה בהבנה בתכנות מונחה עצמים הוא משתנה this, שימו לב היטב להסבר ותעשו חזרות להבהרה. This הוא פסאודו משתנה שמשתנה לפי ההקשר של מי שקרא לו. בדרך כלל, אם אנו רואים את משתנה this, ההקשר שלו הוא ה-class. אתם יודעים מה? בואו ונבהיר את זה עם דוגמא:
<?php class my_class { public $a = 2; public function my_method() { return $this->a + 3; } }
This הוא תלוי הקשר, במקרה הזה ההקשר הוא ה-instance כיוון ש-this רץ בתוכו וכך אני יכול לקבל גישה לתכונה a או למתודות אחרות בתוך ה-class שלנו.
לוקח זמן להבין את this, מה שחשוב הוא שלפחות כרגע תזכרו ש-this משמש אותנו לקריאה של משתנים ומתודות בתוך ה-class.
Static
עד עכשיו ראינו שחייבים instance על מנת לגשת למתודות או לתכונות בתוך ה-class שלנו. למשל:
<?php class my_class { public $a = 2; public function my_method() { return $this->a + 3; } } $instance = new my_class(); print $instance->my_method();
יש אפשרות להגדיר חלק או את כל המתודות והתכונות שלנו כסטטיות – כלומר שאפשר לגשת אליהן גם ללא instance. את זה עושים באמצעות שני דברים:
1. הגדרה של מתודה או תכונה כסטטית באמצעות המילה static לפניה.
2. שימוש ב :: על מנת לגשת למתודה או לתכונה.
והנה הדוגמא המיוחלת:
<?php class my_class { public static $a = 2; public static function my_method() { return 2+3; } } print my_class::$a; print my_class::my_method();
שימו לב שאם המתודה שלכם קוראת למתודות או תכונות כלשהן באמצעות this אתם תקבלו כינים בשקית, כיוון ש-this הוא תלוי הקשר וכאשר ה-class הוא סטטי אין הקשר כי אין לנו instance. אם אנו רוצים ליצור class סטטי שהמתודה הסטטית שלו משתמשת במתודות או תכונות סטטיות אחרות, אנו צריכים להשתמש ב-self:
<?php class my_class { public static $a = 2; public static function my_method() { return self::$a + 3; } } print my_class::$a; print my_class::my_method();
self לא מתחשב בהקשר וקורא תמיד לתכונות או למתודות באותו ה-class שהוא נמצא בו.
Constructors
Constructor היא מתודה מיוחדת שאם היא נמצאת ב-class היא רצה כאשר אנו עושים instance (לא צריך לקרוא לה). זה שימושי במיוחד בכל מני הזדמנויות. פונקצית הבנייה הזו יכולה להיות מוגדרת בשתי דרכים:
הראשונה היא פשוט לקרוא לה בשם של ה-class. ברגע שיש instance, אז my_class רצה:
<?php class my_class { public static $a = 2; function my_class() { print 'constructor has been initaiated'; } public static function my_method() { return self::$a + 3; } } $instance = new my_class(); print $instance->my_method();
חשוב לציין שזה רק בגרסאות PHP 5.3 ומעלה.
הדרך השניה היא פשוט לקרוא לה בשם __construct
<?php class my_class { public static $a = 2; function __construct() { print 'constructor has been initaiated'; } public static function my_method() { return self::$a + 3; } } $instance = new my_class(); print $instance->my_method();
פשוט, לא?
Destruct
כמו שיש בנייה, יש גם הריסה, מתודת destruct מטפלת במה שקורה כאשר אנו עושים unset ל-instance או משתמשים בפקודה exit. היא רצה מיד אחרי שה-instance מושמד.
הנה הדוגמא המאד מאד פשוטה:
<?php class my_class { public static $a = 2; function __destruct() { print 'destruction has been initaiated'; } public static function my_method() { return self::$a + 3; } } $instance = new my_class(); print $instance->my_method(); unset($instance);
תגובות בפייסבוק