Enums en PHP: ils arrivent enfin en version 8.1

Ils arrivent enfin ! Depuis fin 2021, PHP 8.1 apporte pas mal de nouvelles fonctionnalités au langage, dont les Enums.

Qu’est-ce que les Enums en PHP ?

Une énumération ou « Enum » est un type énuméré qui a un nombre de valeurs fixes. Il permet aux développeurs de définir un type personnalisé qui est limité à un nombre précis de valeurs.

Syntaxe des Enums en PHP

Une utilisation typique des Enums est par exemple la gestion de statut de commande:

enum Statut
{
    case PREPARATION;
    case EN_COURS;
    case LIVREE;
}

Un Enum peut ensuite être utilisé comme attribut de classe, ici on gère le statut d’une commande :

class Commande
{
    public Statut $statut;
    public function __construct(Statut $statut) 
    {
        $this->statut = $statut;
    }
}

Spécifier les valeurs d’un Enum PHP

PHP 8.1 permet aussi de spécifier une valeur pour chaque élément de l’énumération:

enum Statut
{
    case PREPARATION = 'préparation';
    case EN_COURS = 'en cours';
    case LIVREE = 'livrée';
}

Typer les valeurs d’un Enum PHP

On peut aussi spécifier le type des valeurs d’un Enum en php 8.1 :

enum Statut: string
{
    case PREPARATION = 'préparation';
    case EN_COURS = 'en cours';
    case LIVREE = 'livrée';
}

Les méthodes d’Enum PHP

On peut aussi définir des méthodes dans les Enums en PHP. En reprenant notre premier exemple de status, on peut imaginer une méthode qui retourne une valeur textuelle en fonction du statut:

enum Statut
{
    case PREPARATION;
    case EN_COURS;
    case LIVREE;

    public function couleur(): string
    {
        return match($this) 
        {
            Statut::PREPARATION => 'Rouge',   
            Statut::EN_COURS => 'Jaune',   
            Statut::LIVREE => 'Vert',   
        };
    }
}

On peut ensuite utiliser cette méthode sur n’importe quelle variable de type Statut:

$statut = Status::EN_COURS;

$statut->couleur(); // 'Jaune'

De la même manière, on peut utiliser le mot clé self pour accéder aux propriétés d’un enum, ainsi que définir des méthodes statiques:

enum Statut
{
    case PREPARATION;
    case EN_COURS;
    case LIVREE;

    public function couleur(): string
    {
        return match($this) 
        {
            self::PREPARATION => 'Rouge',   
            self::EN_COURS => 'Jaune',   
            self::LIVREE => 'Vert',   
        };
    }

    public static function init(): Statut
    {
        return self::PREPARATION;
    }
}

Les interfaces des Enums en PHP

En PHP 8.1, il est aussi possible de créer des interfaces pour les Enums. Le fonctionnement est exactement le même que les interfaces de classes. Une interface définit un contrat qui doit être respecté par les énumérations qui l’implémentent:

interface HasColor
{
    public function color(): string;
}

enum Statut implements HasColor
{
    case PREPARATION;
    case EN_COURS;
    case LIVREE;
    
    public function color(): string { /* … */ }
}

Lister les valeurs d’un Enum

Il est aussi possible de lister toutes les valeurs d’un Enum en PHP 8.1:

Statut::cases();
/* [
    case PREPARATION,
    case EN_COURS,
    case LIVREE
] */

Fonctionnalités des Enums

Les Enums possèdent plusieurs fonctionnalités intéressantes comme la comparaison de classe, les traits, la réflexivité.

Les Enums PHP sont des objets

Les Enums sont représentés sous forme d’objet en PHP, cela veut donc dire qu’on peut faire ce genre de comparaisons avec:

$statutA = Statut::PREPARATION;
$statutB = Statut::EN_COURS;
$statutC = Statut::LIVREE;

$statutA === $statutB; // true
$statutA === $statutC; // false
$statutC instanceof Statut; // true

Les Enums et les Traits

Les Enums peuvent utiliser des traits, comme les classes, mais avec quelques restrictions. On ne peut pas écraser les méthodes spécifiques aux Enums par une méthode de trait. exemple: la méthode cases()

Tester l’existence d’un Enum

Les Enums en php sont réflexifs, au même titre que les classes. Notament la classe ReflectionEnum permet de récupérer tout un tas d’informations sur un Enum lors de l’exécution du code.

PHP mets aussi à disposition la fonction enum_exists pour détecter l’existence ou non d’un Enum.

Pour aller plus loin

La documentation PHP en ligne propose une liste exhaustive des fonctionnalités des Enums: https://www.php.net/manual/fr/language.enumerations.php

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *