Menu
Coddy logo textTech

Öffentlich, geschützt, privat

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

Willkommen im Kapitel über Kapselung! Bei der Kapselung geht es darum, den Zugriff auf die internen Daten deiner Klasse zu steuern. PHP stellt drei Zugriffsmodifikatoren bereit, 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; // Zugänglich in dieser Klasse und in Kindklassen
    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 - public method

Ausgabe:

John
1000

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

ModifikatorDieselbe KlasseUnterklasseAußerhalb
publicJaJaJa
protectedJaJaNein
privateJaNeinNein

Wichtiger Punkt: Verwende private für interne Daten, auf die nicht directly zugegriffen werden sollte, protected für Daten, die child-Klassen benötigen, und public nur für sicheren externen access.

challenge icon

Aufgabe

Einfach

Erstellen wir ein sicheres Mitarbeiterverwaltungssystem, das zeigt, wie Zugriffsmodifikatoren sensible Daten schützen. Du erstellst eine Klassenhierarchie, in der unterschiedliche Informationsebenen abhängig davon zugänglich sind, wo der Code ausgeführt wird: innerhalb der Klasse, in einer Kindklasse oder von außerhalb.

Du organisierst deinen Code auf drei Dateien:

  • Employee.php: Erstelle eine Employee-Klasse, die Mitarbeiterdaten mit geeigneten Sichtbarkeitsebenen verwaltet. Die Klasse sollte Folgendes enthalten:
    • Eine public-Eigenschaft $name für den Namen des Mitarbeiters (für alle sicher sichtbar)
    • Eine protected-Eigenschaft $employeeId für die interne ID (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üge eine öffentliche Methode getSalary() hinzu, die das private Gehalt zurückgibt. Dies ist der kontrollierte Weg, auf geschützte Daten zuzugreifen. Füge außerdem eine öffentliche Methode getPublicInfo() hinzu, die "[name] works here" zurückgibt.
  • Manager.php: Erstelle eine Manager-Klasse, die Employee erweitert. Binde die Employee-Datei ein. Der Konstruktor sollte Name, employeeId, Gehalt und einen Abteilungsnamen akzeptieren. Rufe den übergeordneten Konstruktor mit den ersten drei Werten auf und speichere anschließend die Abteilung in einer privaten Eigenschaft. Füge eine öffentliche Methode getTeamInfo() hinzu, die "Manager [name] (ID: [employeeId]) leads [department]" zurückgibt. Beachte, dass die Kindklasse auf die geschützte Eigenschaft $employeeId zugreifen kann, aber getSalary() benötigen würde, um auf das private Gehalt zuzugreifen.
  • main.php: Binde die Manager-Datei ein. Du erhältst vier Eingaben: einen Namen, eine Mitarbeiter-ID, ein Gehalt (als Zeichenfolge, die du in eine Ganzzahl umwandelst) und einen Abteilungsnamen. Erstelle mit diesen Werten eine Instanz von Manager. Gib drei Zeilen aus:
    • Den Namen des Managers, direkt abgerufen (öffentliche Eigenschaft)
    • Das Ergebnis des Aufrufs von getTeamInfo()
    • Das Ergebnis des Aufrufs von getSalary()

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

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: Erstelle eine Manager-Instanz mit den Eingabewerten

// TODO: Gib den Namen des Managers aus (direkt als öffentliche Eigenschaft zugegriffen)

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

// TODO: Gib 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

Übe selbstständig: Online-PHP-Compiler