Menu
Coddy logo textTech

ירושה בסיסית

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

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

challenge icon

אתגר

קל

בואו נבנה מערכת היררכיית כלי רכב שמדגימה כיצד ירושה מאפשרת למחלקות ילד לשתף פונקציונליות ממחלקת אב, תוך הוספת התנהגויות ייחודיות משלהן.

תארגנו את הקוד שלכם בשלושה קבצים:

  • 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()
?>
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר PHP אונליין