Signatur
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);
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);
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
// 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).