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 Statusangaben oder Typen, Klassenkonstanten oder magische Zeichenketten zu verwenden – beides fehleranfällige Ansätze. Enums (Aufzählungen) bieten eine geeignete Möglichkeit, einen Typ zu Define, der nur bestimmte, vordefinierte Werte enthalten kann.
Definiere ein Enum mit dem Schlüsselwort enum:
<?php
enum Status {
case Pending;
case Active;
case Completed;
}
$status = Status::Active;
echo $status->name;
Ausgabe:
ActiveEnums können auch zugeordnete Werte haben – Zeichenfolgen- oder Ganzzahlwerte, die jedem Fall 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 stellen eine from()-Methode bereit, um aus ihrem Wert ein Enum zu erstellen, sowie tryFrom(), das bei ungültigen Werten null zurückgibt, anstatt 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, wodurch sie leistungsstark für die Kapselung zusammengehöriger Logik sind. Sie funktionieren nahtlos mit Typ-Hinweisen und stellen sicher, dass deine Funktionen nur gültige Werte akzeptieren – keine weiteren Prüfungen, ob ein String den erwarteten Optionen entspricht.
Aufgabe
EinfachErstelle ein Bestellverwaltungssystem, das Enums verwendet, um Bestellstatus typsicher darzustellen. Statt dich auf Zeichenfolgen zu verlassen, die falsch geschrieben oder ungültig sein könnten, erstellst du ein Backed Enum, das jeden Status einem datenbankfreundlichen Wert zuordnet.
Du organisierst deinen Code über drei Dateien:
OrderStatus.php: Erstelle ein string-basiertes Enum namensOrderStatusmit vier Fällen:Pending, hinterlegt mit'pending'Processing, hinterlegt mit'processing'Shipped, hinterlegt mit'shipped'Delivered, hinterlegt mit'delivered'
label()hinzu, die für jeden Status eine menschenlesbare Beschreibung 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: Erstelle eineOrder-Klasse, die das Enum verwendet. Binde die Datei mit OrderStatus ein. Die Klasse sollte:- eine Bestell-ID (String) und ein
OrderStatusin ihrem Konstruktor mithilfe von Constructor Promotion akzeptieren - eine Methode
getInfo()besitzen, die"Order [id]: [status label]"zurückgibt - eine Methode
getStatusValue()besitzen, die den hinterlegten Wert des Status zurückgibt (nützlich für die Speicherung in der Datenbank)
- eine Bestell-ID (String) und ein
main.php: Binde die Order-Datei ein. Du erhältst zwei Eingaben: eine Bestell-ID und eine Statuszeichenfolge (wie"shipped"). VerwendetryFrom(), um die Zeichenfolgeneingabe sicher in einOrderStatus-Enum umzuwandeln. Wenn der Status gültig ist, erstelle eineOrderund gib zwei Zeilen aus:- das Ergebnis von
getInfo() - das Ergebnis von
getStatusValue()
"Invalid status"aus.- das Ergebnis von
Diese Aufgabe zeigt, wie Enums Typsicherheit bieten. Deine Order-Klasse kann nur gültige Status akzeptieren, und die Methode tryFrom() ermöglicht es dir, Benutzereingaben sicher zu verarbeiten, ohne ungültige Werte zu riskieren.
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 aus:
// - Das Ergebnis von getInfo()
// - Das Ergebnis von getStatusValue()
// TODO: If the status is invalid, print "Invalid status"
?>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ätzen10Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungDependency InjectionAnonyme KlassenEnums (PHP 8.1)Fibers (PHP 8.1)Objektklonen im DetailGeneratoren & Iteratoren2Namespaces & 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