מדריך PHP: תכנות מונחה עצמים – כימוס
במאמר קודם למדנו על הורשה המאפשרת לנו להעביר תכונות ומתודות מ-class אחד ל-class אחר. באמצעות כימוס אנו יכולים לשלוט על מי יכול לגשת את התכונות והמתודות שלנו ב-class שלנו.
יש שלושה שלבים של כימוס (encapsulation) לפי דרג של הרשאה: public, protected ו-private
public
הראשון הוא public ובו השתמשנו בכל הדוגמאות עד כה. משמעות public היא שמתודה או תכונה שיש לידה public ניתנת לגישה מכל מקום:
1. בתוך ה-class עצמו (מן הסתם):
class a { public $a = 2; public function a_method() { return 'a is '.$this->a; } }
בדוגמה הזו אנו רואים ש-a_method משתמש בתכונה הציבורית $a בלי בעיה.
2. בתוך class שיורש אותו:
<?php class a { public $a = 2; public function a_method() { return 'a is '.$this->a; } } class b extends a { public function b_method() { return 'b is '.$this->a; } } $instance = new b(); print $instance->b_method();
3. מתוך ה-instance עצמו!
<?php class a { public $a = 2; public function a_method() { return 'a is '.$this->a; } } $instance = new a(); print $instance->a;
כאשר אני משתמש ב-public, כולם יכולים לגשת אל התכונות או המתודות שלי.
Protected
רמת כימוס protected מאפשרת גישה למתודות או תכונות רק ל-class עצמו וכן ל-classים שיורשים ממנו. אם תרצו להשתמש בתכונה מסוימת שהיא protected ב-instance עצמו, אתם תקבלו הודעת שגיאה.
הנה דוגמא לשימוש ב-protected:
<?php class a { protected $a = 2; public function a_method() { return 'a is '.$this->a; } } class b extends a { public function b_method() { return 'b is '.$this->a; } } $instance = new b(); print $instance->b_method();
b יכול להשתמש בתכונה המוגנת a ללא כל בעיה, אבל אם אני אנסה תעלול כזה:
<?php class a { protected $a = 2; public function a_method() { return 'a is '.$this->a; } } $instance = new a(); print $instance->a;
אני אקבל שגיאה. ל-instance אין יכולת לקבל גישה ל-a.
Private
רמת הכימוס private מאפשרת גישה אך למתודות ולתכונות של class מסוים אך ורק בתוך ה-class שלו.
הקוד הזה יעבוד למשל:
<?php class a { private $a = 2; public function a_method() { return 'a is '.$this->a; } } $instance = new a(); print $instance->a_method();
אבל אם אני אנסה להשתמש בתכונה a בתוך class b שיורש מ-class a, אני אקבל שגיאה. שלא לדבר על להעיז ולנסות לקרוא לתכונה a מתוך ה-instance.
בטח חלק מכם יחשבו 'למה לי את הברדק הזה?'. למה לא לתת לכל התכונות והמתודות את רמת הכימוס public ויאללה בלגן? למה ההגבלות האלו שרק יכולות לגרום לשגיאות ולבעיות? התשובה היא שההגבלות האלו, מוזרות עד כמה שהן נראות, עוזרות לנו לייצר קוד עמיד יותר וגמיש יותר. אם יש לי class מסוים, אני יכול להגדיר לו משתנים ומתודות שפתוחים לשינויים אך את המתודות שאחראיות לתפקוד שלו, אני יכול להגדיר כ-private וכך יש לי יכולת לשנות לגמרי את התפקוד שלו תוך כדי שאני בטוח לחלוטין ששום class אחר או instance אחר לא ייפגע כתוצאה מהשינויים. תכנות מונחה עצמים מאפשר לי להפריד את הקוד שלי לחלקים שונים על פי התפקוד והכימוס מאפשר לי להיות בטוח ששום חלק אחר בקוד לא משתמש בחלקים שאני לא רוצה שישתמשו בהם.
תגובות בפייסבוק