בחינה מחדש של דריסת מתודות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 33 מתוך 91.
כבר למדת על דריסת מתודות בפרק הירושה. עכשיו נחקור איך היא קשורה לפולימורפיזם — אחד המושגים העוצמתיים ביותר בתכנות מונחה עצמים.
פולימורפיזם פירושו "צורות רבות". כשאתם דורסים מתודה במחלקת בת, אתם נותנים למתודה צורה אחרת תוך שמירה על אותו שם. הקסם מתרחש כשאתם עובדים עם אובייקטים דרך טיפוס האב שלהם:
<?php
class Animal {
public function speak() {
return "Some sound";
}
}
class Dog extends Animal {
public function speak() {
return "Woof!";
}
}
class Cat extends Animal {
public function speak() {
return "Meow!";
}
}
function makeAnimalSpeak(Animal $animal) {
return $animal->speak();
}
echo makeAnimalSpeak(new Dog()) . "\n";
echo makeAnimalSpeak(new Cat());
פלט:
Woof!
Meow!הפונקציה makeAnimalSpeak() מקבלת כל Animal. היא לא יודעת ולא אכפת לה אם היא מקבלת Dog או Cat. PHP קוראת באופן אוטומטי למתודה הנדרסת המתאימה על סמך סוג האובייקט בפועל בזמן הריצה.
זוהי פולימורפיות בפעולה.
הגישה הזו מאפשרת לך לכתוב קוד גמיש שעובד עם משפחה של אובייקטים קשורים בלי לדעת מה הם הטיפוסים הספציפיים שלהם. אפשר להוסיף בהמשך מחלקות חדשות של בעלי חיים, והפונקציה תעבוד איתן באופן אוטומטי.
נקודה מרכזית: דריסת מתודות מאפשרת פולימורפיזם בכך שהיא מאפשרת למחלקות שונות להגיב באופן שונה לאותה קריאה למתודה, בהתאם לסוג האובייקט בפועל בזמן הריצה.
אתגר
קלבואו נבנה מערכת של כלי נגינה שמדגימה פולימורפיזם באמצעות דריסת מתודות. תיצרו מחלקת בסיס Instrument ושתי מחלקות צאצא, שכל אחת מפיקה צליל ייחודי משלה, ואז תשתמשו בפונקציה אחת כדי לנגן בכל כלי באופן פולימורפי.
תארגנו את הקוד שלכם בארבעה קבצים:
Instrument.php: צרו מחלקה בשםInstrumentעם מאפיין מוגן$nameשמוגדר באמצעות הבנאי. הוסיפו מתודתplay()שמחזירה"[name] makes a sound". זו התנהגות הבסיס שמחלקות הצאצא ידרסו.Guitar.php: צרו מחלקה בשםGuitarשיורשת מ-Instrument. כללו את קובץ מחלקת האב. הבנאי מקבל את השם ומעביר אותו לבנאי של מחלקת האב. דרסו את המתודהplay()כך שתחזיר"[name] strums a chord".Drum.php: צרו מחלקה בשםDrumשיורשת מ-Instrument. כללו את קובץ מחלקת האב. הבנאי מקבל את השם ומעביר אותו לבנאי של מחלקת האב. דרסו את המתודהplay()כך שתחזיר"[name] beats a rhythm".main.php: כללו את הקבצים של Guitar ושל Drum. צרו פונקציה בשםperformWithשמקבלת פרמטר מסוגInstrument(עם הצהרת טיפוס) ומחזירה את התוצאה של קריאה ל-play()עליו. פונקציה זו מדגימה פולימורפיזם. היא עובדת עם כל סוג של כלי נגינה באמצעות הצהרת הטיפוס של מחלקת האב.
תקבלו שתי קלטים: שם לגיטרה ושם לתוף. צרו אובייקט Guitar ואובייקט Drum עם השמות האלה. העבירו כל אחד מהם לפונקציה performWith() והדפיסו את התוצאות: תחילה הגיטרה, ואז התוף, כל אחד בשורה משלו.
שימו לב ש-performWith() מקבלת כל אובייקט מסוג Instrument, ובכל זאת PHP קוראת אוטומטית למתודת play() שנדרסה ומתאימה לסוג האובייקט בפועל בזמן הריצה. זהו פולימורפיזם בפעולה!
נסו בעצמכם
<?php
// כלול את קובצי כלי הנגינה
require_once 'Guitar.php';
require_once 'Drum.php';
// קרא קלט
$guitarName = trim(fgets(STDIN));
$drumName = trim(fgets(STDIN));
// TODO: צור פונקציה בשם performWith אשר:
// - מקבלת פרמטר מסוג Instrument (השתמש בציון סוג: Instrument $instrument)
// - מחזירה את התוצאה של הקריאה ל-play() על כלי הנגינה
// TODO: צור Guitar עם $guitarName ו-Drum עם $drumName
// TODO: העבר כל אחד מהם ל-performWith() והדפס את התוצאות (קודם guitar, אחר כך drum)
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין