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 aus zugegriffen werden kann. Manchmal musst du den Zugriff jedoch einschränken, um deine Daten zu schützen. PHP bietet zwei zusätzliche Sichtbarkeitsmodifikatoren: private und protected.

Auf eine private-Eigenschaft kann nur innerhalb der Klasse zugegriffen werden, in der sie definiert ist:

<?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, von außerhalb der Klasse direkt auf $account->balance zuzugreifen, würde einen Fehler verursachen. Dadurch wird das Guthaben davor geschützt, geändert zu werden, ohne die Methode deposit zu verwenden.

Eine protected-Eigenschaft funktioniert ähnlich, kann aber auch von untergeordneten Klassen aufgerufen werden, die die übergeordnete Klasse 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: Verwende private, wenn nur die definierende Klasse auf die Eigenschaft zugreifen sollte. Verwende protected, wenn auch untergeordnete Klassen Zugriff benötigen. Beide verhindern den direkten externen Zugriff und halten dadurch den internen Zustand deines Objekts sicher.

challenge icon

Aufgabe

Einfach

Erstellen wir ein sicheres Mitarbeiterverwaltungssystem, das zeigt, wie sensible Daten mithilfe privater und geschützter Eigenschaften geschützt werden können.

Du erstellst drei Dateien, die zusammenarbeiten, um Mitarbeiterinformationen mit einer angemessenen Zugriffskontrolle zu verwalten:

  • Employee.php: Definiere eine Employee-Klasse, die als Grundlage für alle Mitarbeiter dient. Sie sollte eine protected $name-Eigenschaft haben (damit untergeordnete Klassen 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üge 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: Definiere eine Manager-Klasse, die Employee erweitert. Binde die Employee-Datei am Anfang ein. Füge eine private $department-Eigenschaft hinzu. Der Konstruktor sollte Name, Gehalt und Abteilung akzeptieren: Rufe den übergeordneten Konstruktor mit parent::__construct($name, $salary) auf und setze anschließend die Abteilung. Erstelle eine getDetails()-Methode, die durch direkten Zugriff auf die geschützte $name-Eigenschaft "[name] manages [department]" zurückgibt. Füge außerdem eine getDepartment()-Methode hinzu, die die Abteilung zurückgibt.
  • main.php: Binde beide Klassendateien ein. Erstelle einen Manager mit dem Namen "Sarah", dem Gehalt 75000 und der Abteilung "Engineering". Gib die Details der Führungskraft mit getDetails() aus. Gewähre der Führungskraft anschließend eine Gehaltserhöhung von 5000 und gib ihr neues Gehalt mit getSalary() aus. Jede Ausgabe sollte in einer eigenen Zeile stehen.

Beachte, dass die Manager-Klasse direkt auf die geschützte $name-Eigenschaft zugreifen kann, aber die Methode getSalary() verwenden muss, um auf das private Gehalt zuzugreifen. Dies veranschaulicht den wesentlichen Unterschied zwischen geschützter und privater Sichtbarkeit: Geschützt ermöglicht den Zugriff durch untergeordnete Klassen, während privat 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", Gehalt 75000 und 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

Übe selbstständig: Online-PHP-Compiler