Signatur
Beschreibung
ReflectionEnumUnitCase ist Teil der PHP-Reflection-API und repräsentiert einen einzelnen Case eines Pure Enums – also eines Enums, der keinen skalar gebundenen Wert (: string oder : int) besitzt. Im Gegensatz zu ReflectionEnumBackedCase gibt es hier keine getValue()-Methode, da Unit Cases keinen zugrundeliegenden Wert haben.
Instanzen dieser Klasse erhält man typischerweise über ReflectionEnum::getCases() oder ReflectionEnum::getCase(). Die Klasse erbt von ReflectionClassConstant und bietet somit Methoden wie getName(), getDeclaringClass(), getDocComment() sowie getAttributes().
Typische Einsatzgebiete sind Framework-Code, der Enums dynamisch inspizieren und verarbeiten muss, etwa um alle Cases aufzulisten, Attribute auszulesen oder zu prüfen, ob ein bestimmter Case existiert.
Versucht man, ReflectionEnumUnitCase auf einen Backed Enum anzuwenden (oder umgekehrt ReflectionEnumBackedCase auf einen Unit Enum), wirft PHP entsprechende Fehler – daher sollte man zunächst mit ReflectionEnum::isBacked() prüfen, um welchen Typ es sich handelt.
Beispiele
Cases eines Pure Enums inspizieren
<?php
enum Status {
case Active;
case Inactive;
case Pending;
}
$ref = new ReflectionEnum(Status::class);
foreach ($ref->getCases() as $case) {
// Gibt ReflectionEnumUnitCase zurück, da Status ein Pure Enum ist
echo get_class($case) . ': ' . $case->getName() . PHP_EOL;
}
Enum-Case-Objekt abrufen und Attribute auslesen
<?php
#[Attribute]
class Label {
public function __construct(public string $text) {}
}
enum Direction {
#[Label('Nach oben')]
case Up;
#[Label('Nach unten')]
case Down;
}
$ref = new ReflectionEnum(Direction::class);
$case = $ref->getCase('Up'); // gibt ReflectionEnumUnitCase zurück
echo $case->getName() . PHP_EOL;
foreach ($case->getAttributes(Label::class) as $attr) {
$label = $attr->newInstance();
echo 'Label: ' . $label->text . PHP_EOL;
}
Unterscheidung zwischen Pure Enum und Backed Enum
<?php
enum Color {
case Red;
case Green;
}
enum Suit: string {
case Hearts = 'H';
case Spades = 'S';
}
foreach ([Color::class, Suit::class] as $enumClass) {
$ref = new ReflectionEnum($enumClass);
echo $enumClass . ' ist backed: ' . ($ref->isBacked() ? 'ja' : 'nein') . PHP_EOL;
foreach ($ref->getCases() as $case) {
echo ' Case-Klasse: ' . get_class($case) . ' -> ' . $case->getName() . PHP_EOL;
}
}
// Wichtig · Fallstricke
Kein getValue(): Da Unit Cases keinen skalaren Wert haben, existiert diese Methode nicht in ReflectionEnumUnitCase. Der Versuch, sie aufzurufen, führt zu einem Fehler. Für Backed Enums muss stattdessen ReflectionEnumBackedCase verwendet werden.
Mit ReflectionEnumUnitCase::getEnum() (geerbt via Erweiterung der API) kann man zur übergeordneten ReflectionEnum-Instanz zurückkehren. Alternativ steht getDeclaringClass() zur Verfügung, das ebenfalls eine ReflectionEnum-Instanz zurückgibt, da Enums Klassen sind.
Die Methode getValue() auf ReflectionClassConstant-Ebene gibt bei Unit-Cases die tatsächliche Enum-Case-Instanz (also z. B. Status::Active) zurück.