Start · Sprachen · PHP · Referenz · UnitEnum

UnitEnum

Interface

Von der PHP-Engine automatisch auf alle Enumerations angewendetes Interface, das grundlegende Enum-Funktionalität wie <code>cases()</code> bereitstellt.

seit PHP 8.1.0 Kategorie: misc

Signatur

interface UnitEnum

Beschreibung

UnitEnum ist ein internes PHP-Interface, das automatisch von allen Enumerations (sowohl reinen Enums als auch Backed Enums) implementiert wird. Es stellt die grundlegendsten Eigenschaften und Methoden zur Verfügung, die jede Aufzählung besitzen muss – insbesondere die statische Methode cases(), die alle definierten Fälle (Cases) einer Aufzählung als Array zurückgibt.

Das Interface kann nicht von benutzerdefinierten Klassen oder Interfaces manuell implementiert oder erweitert werden – der Versuch führt zu einem Fatal Error. Es ist ausschließlich für den internen Gebrauch durch die PHP-Engine vorgesehen, dient aber als nützlicher Typ-Hint, wenn eine Funktion oder Methode irgendeinen Enum-Typ (aber nicht zwingend einen Backed Enum) akzeptieren soll.

Jede Enum-Instanz, die UnitEnum implementiert, besitzt die schreibgeschützten Eigenschaften name (der Name des Cases als String). Backed Enums implementieren zusätzlich das Sub-Interface BackedEnum, das die Eigenschaft value und weitere Methoden wie from() und tryFrom() bereitstellt.

Der typische Einsatz von UnitEnum als Typ-Hint erlaubt es, generische Funktionen zu schreiben, die mit beliebigen Enumerations arbeiten, ohne den konkreten Enum-Typ zu kennen – beispielsweise zum Auflisten aller Cases oder zum Auslesen des name-Attributs.

Beispiele

Einfache Aufzählung mit cases()-Aufruf

<?php

enum Farbe {
    case Rot;
    case Gruen;
    case Blau;
}

// cases() gibt alle definierten Cases als Array zurück
$alle = Farbe::cases();

foreach ($alle as $farbe) {
    echo $farbe->name . PHP_EOL;
}

// Prüfen ob Farbe UnitEnum implementiert
var_dump($alle[0] instanceof UnitEnum);
Rot Gruen Blau bool(true)

Generische Funktion mit UnitEnum als Typ-Hint

<?php

enum Status {
    case Aktiv;
    case Inaktiv;
    case Gesperrt;
}

enum Prioritaet {
    case Niedrig;
    case Mittel;
    case Hoch;
}

/**
 * Gibt alle Case-Namen einer beliebigen Aufzählung aus.
 */
function listeCases(string $enumClass): void {
    if (!is_a($enumClass, UnitEnum::class, true)) {
        throw new InvalidArgumentException("$enumClass ist kein Enum.");
    }

    foreach ($enumClass::cases() as $case) {
        echo '- ' . $case->name . PHP_EOL;
    }
}

listeCases(Status::class);
echo '---' . PHP_EOL;
listeCases(Prioritaet::class);
- Aktiv - Inaktiv - Gesperrt --- - Niedrig - Mittel - Hoch

UnitEnum als Parameter-Typ für beliebige Enums

<?php

enum Wochentag {
    case Montag;
    case Dienstag;
    case Mittwoch;
    case Donnerstag;
    case Freitag;
    case Samstag;
    case Sonntag;
}

function istWochenende(UnitEnum $tag): bool {
    return in_array($tag->name, ['Samstag', 'Sonntag'], true);
}

var_dump(istWochenende(Wochentag::Samstag));  // true
var_dump(istWochenende(Wochentag::Montag));   // false
bool(true) bool(false)

// Wichtig · Fallstricke

Nicht implementierbar durch Benutzercode: Der Versuch, UnitEnum in einer eigenen Klasse oder einem Interface zu implementieren bzw. zu erweitern, führt zu einem Fatal error. Das Interface ist ausschließlich der PHP-Engine vorbehalten.

Verhältnis zu BackedEnum: Backed Enums (mit : string oder : int) implementieren sowohl UnitEnum als auch das erweiterte Interface BackedEnum. Wenn die value-Eigenschaft oder from()/tryFrom() benötigt werden, sollte BackedEnum als Typ-Hint verwendet werden.

Eigenschaften sind schreibgeschützt: Die Eigenschaft name jedes Enum-Cases ist schreibgeschützt und kann nicht verändert werden. Enum-Instanzen sind generell unveränderlich (immutable).

Siehe auch