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 man sensible Daten mit privaten und geschützten Eigenschaften schützt.
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). 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 mitparent::__construct($name, $salary)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", dem Gehalt75000und 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 Hauptunterschied zwischen geschützter (protected) und privater (private) Sichtbarkeit — protected ermöglicht den Zugriff durch Kindklassen, während private die Daten wirklich verborgen hält.
Probier es selbst
<?php
require_once 'Employee.php';
require_once 'Manager.php';
// TODO: Erstelle einen Manager mit dem Namen "Sarah", einem Gehalt von 75000 und der Abteilung "Engineering"
// TODO: Gib die Details des Managers mit getDetails() aus
// TODO: Gib dem Manager eine Gehaltserhöhung von 5000
// TODO: Gib 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