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