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 zugegriffen werden kann. Aber manchmal müssen Sie den Zugriff einschränken, um Ihre Daten zu schützen. PHP bietet zwei zusätzliche Sichtbarkeitsmodifikatoren: private und protected.
Auf eine private Eigenschaft kann nur von innerhalb der Klasse zugegriffen werden, die sie definiert:
<?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:
100Der Versuch, direkt von außerhalb der Klasse auf $account->balance zuzugreifen, würde einen Fehler verursachen. Dies schützt den Kontostand davor, geändert zu werden, ohne die deposit-Methode zu verwenden.
Eine protected-Eigenschaft funktioniert ähnlich, aber auf sie kann auch von Kindklassen zugegriffen werden, die die Elternklasse 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.comWichtiger Punkt: Verwenden Sie private, wenn nur die definierende Klasse auf die Eigenschaft zugreifen soll. Verwenden Sie protected, wenn auch Kindklassen Zugriff benötigen. Beide verhindern den direkten externen Zugriff und halten den internen Zustand Ihres Objekts sicher.
Aufgabe
EinfachLassen Sie uns ein sicheres Mitarbeiterverwaltungssystem erstellen, das zeigt, wie sensible Daten durch die Verwendung von privaten und geschützten Eigenschaften geschützt werden.
Sie werden drei Dateien erstellen, die zusammenarbeiten, um Mitarbeiterinformationen mit ordnungsgemäßer Zugriffskontrolle zu verwalten:
Employee.php— Definieren Sie eineEmployee-Klasse, die als Basis für alle Mitarbeiter dient. Sie sollte eineprotected $name-Eigenschaft haben (damit Kindklassen darauf zugreifen können) und eineprivate $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ügen Sie eine öffentlichegetName()-Methode hinzu, die den Namen zurückgibt, eine öffentlichegetSalary()-Methode, die das Gehalt zurückgibt, und eine öffentlichegiveRaise($amount)-Methode, die das Gehalt um den angegebenen Betrag erhöht.Manager.php— Definieren Sie eineManager-Klasse, dieEmployeeerweitert. Binden Sie die Employee-Datei oben ein. Fügen Sie eine private$department-Eigenschaft hinzu. Der Konstruktor sollte Name, Gehalt und Abteilung akzeptieren — rufen Sie den Eltern-Konstruktor für Name und Gehalt auf und setzen Sie dann die Abteilung. Erstellen Sie einegetDetails()-Methode, die"[name] manages [department]"zurückgibt, indem sie direkt auf die geschützte$name-Eigenschaft zugreift. Fügen Sie außerdem einegetDepartment()-Methode hinzu, die die Abteilung zurückgibt.main.php— Binden Sie beide Klassendateien ein. Erstellen Sie einenManagermit dem Namen"Sarah", einem Gehalt von75000und der Abteilung"Engineering". Geben Sie die Details des Managers mitgetDetails()aus. Geben Sie dem Manager dann eine Gehaltserhöhung von5000und geben Sie sein neues Gehalt mitgetSalary()aus. Jede Ausgabe sollte in einer eigenen Zeile stehen.
Beachten Sie, wie die Manager-Klasse direkt auf die geschützte $name-Eigenschaft zugreifen kann, aber die getSalary()-Methode verwenden muss, um auf das private Gehalt zuzugreifen. Dies demonstriert den entscheidenden Unterschied zwischen geschützter (protected) und privater (private) Sichtbarkeit — protected erlaubt den Zugriff durch Kindklassen, während private Daten wirklich verborgen hält.
Spickzettel
PHP bietet drei Sichtbarkeitsmodifikatoren für Klasseneigenschaften:
public— von überall zugänglichprivate— nur innerhalb der definierenden Klasse zugänglichprotected— innerhalb der definierenden Klasse und von Kindklassen zugänglich
Private Eigenschaften:
class BankAccount {
private $balance = 0;
public function deposit($amount) {
$this->balance += $amount;
}
public function getBalance() {
return $this->balance;
}
}Auf private Eigenschaften kann nicht direkt von außerhalb der Klasse zugegriffen werden. Verwenden Sie öffentliche Methoden, um mit ihnen zu interagieren.
Geschützte Eigenschaften:
class User {
protected $email;
public function __construct($email) {
$this->email = $email;
}
}
class Admin extends User {
public function showEmail() {
return $this->email; // Kindklasse kann auf geschützte Eigenschaft zugreifen
}
}Auf geschützte Eigenschaften können Kindklassen zugreifen, die die Elternklasse erweitern.
Wann man sie verwendet:
- Verwenden Sie
private, wenn nur die definierende Klasse auf die Eigenschaft zugreifen soll - Verwenden Sie
protected, wenn auch Kindklassen Zugriff benötigen - Beide verhindern den direkten externen Zugriff und schützen so den internen Zustand des Objekts
Probier es selbst
<?php
require_once 'Employee.php';
require_once 'Manager.php';
// TODO: Erstellen Sie einen Manager mit dem Namen "Sarah", einem Gehalt von 75000 und der Abteilung "Engineering"
// TODO: Geben Sie die Details des Managers mit getDetails() aus
// TODO: Geben Sie dem Manager eine Gehaltserhöhung von 5000
// TODO: Geben Sie das neue Gehalt mit 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