Menu
Coddy logo textTech

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:

Active

Enums 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:

active

Backed 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.

challenge icon

Aufgabe

Einfach

Erstelle 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 namens OrderStatus mit vier Fällen:
    • Pending, hinterlegt mit 'pending'
    • Processing, hinterlegt mit 'processing'
    • Shipped, hinterlegt mit 'shipped'
    • Delivered, hinterlegt mit 'delivered'
    Füge eine Methode 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 eine Order-Klasse, die das Enum verwendet. Binde die Datei mit OrderStatus ein. Die Klasse sollte:
    • eine Bestell-ID (String) und ein OrderStatus in 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)
  • main.php: Binde die Order-Datei ein. Du erhältst zwei Eingaben: eine Bestell-ID und eine Statuszeichenfolge (wie "shipped"). Verwende tryFrom(), um die Zeichenfolgeneingabe sicher in ein OrderStatus-Enum umzuwandeln. Wenn der Status gültig ist, erstelle eine Order und gib zwei Zeilen aus:
    • das Ergebnis von getInfo()
    • das Ergebnis von getStatusValue()
    Wenn die Statuszeichenfolge ungültig ist, gib "Invalid status" aus.

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"

?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-PHP-Compiler