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 sensible Daten durch die Verwendung von privaten und geschützten Eigenschaften geschützt werden.

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 können). 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 für Name und Gehalt 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", einem Gehalt von 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 entscheidenden Unterschied zwischen geschützter (protected) und privater (private) Sichtbarkeit — protected erlaubt den Zugriff durch Kindklassen, während private Daten wirklich verborgen hält.

Spickzettel

PHP bietet drei Sichtbarkeitsmodifikatoren für Klasseneigenschaften:

  • public — von überall zugänglich
  • private — nur innerhalb der definierenden Klasse zugänglich
  • protected — innerhalb der definierenden Klasse und von Kindklassen zugänglich

Private Eigenschaften:

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

Auf private Eigenschaften kann nicht direkt von außerhalb der Klasse zugegriffen werden. Verwenden Sie öffentliche Methoden, um mit ihnen zu interagieren.

Geschützte Eigenschaften:

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

class Admin extends User {
    public function showEmail() {
        return $this->email; // Kindklasse kann auf geschützte Eigenschaft zugreifen
    }
}

Auf geschützte Eigenschaften können Kindklassen zugreifen, die die Elternklasse erweitern.

Wann man sie verwendet:

  • 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 schützen so den internen Zustand des Objekts

Probier es selbst

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

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

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

// TODO: Geben Sie dem Manager eine Gehaltserhöhung von 5000

// TODO: Geben Sie 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