וובמאסטר - תיכנות ובניית אתרים

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

רן בר-זיק ,‏ אינטרנט ישראל‏ ‏/‏ 25 פברואר, 2011
F+
F-

במאמר קודם למדנו על הורשה המאפשרת לנו להעביר תכונות ומתודות מ-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
תגיות: PHP‏  /  מדריך‏  /  OOP‏  

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

תגובות למאמר



עוד במדריך

תגיות פופולאריות

X
הצטרף לעמוד שלנו בפייסבוק להישאר מעודכן!
וובמאסטר © כל הזכויות שמורות