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