Readonly-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, die nur einmal zugewiesen werden können und danach nicht mehr geändert werden können. Im Gegensatz zu Konstanten werden readonly-Eigenschaften während der Objektinitialisierung und nicht zum Zeitpunkt der Klassendefinition gesetzt.
Sie deklarieren eine schreibgeschützte Eigenschaft, indem Sie das Schlüsselwort readonly vor der Typdeklaration hinzufügen:
<?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
AliceEinmal zugewiesen, führt der Versuch, eine readonly-Eigenschaft zu ändern, zu einem Fehler. Dies macht sie ideal für Werte, die während der gesamten Lebensdauer eines Objekts konstant bleiben sollten, wie IDs oder Erstellungszeitstempel.
Readonly-Eigenschaften müssen eine Typdeklaration haben und können nur einmal initialisiert werden, entweder im Konstruktor oder zum Zeitpunkt der Deklaration. Sie funktionieren mit jedem Sichtbarkeitsmodifikator:
<?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 bieten Unveränderlichkeit auf Eigenschaftsebene. Sie sind ideal für Daten, die ein Objekt identifizieren oder nach der Erstellung nicht mehr geändert werden sollten, da sie die Flexibilität der Laufzeitinitialisierung mit der Sicherheit kombinieren, versehentliche Änderungen zu verhindern.
Aufgabe
EinfachLassen Sie 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.
Sie werden zwei Dateien erstellen, die zusammenarbeiten, um die Anwendungskonfiguration zu verwalten:
Config.php— Definieren Sie eineConfig-Klasse, die die Anwendungskonfiguration mit unveränderlichen Einstellungen darstellt. Die Klasse sollte drei öffentliche readonly-Eigenschaften haben:string $appName,string $versionundint $maxConnections. Verwenden Sie Constructor Promotion, um alle drei readonly-Eigenschaften in einer einzigen, sauberen Konstruktordefinition zu deklarieren und zu initialisieren. Fügen Sie einegetInfo()-Methode hinzu, die einen String im Format"[appName] v[version] (max: [maxConnections] connections)"zurückgibt.main.php— Binden Sie die Config-Klassendatei ein. Sie erhalten drei Eingaben: den App-Namen, die Version und die maximale Anzahl an Verbindungen (als String, der in eine Ganzzahl umgewandelt werden muss). Erstellen Sie einConfig-Objekt unter Verwendung dieser Werte. Geben Sie das Ergebnis vongetInfo()in der ersten Zeile aus. Geben Sie dann jede readonly-Eigenschaft in einer eigenen Zeile aus, indem Sie direkt auf sie zugreifen: den App-Namen, die Version und die maximalen Verbindungen.
Die readonly-Eigenschaften stellen sicher, dass die Werte einer Konfiguration nach deren Erstellung festgeschrieben sind – ideal für Einstellungen, die während der Laufzeit Ihrer Anwendung konstant bleiben sollen. Beachten Sie, wie Constructor Promotion in Kombination mit readonly eine sehr prägnante Möglichkeit bietet, unveränderliche Wertobjekte zu definieren.
Ihre Ausgabe sollte den formatierten Info-String gefolgt von jedem einzelnen Eigenschaftswert anzeigen und so demonstrieren, dass readonly-Eigenschaften weiterhin von außerhalb der Klasse gelesen werden können.
Spickzettel
PHP 8.1 hat readonly-Eigenschaften eingeführt, die nur einmal zugewiesen werden können und danach nicht mehr geändert werden können:
<?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; // U001
Readonly-Eigenschaften müssen eine Typdeklaration haben und können nur einmal initialisiert werden. Sie funktionieren mit jedem Sichtbarkeitsmodifikator und können mit Constructor Promotion kombiniert werden:
<?php
class Product {
public function __construct(
public readonly string $sku,
private readonly float $cost
) {}
}
$product = new Product("ABC123", 29.99);
echo $product->sku; // ABC123
Readonly-Eigenschaften sind ideal für Werte, die während der gesamten Lebensdauer eines Objekts konstant bleiben sollen, wie IDs, Zeitstempel oder Konfigurationseinstellungen.
Probier es selbst
<?php
require_once 'Config.php';
// Eingaben lesen
$appName = trim(fgets(STDIN));
$version = trim(fgets(STDIN));
$maxConnections = intval(trim(fgets(STDIN)));
// TODO: Erstellen Sie ein Config-Objekt unter Verwendung der Eingabewerte
// TODO: Geben Sie das Ergebnis von getInfo() aus
// TODO: Geben Sie jede schreibgeschützte Eigenschaft in einer eigenen Zeile aus:
// - App-Name
// - Version
// - Maximale 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 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