Menu
Coddy logo textTech

בחינה מחדש של דריסת מתודות

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

זוהי פולימורפיות בפעולה.

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

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

challenge icon

אתגר

קל

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

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

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

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

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