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

Active

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

active

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

challenge icon

Aufgabe

Einfach

Lassen 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 namens OrderStatus mit vier Fällen:
    • Pending hinterlegt mit 'pending'
    • Processing hinterlegt mit 'processing'
    • Shipped hinterlegt mit 'shipped'
    • Delivered hinterlegt mit 'delivered'
    Fügen Sie eine Methode 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 eine Order-Klasse, die das Enum verwendet. Binden Sie die Datei OrderStatus ein. Die Klasse sollte:
    • Eine Bestell-ID (String) und einen OrderStatus in 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)
  • main.php — Binden Sie die Datei Order ein. Sie erhalten zwei Eingaben: eine Bestell-ID und einen Status-String (wie "shipped"). Verwenden Sie tryFrom(), um die String-Eingabe sicher in ein OrderStatus-Enum umzuwandeln. Wenn der Status gültig ist, erstellen Sie eine Order und geben Sie zwei Zeilen aus:
    • Das Ergebnis von getInfo()
    • Das Ergebnis von getStatusValue()
    Wenn der Status-String ungültig ist, geben Sie "Invalid status" aus.

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

?>
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