Da die FĂ€lle in der Enum selbst als Konstanten dargestellt werden, können sie in den meisten konstanten AusdrĂŒcken als statische Werte verwendet werden: als Standardwerte fĂŒr Eigenschaften, statische Variablen und Parameter und als globale Werte und Klassenkonstanten. Sie dĂŒrfen nicht in den Werten anderer Enum-FĂ€lle verwendet werden, aber normale Konstanten können sich auf einen Enum-Fall beziehen.
Dagegen sind implizite Aufrufe magischer Methoden wie ArrayAccess in Enums in statischen oder konstanten Definitionen nicht erlaubt, da nicht absolut garantiert werden kann, dass der resultierende Wert deterministisch ist oder dass der Methodenaufruf frei von Seiteneffekten ist. Funktionsaufrufe, Methodenaufrufe und der Zugriff auf Eigenschaften sind in konstanten AusdrĂŒcken weiterhin nicht erlaubt.
<?php
// Dies ist eine völlig zulÀssige Definition einer Enum.
enum Direction implements ArrayAccess
{
case Up;
case Down;
public function offsetExists($offset): bool
{
return false;
}
public function offsetGet($offset): mixed
{
return null;
}
public function offsetSet($offset, $value): void
{
throw new Exception();
}
public function offsetUnset($offset): void
{
throw new Exception();
}
}
class Foo
{
// Dies ist erlaubt.
const DOWN = Direction::Down;
// Dies ist unzulÀssig, da es nicht deterministisch sein kann.
const UP = Direction::Up['short'];
// Fatal error: Cannot use [] on enums in constant expression
}
// Dies ist völlig zulÀssig, da es kein konstanter Ausdruck ist.
$x = Direction::Up['short'];
var_dump("\$x is " . var_export($x, true));
$foo = new Foo();