Schreibgeschützte Eigenschaften (PHP 8.1)
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 19 von 91.
PHP 8.1 führte readonly-Eigenschaften ein, denen nur einmal ein Wert zugewiesen werden kann und die danach nicht mehr geändert werden können. Im Gegensatz zu Konstanten werden readonly-Eigenschaften während der Objektinitialisierung statt zum Zeitpunkt der Klassendefinition festgelegt.
Du deklarierst eine schreibgeschützte Eigenschaft, indem du das Schlüsselwort readonly vor der Typdeklaration hinzufügst:
<?php
class User {
public readonly string $id;
public readonly string $name;
public function __construct(string $id, string $name) {
$this->id = $id;
$this->name = $name;
}
}
$user = new User("U001", "Alice");
echo $user->id . "\n";
echo $user->name;
Ausgabe:
U001
AliceSobald sie zugewiesen wurde, führt der Versuch, eine schreibgeschützte Eigenschaft zu ändern, zu einem Fehler. Dadurch eignen sie sich perfekt für Werte, die während der gesamten Lebensdauer eines Objekts konstant bleiben sollten, etwa IDs oder Erstellungszeitstempel.
Readonly-Eigenschaften müssen eine Typdeklaration haben und können nur einmal zugewiesen werden, und zwar innerhalb der deklarierenden Klasse (typischerweise im Konstruktor). Anders als normale Eigenschaften können sie bei der Deklaration keinen Standardwert erhalten. Sie funktionieren mit jedem Sichtbarkeitsmodifizierer:
<?php
class Product {
public function __construct(
public readonly string $sku,
private readonly float $cost
) {}
public function getCost(): float {
return $this->cost;
}
}
$product = new Product("ABC123", 29.99);
echo $product->sku;
Ausgabe:
ABC123Wichtiger Punkt: Readonly-Eigenschaften sorgen auf Eigenschaftsebene für Unveränderlichkeit. Sie sind ideal für Daten, die ein Objekt identifizieren oder sich nach der Erstellung nicht ändern sollten, und verbinden die Flexibilität der Initialisierung zur Laufzeit mit der Sicherheit, versehentliche Änderungen zu verhindern.
Aufgabe
EinfachLass uns ein unveränderliches Konfigurationssystem erstellen, das readonly-Eigenschaften verwendet, um sicherzustellen, dass kritische Einstellungen nach der Initialisierung nicht versehentlich geändert werden können.
Du wirst zwei Dateien erstellen, die zusammenarbeiten, um die Anwendungskonfiguration zu verwalten:
Config.php: Definiere eineConfig-Klasse, die die Anwendungskonfiguration mit unveränderlichen Einstellungen repräsentiert. Die Klasse sollte drei öffentliche readonly-Eigenschaften besitzen:string $appName,string $versionundint $maxConnections. Verwende Konstruktor-Promotion, um alle drei readonly-Eigenschaften in einer einzigen, übersichtlichen Konstruktor-Definition zu deklarieren und zu initialisieren. Füge einegetInfo()-Methode hinzu, die einen String im Format"[appName] v[version] (max: [maxConnections] connections)"zurückgibt.main.php: Binde die Datei der Config-Klasse ein. Du erhältst drei Eingaben: den Namen der Anwendung, die Version und die maximale Anzahl an Verbindungen (als String, der in eine Ganzzahl umgewandelt werden muss). Erstelle mithilfe dieser Werte einConfig-Objekt. Gib das Ergebnis vongetInfo()in der ersten Zeile aus. Gib anschließend jede readonly-Eigenschaft in einer eigenen Zeile aus, indem du direkt auf sie zugreifst: den Namen der Anwendung, die Version und die maximale Anzahl an Verbindungen.
Die readonly-Eigenschaften stellen sicher, dass die Werte nach der Erstellung einer Konfiguration unverändert bleiben – ideal für Einstellungen, die während der gesamten Laufzeit deiner Anwendung konstant bleiben sollen. Beachte, wie die Kombination aus Konstruktor-Promotion und readonly eine sehr kompakte Möglichkeit bietet, unveränderliche Wertobjekte zu definieren.
Deine Ausgabe sollte den formatierten Info-String gefolgt von den einzelnen Eigenschaftswerten anzeigen und demonstrieren, dass readonly-Eigenschaften weiterhin von außerhalb der Klasse gelesen werden können.
Probier es selbst
<?php
require_once 'Config.php';
// Eingaben lesen
$appName = trim(fgets(STDIN));
$version = trim(fgets(STDIN));
$maxConnections = intval(trim(fgets(STDIN)));
// TODO: Erstelle ein Config-Objekt mit den Eingabewerten
// TODO: Gib das Ergebnis von getInfo() aus
// TODO: Gib jede readonly-Eigenschaft in einer eigenen Zeile aus:
// - App-Name
// - Version
// - max. Verbindungen
?>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