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
1000Der 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.
| Modifikator | Gleiche Klasse | Unterklasse | Außerhalb |
|---|---|---|---|
public | Ja | Ja | Ja |
protected | Ja | Ja | Nein |
private | Ja | Nein | Nein |
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.
Aufgabe
EinfachLassen 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 eineEmployee-Klasse, die Mitarbeiterdaten mit angemessenen Sichtbarkeitsstufen verwaltet. Die Klasse sollte Folgendes haben:- Eine
publicEigenschaft$namefür den Namen des Mitarbeiters (für jeden sichtbar) - Eine
protectedEigenschaft$employeeIdfür die interne ID (wird von Kindklassen benötigt) - Eine
privateEigenschaft$salaryfür sensible Gehaltsinformationen (nur diese Klasse sollte direkt darauf zugreifen)
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 MethodegetPublicInfo()hinzu, die"[name] works here"zurückgibt.- Eine
Manager.php— Erstellen Sie eineManager-Klasse, dieEmployeeerweitert. 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 MethodegetTeamInfo()hinzu, die"Manager [name] (ID: [employeeId]) leads [department]"zurückgibt. Beachten Sie, wie die Kindklasse auf die geschützte$employeeIdzugreifen kann, abergetSalary()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 eineManager-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:
| Modifikator | Gleiche Klasse | Kindklasse | Außerhalb |
|---|---|---|---|
public | Ja | Ja | Ja |
protected | Ja | Ja | Nein |
private | Ja | Nein | Nein |
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
privatefür interne Daten, auf die nicht direkt zugegriffen werden sollte - Verwenden Sie
protectedfür Daten, die Kindklassen benötigen - Verwenden Sie
publicnur 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
?>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 die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung