Ö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
1000Der 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.
| Modifikator | Dieselbe Klasse | Unterklasse | Außerhalb |
|---|---|---|---|
public | Ja | Ja | Ja |
protected | Ja | Ja | Nein |
private | Ja | Nein | Nein |
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.
Aufgabe
EinfachErstellen 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 eineEmployee-Klasse, die Mitarbeiterdaten mit geeigneten Sichtbarkeitsebenen verwaltet. Die Klasse sollte Folgendes enthalten:- Eine
public-Eigenschaft$namefür den Namen des Mitarbeiters (für alle sicher sichtbar) - Eine
protected-Eigenschaft$employeeIdfür die interne ID (von Kindklassen benötigt) - Eine
private-Eigenschaft$salaryfür sensible Gehaltsinformationen (nur diese Klasse sollte direkt darauf zugreifen)
getSalary()hinzu, die das private Gehalt zurückgibt. Dies ist der kontrollierte Weg, auf geschützte Daten zuzugreifen. Füge außerdem eine öffentliche MethodegetPublicInfo()hinzu, die"[name] works here"zurückgibt.- Eine
Manager.php: Erstelle eineManager-Klasse, dieEmployeeerweitert. 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 MethodegetTeamInfo()hinzu, die"Manager [name] (ID: [employeeId]) leads [department]"zurückgibt. Beachte, dass die Kindklasse auf die geschützte Eigenschaft$employeeIdzugreifen kann, abergetSalary()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 vonManager. 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
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler