Enums (PHP 8.1)
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 59 von 91.
Vor PHP 8.1 bedeutete die Darstellung einer festen Menge von Werten wie Status oder Typen die Verwendung von Klassenkonstanten oder Magic Strings – beides fehleranfällige Ansätze. Enums (Enumerationen) bieten eine saubere Möglichkeit, einen Typ zu definieren, der nur bestimmte, vordefinierte Werte enthalten kann.
Definieren Sie ein Enum mit dem enum-Schlüsselwort:
<?php
enum Status {
case Pending;
case Active;
case Completed;
}
$status = Status::Active;
echo $status->name;
Ausgabe:
ActiveEnums können auch Backed Values haben – String- oder Integer-Werte, die jedem Case zugeordnet sind. Dies ist nützlich, wenn Enums in Datenbanken oder APIs gespeichert werden:
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
case Completed = 'completed';
}
$status = Status::Active;
echo $status->value;
Ausgabe:
activeBacked Enums bieten eine from()-Methode, um ein Enum aus seinem Wert zu erstellen, und tryFrom(), die null zurückgibt, anstatt bei ungültigen Werten einen Fehler auszulösen:
<?php
$status = Status::from('active'); // Gibt Status::Active zurück
$invalid = Status::tryFrom('unknown'); // Gibt null zurück
Enums können auch Methoden enthalten, was sie leistungsstark für die Kapselung verwandter Logik macht. Sie arbeiten nahtlos mit Type-Hints zusammen und stellen sicher, dass Ihre Funktionen nur gültige Werte akzeptieren – kein Überprüfen mehr, ob ein String mit den erwarteten Optionen übereinstimmt.
Aufgabe
EinfachLassen Sie uns ein Auftragsverwaltungssystem erstellen, das Enums verwendet, um Auftragsstati auf typsichere Weise darzustellen. Anstatt sich auf Zeichenfolgen zu verlassen, die falsch geschrieben oder ungültig sein könnten, erstellen Sie ein Backed Enum, das jeden Status einem datenbankfreundlichen Wert zuordnet.
Sie werden Ihren Code über drei Dateien organisieren:
OrderStatus.php— Erstellen Sie ein String-backed Enum namensOrderStatusmit vier Fällen:Pendinghinterlegt mit'pending'Processinghinterlegt mit'processing'Shippedhinterlegt mit'shipped'Deliveredhinterlegt mit'delivered'
label()hinzu, die eine für Menschen lesbare Beschreibung für jeden Status zurückgibt:- Pending gibt
"Awaiting confirmation"zurück - Processing gibt
"Being prepared"zurück - Shipped gibt
"On the way"zurück - Delivered gibt
"Order complete"zurück
Order.php— Erstellen Sie eineOrder-Klasse, die das Enum verwendet. Binden Sie die Datei OrderStatus ein. Die Klasse sollte:- Eine Bestell-ID (String) und einen
OrderStatusin ihrem Konstruktor mittels Constructor Promotion akzeptieren - Eine Methode
getInfo()haben, die"Order [id]: [status label]"zurückgibt - Eine Methode
getStatusValue()haben, die den hinterlegten Wert (backed value) des Status zurückgibt (nützlich für die Speicherung in der Datenbank)
- Eine Bestell-ID (String) und einen
main.php— Binden Sie die Datei Order ein. Sie erhalten zwei Eingaben: eine Bestell-ID und einen Status-String (wie"shipped"). Verwenden SietryFrom(), um die String-Eingabe sicher in einOrderStatus-Enum umzuwandeln. Wenn der Status gültig ist, erstellen Sie eineOrderund geben Sie zwei Zeilen aus:- Das Ergebnis von
getInfo() - Das Ergebnis von
getStatusValue()
"Invalid status"aus.- Das Ergebnis von
Diese Herausforderung zeigt, wie Enums Typsicherheit bieten — Ihre Order-Klasse kann nur gültige Stati akzeptieren, und die Methode tryFrom() ermöglicht es Ihnen, Benutzereingaben sicher zu verarbeiten, ohne ungültige Werte zu riskieren.
Spickzettel
Enums bieten eine typsichere Möglichkeit, einen festen Satz von Werten zu definieren. Definieren Sie ein Enum mit dem Schlüsselwort enum:
<?php
enum Status {
case Pending;
case Active;
case Completed;
}
$status = Status::Active;
echo $status->name; // Outputs: Active
Backed Enums verknüpfen String- oder Integer-Werte mit jedem Fall:
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
case Completed = 'completed';
}
$status = Status::Active;
echo $status->value; // Outputs: active
Verwenden Sie from(), um ein Enum aus seinem Wert zu erstellen, oder tryFrom(), das bei ungültigen Werten null zurückgibt:
<?php
$status = Status::from('active'); // Returns Status::Active
$invalid = Status::tryFrom('unknown'); // Returns null
Enums können Methoden enthalten, um zugehörige Logik zu kapseln:
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
public function label(): string {
return match($this) {
self::Pending => 'Awaiting',
self::Active => 'In Progress',
};
}
}
Probier es selbst
<?php
require_once 'Order.php';
// Eingabe lesen
$orderId = trim(fgets(STDIN));
$statusString = trim(fgets(STDIN));
// TODO: Verwende OrderStatus::tryFrom(), um den Status-String sicher in ein Enum umzuwandeln
// tryFrom() gibt null zurück, wenn der Wert ungültig ist
// TODO: Wenn der Status gültig ist, erstelle eine Order und gib Folgendes aus:
// - Das Ergebnis von getInfo()
// - Das Ergebnis von getStatusValue()
// TODO: Wenn der Status ungültig ist, gib "Invalid status" 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 – Studentenverwaltungssystem10Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungDependency InjectionAnonyme KlassenEnums (PHP 8.1)Fibers (PHP 8.1)Objekt-Klonen im DetailGeneratoren & Iteratoren2Namensrä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