Menu
Coddy logo textTech

Public, Protected, Private

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

Willkommen zum Kapitel über Kapselung! Bei der Kapselung geht es darum, den Zugriff auf die internen Daten Ihrer Klasse zu kontrollieren. PHP bietet drei Zugriffsmodifikatoren, die bestimmen, von wo aus auf Eigenschaften und Methoden zugegriffen werden kann: public, protected und private.

So funktioniert jeder Modifikator:

<?php
class BankAccount {
    public $accountHolder;    // Von überall zugänglich
    protected $accountNumber; // In dieser Klasse und Kindklassen zugänglich
    private $balance;         // Nur in dieser Klasse zugänglich
    
    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";  // Funktioniert - public
echo $account->getBalance();          // Funktioniert - öffentliche Methode

Ausgabe:

John
1000

Der Versuch, direkt auf $account->balance zuzugreifen, würde einen Fehler verursachen, da es privat ist. Dasselbe gilt für $account->accountNumber von außerhalb der Klassenhierarchie. Dieser Schutz stellt sicher, dass sensible Daten nur über kontrollierte Methoden geändert werden können.

ModifikatorGleiche KlasseUnterklasseAußerhalb
publicJaJaJa
protectedJaJaNein
privateJaNeinNein

Wichtiger Punkt: Verwenden Sie private für interne Daten, auf die nicht direkt zugegriffen werden sollte, protected für Daten, die Kindklassen benötigen, und public nur für den sicheren externen Zugriff.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein sicheres Mitarbeiterverwaltungssystem erstellen, das demonstriert, wie Zugriffsmodifikatoren sensible Daten schützen. Sie werden eine Klassenhierarchie erstellen, in der verschiedene Informationsebenen zugänglich sind, je nachdem, wo der Code ausgeführt wird — innerhalb der Klasse, in einer Kindklasse oder von außen.

Sie werden Ihren Code über drei Dateien organisieren:

  • Employee.php — Erstellen Sie eine Employee-Klasse, die Mitarbeiterdaten mit angemessenen Sichtbarkeitsstufen verwaltet. Die Klasse sollte Folgendes haben:
    • Eine public Eigenschaft $name für den Namen des Mitarbeiters (für jeden sichtbar)
    • Eine protected Eigenschaft $employeeId für die interne ID (wird von Kindklassen benötigt)
    • Eine private Eigenschaft $salary für sensible Gehaltsinformationen (nur diese Klasse sollte direkt darauf zugreifen)
    Der Konstruktor sollte alle drei Werte akzeptieren und sie zuweisen. Fügen Sie eine öffentliche Methode getSalary() hinzu, die das private Gehalt zurückgibt — dies ist der kontrollierte Weg, um auf geschützte Daten zuzugreifen. Fügen Sie außerdem eine öffentliche Methode getPublicInfo() hinzu, die "[name] works here" zurückgibt.
  • Manager.php — Erstellen Sie eine Manager-Klasse, die Employee erweitert. Binden Sie die Employee-Datei ein. Der Konstruktor sollte Name, employeeId, Gehalt und einen Abteilungsnamen akzeptieren. Rufen Sie den Eltern-Konstruktor mit den ersten drei Werten auf und speichern Sie dann die Abteilung in einer privaten Eigenschaft. Fügen Sie eine öffentliche Methode getTeamInfo() hinzu, die "Manager [name] (ID: [employeeId]) leads [department]" zurückgibt. Beachten Sie, wie die Kindklasse auf die geschützte $employeeId zugreifen kann, aber getSalary() benötigen würde, um auf das private Gehalt zuzugreifen.
  • main.php — Binden Sie die Manager-Datei ein. Sie erhalten vier Eingaben: einen Namen, eine Mitarbeiter-ID, ein Gehalt (als String, den Sie in einen Integer umwandeln) und einen Abteilungsnamen. Erstellen Sie eine Manager-Instanz mit diesen Werten. Geben Sie drei Zeilen aus:
    • Den Namen des Managers, auf den direkt zugegriffen wird (öffentliche Eigenschaft)
    • Das Ergebnis des Aufrufs von getTeamInfo()
    • Das Ergebnis des Aufrufs von getSalary()

Diese Herausforderung zeigt Kapselung in Aktion: Der Name ist frei zugänglich, die Mitarbeiter-ID wird über die geschützte Sichtbarkeit mit Kindklassen geteilt, und das Gehalt bleibt in der Elternklasse verschlossen — zugänglich nur über eine kontrollierte öffentliche Methode.

Spickzettel

PHP bietet drei Zugriffsmodifikatoren (access modifiers), um zu steuern, von wo aus auf Eigenschaften und Methoden zugegriffen werden kann:

ModifikatorGleiche KlasseKindklasseAußerhalb
publicJaJaJa
protectedJaJaNein
privateJaNeinNein

Beispiel:

<?php
class BankAccount {
    public $accountHolder;    // Von überall zugänglich
    protected $accountNumber; // In dieser Klasse und Kindklassen zugänglich
    private $balance;         // Nur in dieser Klasse zugänglich
    
    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;  // Funktioniert - public
echo $account->getBalance();   // Funktioniert - öffentliche Methode

Best Practices:

  • Verwenden Sie private für interne Daten, auf die nicht direkt zugegriffen werden sollte
  • Verwenden Sie protected für Daten, die Kindklassen benötigen
  • Verwenden Sie public nur für den sicheren externen Zugriff

Probier es selbst

<?php
require_once 'Manager.php';

// Eingaben lesen
$name = trim(fgets(STDIN));
$employeeId = trim(fgets(STDIN));
$salary = intval(trim(fgets(STDIN)));
$department = trim(fgets(STDIN));

// TODO: Erstellen Sie eine Manager-Instanz mit den Eingabewerten

// TODO: Geben Sie den Namen des Managers aus (direkter Zugriff als öffentliche Eigenschaft)

// TODO: Geben Sie das Ergebnis des Aufrufs von getTeamInfo() aus

// TODO: Geben Sie das Ergebnis des Aufrufs von 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