ירושה בסיסית
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 21 מתוך 91.
ירושה מאפשרת למחלקה לרשת מאפיינים ומתודות ממחלקה אחרת. במקום לכתוב מחדש את אותו קוד, אפשר ליצור מחלקת בסיס עם פונקציונליות משותפת ולגרום למחלקות אחרות לרשת ממנה.
המחלקה שממנה יורשים נקראת מחלקת האב (או מחלקת בסיס), והמחלקה שיורשת נקראת מחלקת הבן. משתמשים במילת המפתח extends כדי ליצור את הקשר הזה:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
return "$this->name makes a sound";
}
}
class Dog extends Animal {
public function fetch() {
return "$this->name fetches the ball";
}
}
$dog = new Dog("Buddy");
echo $dog->speak() . "\n";
echo $dog->fetch();
פלט:
Buddy makes a sound
Buddy fetches the ballלמחלקה Dog יש גישה אוטומטית למאפיין $name, לבנאי ולמתודה speak() מתוך Animal. היא גם מגדירה מתודת fetch() משלה, שקיימת רק אצל כלבים.
כך נוצרת היררכיה ברורה: כל כלב הוא בעל חיים, ולכן הגיוני ש־Dog תירש מ־Animal. מחלקת הבת יכולה להשתמש בכל מה שמחלקת האב כוללת, ובו בזמן להוסיף התנהגות ייחודית משלה.
נקודה מרכזית: ירושה מעודדת שימוש חוזר בקוד ומבססת קשרים לוגיים בין מחלקות. מחלקת הבת יורשת את כל החברים הציבוריים והמוגנים ממחלקת האב, וכך מצמצמת כפילויות והופכת את הקוד שלך לקל יותר לתחזוקה.
אתגר
קלבואו נבנה מערכת היררכיית כלי רכב שמדגימה כיצד ירושה מאפשרת למחלקות ילד לשתף פונקציונליות ממחלקת אב, תוך הוספת התנהגויות ייחודיות משלהן.
תארגנו את הקוד שלכם בשלושה קבצים:
Vehicle.php: הגדירו מחלקהVehicleהמשמשת כמחלקת האב של כל כלי הרכב. צריכה להיות לה תכונת$brandציבורית ובנאי שמקבל את המותג ומגדיר אותו. כללו מתודתstart()שמחזירה"[brand] is starting"ומתודתstop()שמחזירה"[brand] is stopping".Motorcycle.php: הגדירו מחלקהMotorcycleשמרחיבה אתVehicle. כללו את קובץ Vehicle בראש הקובץ. מחלקת Motorcycle אינה זקוקה לבנאי משלה, מכיוון שהיא תירש את הבנאי של מחלקת האב. הוסיפו מתודתwheelie()שמחזירה"[brand] is doing a wheelie!". זוהי התנהגות ייחודית לאופנועים.main.php: כללו את קובץ Motorcycle (שכבר כולל את Vehicle). תקבלו קלט אחד: מותג האופנוע. צרו אובייקטMotorcycleעם המותג הזה. הדפיסו את התוצאה של קריאה ל-start(), אחר כך ל-wheelie()ולבסוף ל-stop(), כל אחת בשורה נפרדת.
שימו לב כיצד מחלקת Motorcycle יורשת באופן אוטומטי את תכונת $brand, את הבנאי ואת שתי המתודות start() ו-stop() ממחלקת Vehicle. מחלקת הילד צריכה להגדיר רק את מה שמייחד אותה, ובמקרה הזה, את היכולת לבצע ווילי. זהו כוחה של הירושה: כותבים פונקציונליות משותפת פעם אחת במחלקת האב, ומאפשרים למחלקות הילד לעשות בה שימוש תוך הוספת ההתמחויות שלהן.
נסו בעצמכם
<?php
// כלול את המחלקה Motorcycle (שכבר כוללת את Vehicle)
require_once 'Motorcycle.php';
// קרא את הקלט
$brand = trim(fgets(STDIN));
// TODO: צור אובייקט מסוג Motorcycle עם המותג
// TODO: הדפס את התוצאה של start()
// TODO: הדפס את התוצאה של wheelie()
// TODO: הדפס את התוצאה של stop()
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח $thisמתודותמאפייניםבנאי (__construct)הורס (__destruct)חזרה: מחשבון פשוט4ירושה
ירושה בסיסיתמילת המפתח parent::דריסת מתודותמילת המפתח finalמחלקות מופשטותסיכום – היררכיית עובדים7כימוס
ציבורי, מוגן, פרטימפרטי גישה לעומקמתודות גישה ועדכוןהסתרת מידעקידום פרמטרים בבנאי (8.0)סיכום – מערכת רישומי תלמידים2מרחבי שמות וטעינה אוטומטית
מבוא למרחבי שמותמילת המפתח useתקן הטעינה האוטומטית PSR-4הטוען האוטומטי של Composerסיכום – פרויקט מאורגן5ממשקים וחוזים
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםממשק לעומת מחלקה מופשטתרמזי טיפוסים עם ממשקיםסיכום - מחשבון צורות8מתודות קסם
מבוא למתודות קסם__toString ו־__debugInfo__get, __set, __isset, __unset__call ו־__callStatic__clone ושיבוט אובייקטים__serialize ו־__unserializeסיכום – אוסף מותאם אישית3מאפייני מחלקה
מאפייני מופע לעומת מאפיינים סטטייםקבועים במחלקותמתודות ומאפיינים סטטייםמאפיינים פרטיים ומוגניםמאפיינים לקריאה בלבד (PHP 8.1)סיכום – מנהל חשבון בנק6פולימורפיזם
בחינה מחדש של דריסת מתודותפולימורפיזם באמצעות ממשקיםרמזי טיפוסים וטיפוסי איחודקישור סטטי מאוחרסיכום — מעבד תשלומיםתרגלו בעצמכם: קומפיילר PHP אונליין