Modern PHP Features
Thème :
Junior
2 vues ·13/21 leçons

Les Enums avec Valeurs Associées (Backed Enums)

Les backed enums associent chaque cas à une valeur scalaire (int ou string). Indispensable pour le stockage en base de données et les réponses API.

Enums String-Backed

<?php
enum Status: string {
    case Pending = 'pending';
    case Active = 'active';
    case Suspended = 'suspended';
    case Deleted = 'deleted';
}

$status = Status::Active;
echo $status->value;  // 'active'
echo $status->name;   // 'Active'

Enums Integer-Backed

<?php
enum HttpStatus: int {
    case OK = 200;
    case Created = 201;
    case BadRequest = 400;
    case NotFound = 404;
    case ServerError = 500;
}

http_response_code(HttpStatus::NotFound->value);  // 404

Créer à Partir d’une Valeur

<?php
enum Status: string {
    case Pending = 'pending';
    case Active = 'active';
}

// Depuis une valeur de base de données
$dbValue = 'active';
$status = Status::from($dbValue);  // Status::Active

// Avec une valeur invalide
$status = Status::from('invalide');  // ValueError !

// Version sécurisée — retourne null si non trouvé
$status = Status::tryFrom('invalide');  // null
$status = Status::tryFrom('active');    // Status::Active

Intégration Base de Données

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

class Order {
    public function __construct(
        public int $id,
        public OrderStatus $status
    ) {}
}

// Sauvegarder en base de données
$order = new Order(1, OrderStatus::Processing);
$stmt = $pdo->prepare('UPDATE orders SET status = ? WHERE id = ?');
$stmt->execute([$order->status->value, $order->id]);

// Charger depuis la base de données
$row = $stmt->fetch();
$status = OrderStatus::from($row['status']);

Sérialisation JSON

<?php
enum Priority: int {
    case Low = 1;
    case Medium = 2;
    case High = 3;
}

class Task implements JsonSerializable {
    public function __construct(
        public string $title,
        public Priority $priority
    ) {}

    public function jsonSerialize(): array {
        return [
            'title' => $this->title,
            'priority' => $this->priority->value,
        ];
    }
}

$task = new Task('Corriger le bug', Priority::High);
echo json_encode($task);
// {"title":"Corriger le bug","priority":3}

Exemple Concret

Enum de statut de paiement avec logique de machine à états

<?php
declare(strict_types=1);

// Enum complet de statut de paiement avec méthodes
enum PaymentStatus: string {
    case Pending = 'pending';
    case Processing = 'processing';
    case Completed = 'completed';
    case Failed = 'failed';
    case Refunded = 'refunded';

    public function label(): string {
        return match($this) {
            self::Pending => '⏳ En attente',
            self::Processing => '🔄 En cours',
            self::Completed => '✅ Complété',
            self::Failed => '❌ Échoué',
            self::Refunded => '↩️ Remboursé',
        };
    }

    public function isFinal(): bool {
        return in_array($this, [self::Completed, self::Failed, self::Refunded]);
    }

    public function canTransitionTo(self $newStatus): bool {
        return match($this) {
            self::Pending => in_array($newStatus, [self::Processing, self::Failed]),
            self::Processing => in_array($newStatus, [self::Completed, self::Failed]),
            self::Completed => $newStatus === self::Refunded,
            default => false,
        };
    }
}

// Utilisation
$status = PaymentStatus::Pending;
echo $status->label();  // ⏳ En attente

if ($status->canTransitionTo(PaymentStatus::Processing)) {
    $status = PaymentStatus::Processing;
}
?>

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 Enums avec Valeurs Associées (Backed Enums). Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.