Por que los casos son representados como constantes en la enumeración misma, pueden ser usados como valores estáticos en la mayoría de las expresiones constantes: valores predeterminados de propiedades, valores predeterminados de variables estáticas, valores predeterminados de parámetros, valores constantes globales y de clase. No pueden ser usados en otros valores de casos de enumeración, pero las constantes normales pueden referirse a un caso de enumeración.
Sin embargo, las llamadas a métodos mágicos implícitos como ArrayAccess en enumeraciones no están permitidas en definiciones estáticas o constantes ya que no podemos garantizar absolutamente que el valor resultante sea determinista o que la invocación del método esté libre de efectos secundarios. Llamadas a funciones, llamadas a métodos y acceso a propiedades siguen siendo operaciones no válidas en expresiones constantes.
<?php
// Esta es una definición de Enum completamente válida.
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
{
// Esto está permitido.
const DOWN = Direction::Down;
// Esto no está permitido, ya que puede no ser determinista.
const UP = Direction::Up['short'];
// Fatal error: Cannot use [] on enums in constant expression
}
// Esto es completamente válido, ya que no es una expresión constante.
$x = Direction::Up['short'];
var_dump("\$x is " . var_export($x, true));
$foo = new Foo();
?>