מילת המפתח parent::
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 22 מתוך 91.
כשמחלקת בת יורשת ממחלקת אב, לפעמים צריך לגשת ישירות למתודות או למאפיינים של מחלקת האב. מילת המפתח parent:: מאפשרת לך לקרוא למימוש של מחלקת האב מתוך מחלקת הבת.
זה שימושי במיוחד בבנאים, כאשר המחלקה היורשת צריכה לאתחל את המאפיינים של מחלקת האב ובמקביל להגדיר את המאפיינים שלה:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
public function describe() {
return "$this->name is a $this->breed";
}
}
$dog = new Dog("Max", "Labrador");
echo $dog->describe();
פלט:
Max is a Labradorעל ידי קריאה ל־parent::__construct($name), מחלקת הבת עושה שימוש חוזר בלוגיקת האתחול של מחלקת האב במקום לשכפל אותה. ללא הקריאה הזו, המאפיין $name לעולם לא היה מוגדר.
אפשר להשתמש ב-parent:: כדי לקרוא לכל מתודה של מחלקת האב, ולא רק לבנאים. הדבר חשוב במיוחד כשרוצים להרחיב את ההתנהגות של מתודה במקום להחליף אותה לחלוטין.
נקודה מרכזית: מילת המפתח parent:: מאפשרת לגשת למימוש של מחלקת האב. היא חיונית לשרשור תקין של בנאים ולבנייה על פונקציונליות שעברה בירושה, במקום לכתוב אותה מחדש.
אתגר
קלבואו נבנה מערכת קטלוג מוצרים שמדגימה כיצד מחלקות יורשות יכולות להרחיב את הפונקציונליות של מחלקות אב באמצעות מילת המפתח parent::, כדי לשרשר כראוי בנאים ולבנות על גבי מתודות שעברו בירושה.
תארגנו את הקוד שלכם בשלושה קבצים:
Product.php: הגדירו מחלקהProductהמשמשת כמחלקת בסיס לכל המוצרים. צריכים להיות לה המאפיינים הציבוריים$nameו-$price. הבנאי מקבל שם ומחיר ומגדיר את שני המאפיינים. הוסיפו מתודתgetDetails()שמחזירה"[name]: $[price]".ElectronicProduct.php: הגדירו מחלקהElectronicProductשיורשת מ-Product. כללו את קובץ Product בראש הקובץ. המחלקה מוסיפה מאפיין$warranty(בחודשים). הבנאי צריך לקבל שם, מחיר ותקופת אחריות: השתמשו ב-parent::__construct()כדי לאתחל את השם והמחיר דרך מחלקת האב, ואז הגדירו בעצמכם את תקופת האחריות. צרו מתודתgetDetails()שבונה על המימוש של מחלקת האב: קראו ל-parent::getDetails()והוסיפו לו בסוף" (Warranty: [warranty] months)".main.php: כללו את קובץ ElectronicProduct. תקבלו שלושה קלטים: שם המוצר, המחיר (כמחרוזת שיש להמיר למספר עשרוני) ותקופת האחריות (כמחרוזת שיש להמיר למספר שלם). צרוElectronicProductעם הערכים האלה והדפיסו את התוצאה של קריאה ל-getDetails().
האתגר הזה מדגים את העוצמה האמיתית של parent::. הוא לא מיועד רק לשרשור בנאים, אלא גם להרחבת ההתנהגות של מתודות. ElectronicProduct שלכם עושה שימוש חוזר בלוגיקת העיצוב של מחלקת האב ומוסיף עליה פרטים משלו, וכך נמנעת כפילות קוד ונוצר פלט עשיר יותר.
נסו בעצמכם
<?php
require_once 'ElectronicProduct.php';
// קרא את הקלטים
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$warranty = intval(trim(fgets(STDIN)));
// TODO: צור ElectronicProduct עם ערכי הקלט
// והדפס את התוצאה של הקריאה ל-getDetails()
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין