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