Enums

Enums

Las enumeraciones, o “Enums”, permiten a un desarrollador definir un tipo personalizado que se limita a uno de un número discreto de valores posibles. Esto puede ser especialmente útil ya que permite “hacer que los estados inválidos no sean representables”.

En PHP, las Enums son un tipo especial de objeto. La Enum en sí misma es una clase, y sus casos posibles son todos objetos de instancia única de esa clase. Eso significa que los casos de Enum son objetos válidos y pueden usarse en cualquier lugar donde se pueda usar un objeto, incluidos los chequeos de tipos.

El ejemplo más popular de enumeraciones es el tipo booleano, que es un tipo enumerado con valores legales true y false. Las Enums permiten a los desarrolladores definir sus propias enumeraciones robustas.

Las Enums son similares a las clases y comparten los mismos espacios de nombres que las clases, interfaces y traits. También se cargan automáticamente de la misma manera.

enum Suit
{
    case Hearts;
    case Diamonds;
    case Clubs;
    case Spades;
}

Un enum puede tener tantos numerosos casos sin un limite, o ninguno, aunque no sería erróneo no tendría utilidad.

Backed Enum

Por defecto, 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 ser trasladado a una base de datos o almacenamiento similar, por lo que tener un equivalente escalar incorporado (y por lo tanto trivialmente serializable) definido intrínsecamente es útil.

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

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

Enumeration constants

Las enumeraciones pueden incluir constantes, las cuales pueden ser públicas, privadas o protegidas, aunque en la práctica privada y protegida son equivalentes ya que no se permite la herencia.

Una constante de enum puede referirse a un caso de enum:

enum Size
{
    case Small;
    case Medium;
    case Large;

    public const Huge = self::Large;
}