Menu
Coddy logo textTech

מאפיינים פרטיים ומוגנים

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

עד כה השתמשנו במאפייני public שאפשר לגשת אליהם מכל מקום. אבל לפעמים צריך להגביל את הגישה כדי להגן על הנתונים שלך. PHP מספקת שני מצייני נראות נוספים: private ו-protected.

ניתן לגשת למאפיין private רק מתוך המחלקה שמגדירה אותו:

<?php
class BankAccount {
    private $balance = 0;
    
    public function deposit($amount) {
        $this->balance += $amount;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance();

פלט:

100

ניסיון לגשת ישירות אל $account->balance מחוץ למחלקה יגרום לשגיאה. כך היתרה מוגנת מפני שינוי ללא שימוש בשיטה deposit.

מאפיין protected פועל באופן דומה, אך גם מחלקות צאצא שמרחיבות את מחלקת האב יכולות לגשת אליו:

<?php
class User {
    protected $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

class Admin extends User {
    public function showEmail() {
        return $this->email;
    }
}

$admin = new Admin("admin@example.com");
echo $admin->showEmail();

פלט:

admin@example.com

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

challenge icon

אתגר

קל

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

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

  • Employee.php: הגדירו מחלקה בשם Employee שתשמש כמחלקת בסיס לכל העובדים. צריכה להיות לה תכונה protected $name (כדי שמחלקות יורשות יוכלו לגשת אליה) ותכונה private $salary (רק המחלקה הזאת צריכה לשנות משכורות ישירות). הבנאי מקבל שם ומשכורת ומגדיר את שתי התכונות. הוסיפו מתודה ציבורית getName() שמחזירה את השם, מתודה ציבורית getSalary() שמחזירה את המשכורת, ומתודה ציבורית giveRaise($amount) שמגדילה את המשכורת בסכום הנתון.
  • Manager.php: הגדירו מחלקה בשם Manager שיורשת מ-Employee. כללו את קובץ Employee בתחילת הקובץ. הוסיפו תכונה פרטית $department. הבנאי צריך לקבל שם, משכורת ומחלקה: לקרוא לבנאי של מחלקת האב באמצעות parent::__construct($name, $salary), ואז להגדיר את המחלקה. צרו מתודה getDetails() שמחזירה "[name] manages [department]" באמצעות גישה ישירה לתכונה המוגנת $name. הוסיפו גם מתודה getDepartment() שמחזירה את המחלקה.
  • main.php: כללו את שני קובצי המחלקות. צרו מופע של Manager עם השם "Sarah", משכורת 75000 ומחלקה "Engineering". הדפיסו את הפרטים של המנהל באמצעות getDetails(). לאחר מכן תנו למנהל העלאה של 5000 והדפיסו את המשכורת החדשה שלו באמצעות getSalary(). כל פלט צריך להופיע בשורה נפרדת.

שימו לב שמחלקת Manager יכולה לגשת ישירות לתכונה המוגנת $name, אבל כדי לגשת למשכורת הפרטית היא חייבת להשתמש במתודה getSalary(). הדבר מדגים את ההבדל המרכזי בין הרשאות protected ו-private: הרשאת protected מאפשרת למחלקות יורשות לגשת לתכונה, ואילו הרשאת private משאירה את הנתונים מוסתרים באמת.

נסו בעצמכם

<?php
require_once 'Employee.php';
require_once 'Manager.php';

// TODO: צרו Manager בשם "Sarah", עם שכר של 75000 ובמחלקה "Engineering"

// TODO: הדפיסו את פרטי המנהל באמצעות getDetails()

// TODO: העניקו למנהל העלאה של 5000

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

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

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

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