## Exemples

Exemple #1 Valeurs limitées de base

    <?php

    enum SortOrder
    {
        case Asc;
        case Desc;
    }

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

La fonction `query()` peut maintenant être exécutée en sachant que `$order` est garanti d'être soit `SortOrder::Asc` ou `SortOrder::Desc`. Toute autre valeur aurait entraîné une TypeError, donc aucune autre vérification d'erreur ou test n'est nécessaire.

Exemple #2 Valeurs exclusives avancées

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

Dans cet exemple, le statut d'un utilisateur peut être l'un de, et exclusivement, `UserStatus::Pending`, `UserStatus::Active`, `UserStatus::Suspended`, ou `UserStatus::CanceledByUser`. Une fonction peut typer un paramètre par rapport à `UserStatus` et n'accepter que ces quatre valeurs, un point c'est tout.

Ces quatre valeurs ont une méthode `label()`, qui renvoie une chaîne lisible pour les humains. Cette chaîne est indépendante de la chaîne scalaire équivalente "nom machine", qui peut être utilisée dans, par exemple, un champ de base de données ou un menu déroulant 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