## Enumeraciones básicas

Las enumeraciones son similares a las clases y comparten los mismos espacios de nombres que las clases, interfaces y traits. También son autocargables de la misma manera. Una enumeración define un nuevo tipo, que tiene un número fijo y limitado de valores legales posibles.

    <?php

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

Esta declaración crea un nuevo tipo enumerado llamado `Suit`, que tiene cuatro y solo cuatro valores legales: `Suit::Hearts`, `Suit::Diamonds`, `Suit::Clubs`, y `Suit::Spades`. Las variables pueden ser asignadas a uno de esos valores legales. Una función puede ser comprobada de tipo contra un tipo enumerado, en cuyo caso solo se pueden pasar valores de ese tipo.

    <?php

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

    function pick_a_card(Suit $suit)
    {
        var_dump($suit);
    }

    $val = Suit::Diamonds;

    // OK
    pick_a_card($val);

    // OK
    pick_a_card(Suit::Clubs);

    // TypeError: pick_a_card(): Argument #1 ($suit) must be of type Suit, string given
    pick_a_card('Spades');

Una enumeración puede tener cero o más definiciones de `case`, sin máximo. Una enumeración sin casos es sintácticamente válida, aunque bastante inútil.

Para los casos de enumeración, se aplican las mismas reglas sintácticas que a cualquier etiqueta en PHP, ver Constantes.

Por omisión, los casos no están respaldados intrínsecamente por un valor escalar. Es decir, `Suit::Hearts` no es igual a `"0"`. En su lugar, cada caso está respaldado por un objeto singleton de ese nombre. Eso significa que:

    <?php

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

    $a = Suit::Spades;
    $b = Suit::Spades;

    if ($a === $b) {
        print "Los palos coinciden usando ===\n";
    }

    if ($a instanceof Suit) {
        print "Los palos coinciden usando instanceof\n";
    }

    if ($a !== 'Spades') {
        print "El palo no coincide con la cadena\n";
    }

También significa que los valores de enumeración nunca son `<` o `>` entre sí, ya que esas comparaciones no tienen significado en los objetos. Esas comparaciones siempre devolverán `false` al trabajar con valores de enumeración.

Este tipo de caso, sin datos relacionados, se denomina "Caso Puro". Una enumeración que contiene solo Casos Puros se denomina Enumeración Pura.

Todos los Casos Puros se implementan como instancias de su tipo de enumeración. El tipo de enumeración está representado internamente como una clase.

Todos los Casos tienen una propiedad de solo lectura, `name`, que es el nombre sensible a mayúsculas y minúsculas del caso en sí.

    <?php

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

    print Suit::Spades->name;
    // imprime "Spades"

También es posible usar las funciones defined() y constant() para verificar la existencia o leer un caso de enumeración si el nombre se obtiene dinámicamente. Sin embargo, esto se desaconseja ya que el uso de Enumeraciones respaldadas debería funcionar para la mayoría de los casos de uso.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open