Enum-Werte in konstanten AusdrĂŒcken

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();
add a note

User Contributed Notes

There are no user contributed notes for this page.