Modern PHP Features
Thème :
Junior
1 vues ·14/21 leçons

Les Patterns Avancés des Enums

Les enums supportent des patterns avancés : machines à états, implémentation d’interfaces, et utilisation de traits.

Machine à États avec les Enums

<?php
enum OrderStatus: string
{
    case Pending = 'pending';
    case Confirmed = 'confirmed';
    case Shipped = 'shipped';
    case Delivered = 'delivered';
    case Cancelled = 'cancelled';

    public function canTransitionTo(self $next): bool
    {
        return match ($this) {
            self::Pending => in_array($next, [self::Confirmed, self::Cancelled]),
            self::Confirmed => in_array($next, [self::Shipped, self::Cancelled]),
            self::Shipped => $next === self::Delivered,
            self::Delivered, self::Cancelled => false,
        };
    }

    public function transitionTo(self $next): self
    {
        if (!$this->canTransitionTo($next)) {
            throw new InvalidArgumentException(
                "Impossible de passer de {$this->value} à {$next->value}"
            );
        }
        return $next;
    }

    public function isFinal(): bool
    {
        return in_array($this, [self::Delivered, self::Cancelled]);
    }
}

// Utilisation
$status = OrderStatus::Pending;
$status = $status->transitionTo(OrderStatus::Confirmed); // OK
$status = $status->transitionTo(OrderStatus::Shipped);   // OK

Les Enums Implémentant des Interfaces

<?php
interface Describable
{
    public function describe(): string;
    public function getIcon(): string;
}

enum Permission: string implements Describable
{
    case Read = 'read';
    case Write = 'write';
    case Delete = 'delete';
    case Admin = 'admin';

    public function describe(): string
    {
        return match ($this) {
            self::Read => 'Voir et lire le contenu',
            self::Write => 'Créer et modifier le contenu',
            self::Delete => 'Supprimer le contenu définitivement',
            self::Admin => 'Accès administrateur complet',
        };
    }

    public function getIcon(): string
    {
        return match ($this) {
            self::Read => 'eye',
            self::Write => 'pencil',
            self::Delete => 'trash',
            self::Admin => 'crown',
        };
    }
}

Enum avec Traits

<?php
trait EnumToArray
{
    public static function names(): array
    {
        return array_column(self::cases(), 'name');
    }

    public static function values(): array
    {
        return array_column(self::cases(), 'value');
    }

    public static function toArray(): array
    {
        return array_combine(self::names(), self::values());
    }
}

enum Color: string
{
    use EnumToArray;

    case Red = '#FF0000';
    case Green = '#00FF00';
    case Blue = '#0000FF';
}

Color::toArray();
// ['Red' => '#FF0000', 'Green' => '#00FF00', 'Blue' => '#0000FF']

Validation et Formulaires avec les Enums

<?php
enum Country: string
{
    case FR = 'fr';
    case UK = 'uk';
    case DE = 'de';

    public function label(): string
    {
        return match ($this) {
            self::FR => 'France',
            self::UK => 'Royaume-Uni',
            self::DE => 'Allemagne',
        };
    }

    public static function forSelect(): array
    {
        return array_map(
            fn($case) => ['value' => $case->value, 'label' => $case->label()],
            self::cases()
        );
    }

    public static function isValid(string $value): bool
    {
        return self::tryFrom($value) !== null;
    }
}

Les Grimoires


📘 Cette leçon fait partie du cours PHP 8.x Moderne : Les Dernières Fonctionnalités du Langage sur la plateforme d’apprentissage RostoDev.

Prêt à passer à la suite ?

Vous avez terminé cette leçon sur Les Patterns Avancés des Enums. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.