מדריך PHP

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

‏ • Internet Israel

הורשה היא בעצם סוג של הרחבה. אם יש לי class מסוג א' ואני רוצה ליצור class מסוג ב' שמכיל את התכונות והמתודות של class א', אני לא צריך לעשות copy&paste של כל מה שיש ב-class א' אלא פשוט להגדיר את class ב' כיורש.

אתם יודעים מה? בואו ונראה:

<?php
class a {
    public $a = 2;

    public function a_method() {
        return  $this->a + 3;
    }
}

class b extends a{
    public $b = 2;

    public function b_method() {
        return  $this->b + 3;
    }
}

$b_instance = new b();

print $b_instance->a_method();

תריצו את זה בבקשה, אתם רואים שלמרות שלא עשיתי שום instance ל-class a, אני יכול להשתמש במתודות שלו דרך ה-instance של class b. איך הפלא הקטן הזה קורה? כיוון ש b extends a. יש לנו הורשה, כל התכונות והמתודות של class a עוברות ל-class b.

כמובן ש-class b יכול 'לדרוס' את המתודות של class האב ללא כל בעיות. אם אנחנו יצרנו class אב ואנו לא רוצים שאיזה class חצוף ידרוס את המתודות שלו, אנו נשתמש במילה final:

<?php 
class a { public $a = 2; public final function a_method() { return $this->a + 3; } }

הורשה מאפשרת לנו עוד משהו מבורך – גישה למתודות ולתכונות של class האב באמצעות ::

למשל:

<?php
class a {
    public $a = 2;

    public function a_method() {
        return  $this->a + 3;
    }
}

class b extends a{
    public $b = 2;

    public function b_method() {
        return  $this->b + a::a_method();
    }
}

$instance = new b();

print $instance->a_method();

זה יעבוד כל עוד b יורש מ-a, כמובן שאז זה מתייחס למתודות של a כמתודות סטטיות (this לא יעבוד!). הברדק יהיה על אחריותכם.

Abstract class

Class אבסטרקטי הוא class שאי אפשר לייצר לו instance והוא משמש רק כ-Class שניתן לרשת ממנו. על מנת להגדיר class כאבסטרקטי, רק צריך לכתוב abstract ליד השם שלו:

<?php
abstract class a {
    public static $a = 2;

    public function a_method() {
        return  self::$a + 3;
    }
}

class b extends a{
    
}

$instance = new b();

print $instance->a_method();

אם ננסה לעשות ל-class a שהוגדר class אבסטרקטי instance, אז אנו נקבל שגיאה.

אנו יכולים בתוך abstract class לבחור שמתודה מסוימת גם כן תהיה abstract. זה יכפה על כל class שיורש את ה-abstract class שלנו להגדיר את המתודה הזו בעצמו:

<?php
abstract class a {
    public static $a = 2;

    abstract function a_method() {
        return  self::$a + 3;
    }
}

class b extends a{
    
}

$instance = new b();

print $instance->a_method();

אם ב-class b לא תהיה לנו מתודת a_method, אז אנו נקבל שגיאה.

נשאלת השאלה למה צריך בדיוק את ה-class האבסטרקטי הזה וכל המגבלות שלו? התשובה היא שכאשר אנו בונים תוכנה מסוימת עם API מסוים, או כאשר אנו בונים רכיב מסוים ואנו חלק מצוות תכנות גדול, אנו רוצים למנוע שימוש לא תקין ב-class שלנו וזו דרך מצויינת למנוע שגיאות ובעיות על ידי מתכנת אחר (או אפילו אנחנו). שימוש נבון בהורשות וב-abstract class מאפשר לנו ליצור רכיבים עמידים יותר בפני שינויים. שווה מאד ללמוד היטב גם את נושא ההורשה וגם את נושא ה-abstract class.

תגיות: , ,

רן בר-זיק

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

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