Menu
Coddy logo textTech

ציבורי, מוגן, פרטי

חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 38 מתוך 91.

ברוכים הבאים לפרק הכימוס! כימוס עוסק בשליטה בגישה לנתונים הפנימיים של המחלקה שלך. PHP מספקת שלושה משני גישה שקובעים מאיפה אפשר לגשת למאפיינים ולמתודות: public, protected ו־private.

כך פועל כל משנה:

<?php
class BankAccount {
    public $accountHolder;    // נגיש מכל מקום
    protected $accountNumber; // נגיש במחלקה זו ובמחלקות היורשות ממנה
    private $balance;         // נגיש רק במחלקה זו
    
    public function __construct($holder, $number, $balance) {
        $this->accountHolder = $holder;
        $this->accountNumber = $number;
        $this->balance = $balance;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount("John", "12345", 1000);

echo $account->accountHolder . "\n";  // עובד - ציבורי
echo $account->getBalance();          // עובד - מתודה ציבורית

פלט:

John
1000

ניסיון לגשת ישירות אל $account->balance יגרום לשגיאה כי הוא פרטי. אותו הדבר חל על $account->accountNumber מחוץ להיררכיית המחלקות. ההגנה הזאת מבטיחה שניתן לשנות נתונים רגישים רק באמצעות שיטות מבוקרות.

משנה גישהאותה מחלקהמחלקת צאצאמחוץ למחלקה
publicכןכןכן
protectedכןכןלא
privateכןלאלא

נקודה חשובה: השתמשו ב-private עבור נתונים פנימיים שאין לגשת אליהם ישירות, ב-protected עבור נתונים שמחלקות יורשות זקוקות להם, וב-public רק עבור גישה חיצונית בטוחה.

challenge icon

אתגר

קל

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

תארגנו את הקוד בשלושה קבצים:

  • Employee.php: צרו מחלקת Employee שמנהלת נתוני עובדים באמצעות רמות החשיפה המתאימות. למחלקה צריכים להיות:
    • מאפיין public בשם $name עבור שם העובד (בטוח להצגה לכולם)
    • מאפיין protected בשם $employeeId עבור המזהה הפנימי (נחוץ למחלקות צאצא)
    • מאפיין private בשם $salary עבור מידע רגיש על השכר (רק המחלקה הזאת אמורה לגשת אליו ישירות)
    הבנאי צריך לקבל את שלושת הערכים ולהקצות אותם. הוסיפו מתודה ציבורית getSalary() שמחזירה את השכר הפרטי. זו הדרך המבוקרת לגשת לנתונים המוגנים. הוסיפו גם מתודה ציבורית getPublicInfo() שמחזירה את "[name] works here".
  • Manager.php: צרו מחלקת Manager שמרחיבה את Employee. כללו את קובץ Employee. הבנאי צריך לקבל שם, employeeId, שכר ושם מחלקה. קראו לבנאי של מחלקת האב עם שלושת הערכים הראשונים, ואז שמרו את המחלקה במאפיין פרטי. הוסיפו מתודה ציבורית getTeamInfo() שמחזירה את "Manager [name] (ID: [employeeId]) leads [department]". שימו לב שמחלקת הצאצא יכולה לגשת אל $employeeId המוגן, אבל כדי לגשת לשכר הפרטי היא תצטרך להשתמש ב-getSalary().
  • main.php: כללו את קובץ Manager. תקבלו ארבעה קלטים: שם, מזהה עובד, שכר (כמחרוזת שתמירו למספר שלם) ושם מחלקה. צרו מופע Manager עם הערכים האלה. הדפיסו שלוש שורות:
    • שם המנהל, שאליו ניגשים ישירות (מאפיין ציבורי)
    • התוצאה של קריאה ל-getTeamInfo()
    • התוצאה של קריאה ל-getSalary()

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

נסו בעצמכם

<?php
require_once 'Manager.php';

// קרא את הקלטים
$name = trim(fgets(STDIN));
$employeeId = trim(fgets(STDIN));
$salary = intval(trim(fgets(STDIN)));
$department = trim(fgets(STDIN));

// TODO: צור מופע של Manager עם ערכי הקלט

// TODO: הדפס את שם המנהל (בגישה ישירה כמאפיין ציבורי)

// TODO: הדפס את התוצאה של הקריאה ל-getTeamInfo()

// TODO: הדפס את התוצאה של הקריאה ל-getSalary()
?>
quiz iconבחנו את עצמכם

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

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

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