Menu
Coddy logo textTech

מפרטי גישה לעומק

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

challenge icon

אתגר

קל

בואו נבנה מערכת לניהול מכשירים, שתבחן כיצד משני גישה מתנהגים בירושה. תיצרו מחלקת בסיס 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() שעברה בירושה
?>
quiz iconבחנו את עצמכם

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

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

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