הרכבה לעומת ירושה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 56 מתוך 91.
בפרק הקודם למדת שתכונות מספקות יכולת מסוג "יש-לו", ואילו ירושה יוצרת קשר מסוג "הוא-". הרכבה מרחיבה את הרעיון של "יש-לו" באמצעות בניית אובייקטים מורכבים מאובייקטים פשוטים יותר, ושמירתם כמאפיינים במקום ירושה מהם.
בירושה, Car עשויה לרשת מ־Vehicle. בהרכבה, Car מכילה אובייקט Engine:
<?php
class Engine {
public function start(): string {
return "Engine started";
}
}
class Car {
private Engine $engine;
public function __construct() {
$this->engine = new Engine();
}
public function start(): string {
return $this->engine->start();
}
}
$car = new Car();
echo $car->start();
פלט:
Engine startedהמחלקה Car אינה יורשת מ־Engine — היא מכילה מנוע משלה. לגישה הזאת יש יתרונות משמעותיים: אפשר להחליף את המנוע במימוש אחר, המחלקות נשארות בעלות צימוד רופף, ונמנעות ההיררכיות הנוקשות שיורשה עמוקה יוצרת.
הנחיה נפוצה בתכנות מונחה עצמים היא "להעדיף הרכבה על פני ירושה." ירושה מתאימה היטב להיררכיות טיפוסים אמיתיות (Dog הוא באמת Animal), אבל הרכבה מצטיינת כשמרכיבים פונקציונליות מחלקים עצמאיים. אפשר לשלב כמה אובייקטים, להחליף אותם בזמן ריצה ולבדוק רכיבים בבידוד.
בשיעור הבא נחקור הזרקת תלויות, שנבנית ישירות על הרכבה באמצעות שליטה באופן שבו אובייקטים מקבלים את התלויות שלהם.
אתגר
קלבואו נבנה מערכת מחשב באמצעות הרכבה, שבה Computer מורכב מאובייקטים נפרדים של רכיבים במקום לרשת מהם. כך נראה כיצד הרכבה מאפשרת לבנות אובייקטים מורכבים מחלקים פשוטים ועצמאיים יותר.
תארגן את הקוד בשלושה קבצים:
Processor.php: צור מחלקה בשםProcessorשמייצגת CPU. השתמש בקידום מאפיינים בבנאי כדי להגדיר$modelפרטי (מחרוזת) ו-$coresפרטי (מספר שלם). הוסף שיטה בשםgetSpecs()שמחזירה"[model] ([cores] cores)".Memory.php: צור מחלקה בשםMemoryשמייצגת RAM. השתמש בקידום מאפיינים בבנאי כדי להגדיר$sizeפרטי (מספר שלם שמייצג GB). הוסף שיטה בשםgetCapacity()שמחזירה"[size]GB RAM".main.php: כלול את שני קובצי הרכיבים וצור מחלקה בשםComputerשמשתמשת בהרכבה. עלComputerלבצע את הפעולות הבאות:- לשמור אובייקט
ProcessorואובייקטMemoryכמאפיינים פרטיים - לקבל בבנאי דגם מעבד, מספר ליבות וגודל זיכרון
- ליצור את אובייקטי הרכיבים בתוך המחלקה במהלך הבנייה
- להכיל שיטה בשם
describe()שמחזירה"Computer with [processor specs] and [memory capacity]"
תקבל שלוש קלטים: דגם מעבד, מספר ליבות וגודל זיכרון ב-GB. צור
Computerעם המפרט הזה והדפס את התוצאה של קריאה ל-describe().- לשמור אובייקט
שים לב ש-Computer לא יורשת מ-Processor או מ-Memory. היא מכילה אותם. קשר ה״יש-לו״ הזה באמצעות הרכבה שומר על כל רכיב עצמאי וניתן לשימוש חוזר, ובו בזמן מאפשר ל-Computer להאציל משימות לחלקים שלה בעת הצורך.
נסו בעצמכם
<?php
require_once 'Processor.php';
require_once 'Memory.php';
class Computer
{
// TODO: הגדירו מאפיינים פרטיים לאחסון אובייקטים מסוג Processor ו-Memory
// TODO: הבנאי צריך לקבל את דגם המעבד, מספר הליבות וגודל הזיכרון
// וליצור בתוכו את אובייקטי הרכיבים
public function __construct()
{
// TODO: צרו אובייקטים מסוג Processor ו-Memory ושמרו אותם
}
// TODO: ממשו את המתודה describe() שמחזירה
// "Computer with [processor specs] and [memory capacity]"
public function describe(): string
{
// TODO: העבירו את הטיפול לאובייקטי הרכיבים והחזירו מחרוזת מעוצבת
}
}
// קראו את הקלט
$processorModel = trim(fgets(STDIN));
$cores = intval(fgets(STDIN));
$memorySize = intval(fgets(STDIN));
// TODO: צרו Computer עם המפרט הנתון והדפיסו את התוצאה של describe()
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח $thisמתודותמאפייניםבנאי (__construct)הורס (__destruct)חזרה: מחשבון פשוט4ירושה
ירושה בסיסיתמילת המפתח parent::דריסת מתודותמילת המפתח finalמחלקות מופשטותסיכום – היררכיית עובדים7כימוס
ציבורי, מוגן, פרטימפרטי גישה לעומקמתודות גישה ועדכוןהסתרת מידעקידום פרמטרים בבנאי (8.0)סיכום – מערכת רישומי תלמידים10מושגי OOP מתקדמים
הרכבה לעומת ירושההזרקת תלויותמחלקות אנונימיותטיפוסי Enum (PHP 8.1)סיבים (PHP 8.1)העמקה בשכפול אובייקטיםמחוללים ואיטרטורים2מרחבי שמות וטעינה אוטומטית
מבוא למרחבי שמותמילת המפתח useתקן הטעינה האוטומטית PSR-4הטוען האוטומטי של Composerסיכום – פרויקט מאורגן5ממשקים וחוזים
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםממשק לעומת מחלקה מופשטתרמזי טיפוסים עם ממשקיםסיכום - מחשבון צורות8מתודות קסם
מבוא למתודות קסם__toString ו־__debugInfo__get, __set, __isset, __unset__call ו־__callStatic__clone ושיבוט אובייקטים__serialize ו־__unserializeסיכום – אוסף מותאם אישית3מאפייני מחלקה
מאפייני מופע לעומת מאפיינים סטטייםקבועים במחלקותמתודות ומאפיינים סטטייםמאפיינים פרטיים ומוגניםמאפיינים לקריאה בלבד (PHP 8.1)סיכום – מנהל חשבון בנק6פולימורפיזם
בחינה מחדש של דריסת מתודותפולימורפיזם באמצעות ממשקיםרמזי טיפוסים וטיפוסי איחודקישור סטטי מאוחרסיכום — מעבד תשלומיםתרגלו בעצמכם: קומפיילר PHP אונליין