## Ejemplos

Ejemplo #1 Valores limitados básicos

    <?php

    enum SortOrder
    {
        case Asc;
        case Desc;
    }

    function query($fields, $filter, SortOrder $order = SortOrder::Asc)
    {
         /* ... */
    }

La función `query()` ahora puede proceder con la seguridad de que `$order` está garantizado que sea `SortOrder::Asc` o `SortOrder::Desc`. Cualquier otro valor habría resultado en un TypeError, por lo que no se necesita ninguna comprobación o prueba de errores adicional.

Ejemplo #2 Valores exclusivos avanzados

    <?php

    enum UserStatus: string
    {
        case Pending = 'P';
        case Active = 'A';
        case Suspended = 'S';
        case CanceledByUser = 'C';

        public function label(): string
        {
            return match ($this) {
                self::Pending => 'Pending',
                self::Active => 'Active',
                self::Suspended => 'Suspended',
                self::CanceledByUser => 'Canceled by user',
            };
        }
    }

    $status = UserStatus::Suspended;
    var_dump($status->label());

En este ejemplo, el estado de un usuario puede ser uno de, y exclusivamente, `UserStatus::Pending`, `UserStatus::Active`, `UserStatus::Suspended`, o `UserStatus::CanceledByUser`. Una función puede tipar un parámetro contra `UserStatus` y luego solo aceptar esos cuatro valores, punto.

Los cuatro valores tienen un método `label()`, que devuelve un string legible por humanos. Ese string es independiente del string equivalente escalar de "nombre de máquina", que puede usarse en, por ejemplo, un campo de base de datos o un cuadro de selección HTML.

    <?php

    enum UserStatus: string
    {
        case Pending = 'P';
        case Active = 'A';
        case Suspended = 'S';
        case CanceledByUser = 'C';

        public function label(): string
        {
            return match ($this) {
                self::Pending => 'Pending',
                self::Active => 'Active',
                self::Suspended => 'Suspended',
                self::CanceledByUser => 'Canceled by user',
            };
        }
    }

    foreach (UserStatus::cases() as $case) {
        printf(
            "<option value=\"%s\">%s</option>\n",
            htmlentities($case->value),
            htmlentities($case->label())
        );
    }

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