Menu
Coddy logo textTech

Private & geschützte Eigenschaften

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 18 von 91.

Bisher haben wir public Eigenschaften verwendet, auf die von überall zugegriffen werden kann. Aber manchmal müssen Sie den Zugriff einschränken, um Ihre Daten zu schützen. PHP bietet zwei zusätzliche Sichtbarkeitsmodifikatoren: private und protected.

Auf eine private Eigenschaft kann nur von innerhalb der Klasse zugegriffen werden, die sie definiert:

<?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();

Ausgabe:

100

Der Versuch, direkt von außerhalb der Klasse auf $account->balance zuzugreifen, würde einen Fehler verursachen. Dies schützt den Kontostand davor, geändert zu werden, ohne die deposit-Methode zu verwenden.

Eine protected-Eigenschaft funktioniert ähnlich, aber auf sie kann auch von Kindklassen zugegriffen werden, die die Elternklasse erweitern:

<?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();

Ausgabe:

admin@example.com

Wichtiger Punkt: Verwenden Sie private, wenn nur die definierende Klasse auf die Eigenschaft zugreifen soll. Verwenden Sie protected, wenn auch Kindklassen Zugriff benötigen. Beide verhindern den direkten externen Zugriff und halten den internen Zustand Ihres Objekts sicher.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein sicheres Mitarbeiterverwaltungssystem erstellen, das zeigt, wie man sensible Daten mit privaten und geschützten Eigenschaften schützt.

Sie werden drei Dateien erstellen, die zusammenarbeiten, um Mitarbeiterinformationen mit ordnungsgemäßer Zugriffskontrolle zu verwalten:

  • Employee.php — Definieren Sie eine Employee-Klasse, die als Basis für alle Mitarbeiter dient. Sie sollte eine protected $name-Eigenschaft haben (damit Kindklassen darauf zugreifen können) und eine private $salary-Eigenschaft (nur diese Klasse sollte Gehälter direkt ändern). Der Konstruktor akzeptiert einen Namen und ein Gehalt und setzt beide Eigenschaften. Fügen Sie eine öffentliche getName()-Methode hinzu, die den Namen zurückgibt, eine öffentliche getSalary()-Methode, die das Gehalt zurückgibt, und eine öffentliche giveRaise($amount)-Methode, die das Gehalt um den angegebenen Betrag erhöht.
  • Manager.php — Definieren Sie eine Manager-Klasse, die Employee erweitert. Binden Sie die Employee-Datei oben ein. Fügen Sie eine private $department-Eigenschaft hinzu. Der Konstruktor sollte Name, Gehalt und Abteilung akzeptieren — rufen Sie den Eltern-Konstruktor mit parent::__construct($name, $salary) auf und setzen Sie dann die Abteilung. Erstellen Sie eine getDetails()-Methode, die "[name] manages [department]" zurückgibt, indem sie direkt auf die geschützte $name-Eigenschaft zugreift. Fügen Sie außerdem eine getDepartment()-Methode hinzu, die die Abteilung zurückgibt.
  • main.php — Binden Sie beide Klassendateien ein. Erstellen Sie einen Manager mit dem Namen "Sarah", dem Gehalt 75000 und der Abteilung "Engineering". Geben Sie die Details des Managers mit getDetails() aus. Geben Sie dem Manager dann eine Gehaltserhöhung von 5000 und geben Sie sein neues Gehalt mit getSalary() aus. Jede Ausgabe sollte in einer eigenen Zeile stehen.

Beachten Sie, wie die Manager-Klasse direkt auf die geschützte $name-Eigenschaft zugreifen kann, aber die getSalary()-Methode verwenden muss, um auf das private Gehalt zuzugreifen. Dies demonstriert den Hauptunterschied zwischen geschützter (protected) und privater (private) Sichtbarkeit — protected ermöglicht den Zugriff durch Kindklassen, während private die Daten wirklich verborgen hält.

Probier es selbst

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

// TODO: Erstelle einen Manager mit dem Namen "Sarah", einem Gehalt von 75000 und der Abteilung "Engineering"

// TODO: Gib die Details des Managers mit getDetails() aus

// TODO: Gib dem Manager eine Gehaltserhöhung von 5000

// TODO: Gib das neue Gehalt mit getSalary() aus
?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung