Start · Sprachen · PHP · Referenz · BackedEnum

BackedEnum

Interface

Wird von der PHP-Engine automatisch auf <code>Backed Enums</code> angewendet und stellt Methoden bereit, um Enum-Instanzen aus skalaren Werten zu erzeugen.

seit PHP 8.1.0 Kategorie: misc

Signatur

interface BackedEnum

Beschreibung

BackedEnum ist ein internes Interface, das PHP automatisch auf alle Backed Enums anwendet – also auf Enumerationen, die einem Typ (string oder int) zugeordnet sind. Es darf nicht von benutzerdefinierten Klassen oder Interfaces implementiert werden.

Das Interface erweitert UnitEnum und ergänzt zwei zentrale Methoden: from() und tryFrom(). Mit from() lässt sich eine Enum-Instanz direkt aus ihrem Rohwert erzeugen; existiert kein passender Case, wird eine ValueError-Exception geworfen. tryFrom() verhält sich identisch, gibt aber null zurück, anstatt eine Exception zu werfen – ideal für unsichere Eingaben.

Backed Enums eignen sich hervorragend für Datenbankfelder, Formulareingaben oder HTTP-Parameter, bei denen skalare Werte in typsichere Enum-Instanzen umgewandelt werden müssen. Das Interface stellt sicher, dass alle Backed Enums eine einheitliche API für diese Konvertierung besitzen.

Neben from() und tryFrom() erbt BackedEnum von UnitEnum die statische Methode cases(), die ein Array aller Enum-Cases zurückgibt, sowie den öffentlichen Readonly-Property name und bei Backed Enums zusätzlich value.

Beispiele

Backed Enum mit from() und tryFrom()

<?php

enum Status: string
{
    case Active   = 'active';
    case Inactive = 'inactive';
    case Pending  = 'pending';
}

// Instanz aus bekanntem Rohwert erzeugen
$status = Status::from('active');
echo $status->name;  // Active
echo $status->value; // active

// Sicheres Parsen unbekannter Eingaben
$input = 'unknown';
$result = Status::tryFrom($input);
var_dump($result); // NULL

// from() wirft bei ungültigem Wert eine ValueError-Exception
try {
    Status::from('invalid');
} catch (\ValueError $e) {
    echo $e->getMessage();
    // 'invalid' is not a valid backing value for enum "Status"
}
Active active NULL 'invalid' is not a valid backing value for enum "Status"

Backed Enum als Typ-Prüfung via instanceof BackedEnum

<?php

enum Color: int
{
    case Red   = 1;
    case Green = 2;
    case Blue  = 3;
}

enum Direction
{
    case North;
    case South;
}

function describeEnum(mixed $enum): void
{
    if ($enum instanceof \BackedEnum) {
        echo "{$enum->name} hat den Wert: {$enum->value}\n";
    } else {
        echo "{$enum->name} ist ein Pure Enum ohne Rohwert.\n";
    }
}

describeEnum(Color::Green);    // Green hat den Wert: 2
describeEnum(Direction::North); // North ist ein Pure Enum ohne Rohwert.

// Alle Cases eines Backed Enums ausgeben
foreach (Color::cases() as $case) {
    echo "{$case->name} => {$case->value}\n";
}
Green hat den Wert: 2 North ist ein Pure Enum ohne Rohwert. Red => 1 Green => 2 Blue => 3

// Wichtig · Fallstricke

Nicht implementierbar: BackedEnum darf ausschließlich von der PHP-Engine angewendet werden. Der Versuch, es in einer eigenen Klasse oder einem eigenen Interface zu implementieren bzw. zu erweitern, führt zu einem fatalen Fehler.

Unterschied zu UnitEnum: Reine Enumerationen (ohne Typangabe) implementieren nur UnitEnum und besitzen keine from()- oder tryFrom()-Methoden sowie keine value-Property.

Sicherheit: Bei Benutzereingaben stets tryFrom() statt from() verwenden, um unkontrollierte ValueError-Exceptions zu vermeiden. Das Ergebnis von tryFrom() sollte auf null geprüft werden, bevor es weiterverarbeitet wird.

Siehe auch