מפרטי גישה לעומק
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 39 מתוך 91.
עכשיו, אחרי שהבנת את שלושת מגבילי הגישה, נבחן איך הם מתנהגים בתרחישי ירושה. הנקודה החשובה היא שחברים מסוג protected הופכים לנגישים למחלקות צאצא, בעוד שחברים מסוג private נשארים מוסתרים אפילו ממחלקות צאצא.
<?php
class Vehicle {
public $brand;
protected $engineType;
private $serialNumber;
public function __construct($brand, $engine, $serial) {
$this->brand = $brand;
$this->engineType = $engine;
$this->serialNumber = $serial;
}
private function getSerial() {
return $this->serialNumber;
}
protected function getEngineInfo() {
return $this->engineType;
}
}
class Car extends Vehicle {
public function getDetails() {
return $this->brand . " - " . $this->getEngineInfo();
// $this->serialNumber יגרום לשגיאה - פרטי!
// $this->getSerial() גם ייכשל - מתודה פרטית!
}
}
$car = new Car("Toyota", "V6", "ABC123");
echo $car->getDetails();
פלט:
Toyota - V6המחלקה Car יכולה לגשת אל $brand (ציבורי) ולקרוא ל־getEngineInfo() (מוגן), אך אין לה גישה אל $serialNumber או אל getSerial(), מכיוון שהם פרטיים ל־Vehicle. ההבחנה הזאת מאפשרת לך לשתף חלק מהפרטים הפנימיים עם מחלקות יורשות, תוך הסתרה מוחלטת של אחרים.
נקודה חשובה: השתמשו ב־protected כאשר מחלקות יורשות צריכות לגשת לנתונים פנימיים או למתודות, וב־private כאשר גם מחלקות יורשות לא צריכות לגעת בפרטי מימוש מסוימים.
אתגר
קלבואו נבנה מערכת לניהול מכשירים, שתבחן כיצד משני גישה מתנהגים בירושה. תיצרו מחלקת בסיס Device עם מאפיינים ברמות נראות שונות, ואז תרחיבו אותה באמצעות מחלקת Smartphone, שתדגים לאילו איברים מחלקות יורשות יכולות ולא יכולות לגשת.
תארגנו את הקוד בשלושה קבצים:
Device.php: צרו מחלקתDeviceשמייצגת מכשירים אלקטרוניים עם רמות שונות של רגישות נתונים. כללו:- מאפיין
publicבשם$brandעבור שם היצרן - מאפיין
protectedבשם$modelNumberעבור זיהוי פנימי - מאפיין
privateבשם$manufacturingCodeעבור נתונים המיועדים למפעל בלבד
privateבשםgetManufacturingCode()שמחזירה את קוד הייצור. הוסיפו מתודהpublicבשםgetModelInfo()שמחזירה את"Model: [modelNumber]". לבסוף, הוסיפו מתודהpublicבשםgetFullCode()שמחזירה את"[brand]-[manufacturingCode]". כך מודגם כיצד המחלקה עצמה יכולה לגשת לאיברים הפרטיים שלה.- מאפיין
Smartphone.php: צרו מחלקתSmartphoneשמרחיבה אתDevice. כללו את קובץ Device. הבנאי צריך לקבל מותג, modelNumber, manufacturingCode ושם של מערכת הפעלה. קראו לבנאי של מחלקת האב עם שלושת הערכים הראשונים, ואז שמרו את מערכת ההפעלה במאפיין פרטי. הוסיפו מתודה ציבוריתgetDeviceDetails()שמחזירה את"[brand] [modelNumber] running [os]". שימו לב שאתם יכולים לגשת ישירות למאפיין הציבורי$brandולמאפיין המוגן$modelNumber, אך אינכם יכולים לגשת ישירות למאפיין הפרטי$manufacturingCode: במקום זאת, תצטרכו להשתמש במתודה הציבורית שעוברת בירושהgetFullCode().main.php: כללו את קובץ Smartphone. תקבלו ארבעה קלטים: שם מותג, מספר דגם, קוד ייצור ומערכת הפעלה. צרו מופע שלSmartphoneעם הערכים האלה. הדפיסו שלוש שורות:- התוצאה של הקריאה ל־
getDeviceDetails() - התוצאה של הקריאה למתודה שעוברת בירושה
getModelInfo() - התוצאה של הקריאה למתודה שעוברת בירושה
getFullCode()
- התוצאה של הקריאה ל־
האתגר הזה מדגיש את ההבדל המרכזי: מחלקת Smartphone יכולה להשתמש בחופשיות במאפיין המוגן $modelNumber שעובר בירושה מ־Device, אך המאפיין הפרטי $manufacturingCode והמתודה getManufacturingCode() נשארים מוסתרים לחלוטין: ניתן לגשת אליהם רק דרך הממשק הציבורי ש־Device בוחרת לחשוף.
נסו בעצמכם
<?php
require_once 'Smartphone.php';
// קרא את נתוני הקלט
$brand = trim(fgets(STDIN));
$modelNumber = trim(fgets(STDIN));
$manufacturingCode = trim(fgets(STDIN));
$os = trim(fgets(STDIN));
// TODO: צור מופע של Smartphone עם ערכי הקלט
// TODO: הדפס את התוצאה של getDeviceDetails()
// TODO: הדפס את התוצאה של המתודה getModelInfo() שעברה בירושה
// TODO: הדפס את התוצאה של המתודה getFullCode() שעברה בירושה
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין