Debido a que los casos están representados como constantes en la enumeración en sí, pueden usarse como valores estáticos en la mayoría de las expresiones constantes: valores por omisión de propiedades, valores por omisión de variables estáticas, valores por omisión de parámetros, valores de constantes globales y de clase. No pueden usarse en otros valores de casos de enumeración, pero las constantes normales pueden referirse a un caso de enumeración.
Sin embargo, las llamadas implícitas a métodos mágicos 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. Las llamadas a funciones, llamadas a métodos y el acceso a propiedades continúan siendo operaciones no válidas en expresiones constantes.
<?php
// Esta es una definición de Enumeración completamente legal.
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'];
// Error fatal: No se puede usar [] en enumeraciones en expresión constante
}
// Esto es completamente legal, porque no es una expresión constante.
$x = Direction::Up['short'];
var_dump("\$x is " . var_export($x, true));
$foo = new Foo();
?>