מדריך PHP

מדריך PHP: תכנות מונחה עצמים – כימוס

‏ • Internet Israel

במאמר קודם למדנו על הורשה המאפשרת לנו להעביר תכונות ומתודות מ-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 אחר לא ייפגע כתוצאה מהשינויים. תכנות מונחה עצמים מאפשר לי להפריד את הקוד שלי לחלקים שונים על פי התפקוד והכימוס מאפשר לי להיות בטוח ששום חלק אחר בקוד לא משתמש בחלקים שאני לא רוצה שישתמשו בהם.

תגיות: , ,

רן בר-זיק

מתכנת PHP מנוסה ובעל ידע רב בפיתוח לאינטרנט על בסיס LAMP. מומחה במערכות דרופל, ג'ומלה ו-וורדפרס. שולט היטב בכל מה שקשור לפרונט אנד: JavaScript: jQuery ו-MooTools,ActionScript 2/3 וכמובן HTML 5 + CSS 3.אינטרנט ישראל: www.internet-israel.com

תגובות בפייסבוק