Valores de enumeración en expresiones constantes

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

User Contributed Notes

There are no user contributed notes for this page.
To Top