Enumeraciónes respaldadas

Por omisión, los Casos Enumerados no tienen un equivalente escalar. Son simplemente objetos singleton. Sin embargo, hay muchos casos en los que un Caso Enumerado necesita poder viajar de ida y vuelta a una base de datos o almacenamiento de datos similar, por lo que tener un equivalente escalar (y por lo tanto trivialmente serializable) incorporado definido intrínsecamente es útil.

Para definir un escalar equivalente para una Enumeración, la sintaxis es la siguiente:

<?php

enum Suit: string
{
case
Hearts = 'H';
case
Diamonds = 'D';
case
Clubs = 'C';
case
Spades = 'S';
}
?>

Un caso que tiene un equivalente escalar se llama un Caso Respaldado, ya que está "respaldado" por un valor más simple. Una Enumeración que contiene todos los Casos Respaldados se llama una "Enum Respaldada". Una Enum Respaldada solo puede contener Casos Respaldados. Una Enum Pura solo puede contener Casos Puros.

Una Enum Respaldada puede estar respaldada por tipos de int o string, y una enumeración dada solo admite un solo tipo a la vez (es decir, no hay unión de int|string). Si una enumeración se marca como teniendo un equivalente escalar, entonces todos los casos deben tener un equivalente escalar único definido explícitamente. No hay equivalentes escalares generados automáticamente (por ejemplo, enteros secuenciales). Los Casos Respaldados deben ser únicos; dos casos de enum respaldados no pueden tener el mismo equivalente escalar. Sin embargo, una constante puede hacer referencia a un caso, creando efectivamente un alias. Consulte Constantes de enumeración.

Los valores equivalentes pueden ser una expresión escalar constante. Antes de PHP 8.2.0, los valores equivalentes debían ser literales o expresiones literales. Esto significa que las constantes y expresiones constantes no eran compatibles. Es decir, 1 + 1 era aceptable, pero no 1 + SOME_CONST no lo es.

Casos Respaldados tienen una propiedad adicional de solo lectura, value, que es el valor especificado en la definición.

<?php

print Suit::Clubs->value;
// Imprime "C"
?>

Para hacer cumplir la propiedad value como de solo lectura, una variable no puede asignarse como una referencia a ella. Es decir, lo siguiente arroja un error:

<?php

$suit
= Suit::Clubs;
$ref = &$suit->value;
// Error: Cannot acquire reference to property Suit::$value
?>

Las enumeraciónes respaldadas implementan una interfaz interna BackedEnum, que expone dos métodos adicionales:

  • from(int|string): self tomará un escalar y devolverá el Caso Enum correspondiente. Si no se encuentra uno, lanzará un ValueError. Esto es útil principalmente en casos en los que el escalar de entrada es de confianza y un valor de enumeración faltante debería ser considerado un error que detiene la aplicación.
  • tryFrom(int|string): ?self tomará un escalar y devolverá el Caso Enum correspondiente. Si no se encuentra uno, devolverá null. Esto es útil principalmente en casos en los que el escalar de entrada no es de confianza y el llamante desea implementar su propia lógica de manejo de errores o de valor predeterminado.

Los métodos from() y tryFrom() siguen las reglas estándar de tipado débil/fuerte. En modo de tipado débil, pasar un entero o una cadena es aceptable y el sistema convertirá el valor en consecuencia. Pasar un flotante también funcionará y se convertirá. En modo de tipado estricto, pasar un entero a from() en un enum respaldado por una cadena (o viceversa) resultará en un TypeError, al igual que un flotante en todas las circunstancias. Todos los demás tipos de parámetros lanzarán un TypeError en ambos modos.

<?php

$record
= get_stuff_from_database($id);
print
$record['suit'];

$suit = Suit::from($record['suit']);
// Dato no válido lanzará un ValueError: "X" is not a valid scalar value for enum "Suit"
print $suit->value;

$suit = Suit::tryFrom('A') ?? Suit::Spades;
// Dato no válido devolverá null, por lo tanto será usado Suit::Spades en su lugar.
print $suit->value;
?>

Definir manualmente un método from() o tryFrom() en un Enum Respaldado devolverá en un error fatal.

add a note

User Contributed Notes

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