Menu
Coddy logo textTech

דריסת מתודות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 23 מתוך 91.

לפעמים המתודה שעוברת בירושה ממחלקת האב לא מתאימה בדיוק למה שמחלקת הבת צריכה. דריסת מתודות מאפשרת למחלקת הבת לספק מימוש משלה למתודה שכבר קיימת במחלקת האב.

כדי לדרוס מתודה, פשוט הגדירו מתודה במחלקת הבת עם אותו שם כמו למתודה של מחלקת האב:

<?php
class Animal {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
    
    public function speak() {
        return "$this->name makes a sound";
    }
}

class Cat extends Animal {
    public function speak() {
        return "$this->name says meow";
    }
}

$cat = new Cat("Whiskers");
echo $cat->speak();

פלט:

Whiskers says meow

המחלקה Cat מחליפה לחלוטין את המתודה speak() של מחלקת האב בגרסה משלה. כשקוראים ל-speak() על אובייקט של חתול, PHP משתמש במימוש של מחלקת הבת.

אפשר גם להרחיב את ההתנהגות של מחלקת האב באמצעות שילוב של parent:: עם הלוגיקה שלך:

<?php
class Dog extends Animal {
    public function speak() {
        return parent::speak() . " - woof woof!";
    }
}

$dog = new Dog("Rex");
echo $dog->speak();

פלט:

Rex makes a sound - woof woof!

נקודה מרכזית: דריסת מתודות מאפשרת למחלקות הבנות להתאים אישית התנהגות שהן יורשות. אפשר להחליף מתודה לחלוטין או להשתמש ב־parent:: כדי לבנות על המימוש המקורי.

challenge icon

אתגר

קל

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

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

  • Notification.php: הגדירו מחלקה בשם Notification שתשמש כמחלקת הבסיס לכל סוגי ההתראות. צריכה להיות לה תכונה ציבורית $recipient ובנאי שמקבל את הנמען ומגדיר אותו. כללו מתודה בשם send($message) שמחזירה "Sending to [recipient]: [message]".
  • UrgentNotification.php: הגדירו מחלקה בשם UrgentNotification שיורשת מ־Notification. כללו את קובץ Notification בראש הקובץ. מחלקה זו צריכה לדרוס לחלוטין את המתודה send($message) ולהחזיר "URGENT to [recipient]: [message]!!!": שימו לב לתחילית "URGENT" ולסימני הקריאה בסוף. כך מודגם כיצד מחליפים לחלוטין את ההתנהגות של מחלקת האב.
  • LoggedNotification.php: הגדירו מחלקה בשם LoggedNotification שיורשת מ־Notification. כללו את קובץ Notification בראש הקובץ. מחלקה זו צריכה לדרוס את send($message), אך להתבסס על המימוש של מחלקת האב: קראו ל־parent::send($message) והוסיפו " [logged]" לתוצאה. כך מודגם כיצד מרחיבים את ההתנהגות במקום להחליף אותה.

ב־main.php, כללו את כל שלושת הקבצים של מחלקות ההתראות. תקבלו שתי קלטים: שם הנמען וההודעה לשליחה. צרו מופע אחד מכל סוג התראה (כולם עם אותו נמען), ואז קראו ל־send() עם ההודעה בכל אחד מהם. הדפיסו כל תוצאה בשורה נפרדת, לפי הסדר הבא: התראה רגילה, התראה דחופה ואז התראה מתועדת.

האתגר הזה מדגים את שתי הגישות לדריסת מתודות: UrgentNotification מחליפה לחלוטין את הלוגיקה של מחלקת האב בעיצוב משלה, בעוד LoggedNotification משתמשת ב־parent:: כדי לשמר את ההתנהגות המקורית ולהוסיף עליה.

נסו בעצמכם

<?php

require_once 'Notification.php';
require_once 'UrgentNotification.php';
require_once 'LoggedNotification.php';

// קראו את הקלט
$recipient = trim(fgets(STDIN));
$message = trim(fgets(STDIN));

// TODO: צרו מופע אחד מכל סוג של התראה (כולם משתמשים באותו נמען)

// TODO: קראו ל־send() עם ההודעה עבור כל התראה
// הדפיסו כל תוצאה בשורה נפרדת לפי הסדר הזה:
// 1. התראה רגילה
// 2. התראה דחופה
// 3. התראה מתועדת

?>
quiz iconבחנו את עצמכם

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

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

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