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 aus zugegriffen werden kann. Manchmal musst du den Zugriff jedoch einschränken, um deine Daten zu schützen. PHP bietet zwei zusätzliche Sichtbarkeitsmodifikatoren: private und protected.
Auf eine private-Eigenschaft kann nur innerhalb der Klasse zugegriffen werden, in der sie definiert ist:
<?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, von außerhalb der Klasse direkt auf $account->balance zuzugreifen, würde einen Fehler verursachen. Dadurch wird das Guthaben davor geschützt, geändert zu werden, ohne die Methode deposit zu verwenden.
Eine protected-Eigenschaft funktioniert ähnlich, kann aber auch von untergeordneten Klassen aufgerufen werden, die die übergeordnete Klasse 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: Verwende private, wenn nur die definierende Klasse auf die Eigenschaft zugreifen sollte. Verwende protected, wenn auch untergeordnete Klassen Zugriff benötigen. Beide verhindern den direkten externen Zugriff und halten dadurch den internen Zustand deines Objekts sicher.
Aufgabe
EinfachErstellen wir ein sicheres Mitarbeiterverwaltungssystem, das zeigt, wie sensible Daten mithilfe privater und geschützter Eigenschaften geschützt werden können.
Du erstellst drei Dateien, die zusammenarbeiten, um Mitarbeiterinformationen mit einer angemessenen Zugriffskontrolle zu verwalten:
Employee.php: Definiere eineEmployee-Klasse, die als Grundlage für alle Mitarbeiter dient. Sie sollte eineprotected $name-Eigenschaft haben (damit untergeordnete Klassen 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üge 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: Definiere eineManager-Klasse, dieEmployeeerweitert. Binde die Employee-Datei am Anfang ein. Füge eine private$department-Eigenschaft hinzu. Der Konstruktor sollte Name, Gehalt und Abteilung akzeptieren: Rufe den übergeordneten Konstruktor mitparent::__construct($name, $salary)auf und setze anschließend die Abteilung. Erstelle einegetDetails()-Methode, die durch direkten Zugriff auf die geschützte$name-Eigenschaft"[name] manages [department]"zurückgibt. Füge außerdem einegetDepartment()-Methode hinzu, die die Abteilung zurückgibt.main.php: Binde beide Klassendateien ein. Erstelle einenManagermit dem Namen"Sarah", dem Gehalt75000und der Abteilung"Engineering". Gib die Details der Führungskraft mitgetDetails()aus. Gewähre der Führungskraft anschließend eine Gehaltserhöhung von5000und gib ihr neues Gehalt mitgetSalary()aus. Jede Ausgabe sollte in einer eigenen Zeile stehen.
Beachte, dass die Manager-Klasse direkt auf die geschützte $name-Eigenschaft zugreifen kann, aber die Methode getSalary() verwenden muss, um auf das private Gehalt zuzugreifen. Dies veranschaulicht den wesentlichen Unterschied zwischen geschützter und privater Sichtbarkeit: Geschützt ermöglicht den Zugriff durch untergeordnete Klassen, während privat 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", Gehalt 75000 und 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 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