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