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();
?>