Dans sa version 8.1, PHP gère nativement le type ENUM et cela permet de simplifier et rationaliser le code à écrire.
Nous devions créer une méthode afin de récupérer chaque valeur possible et, par exemple, afficher une liste déroulante à l’utilisateur. Désormais, nous disposons automatiquement de la méthode cases qui retourne une variable de type array contenant les valeurs possibles.
Lorsqu’on affectait une valeur à une propriété, nous devrions coder un contrôle afin d’être certain que la valeur affectée faisait bien partie de celles permises. Désormais, notre propriété sera typé avec le nom de la classe représentant l’enum et se contrôle sera automatique. De plus, on dispose de la méthode tryFrom permettant de vérifier qu’une valeur est bien définie.
Il également désormais possible d’ajouter des méthodes dans la classe définissant nos enums afin d’y implémenter de la logique métier.
Important à savoir, une classe enum :
- Ne peut pas déclarer de propriété.
- Ne peut pas être instanciée via le mot-clé
new. - Ne peut pas être étendue.
- Peut utiliser un trait, temps que celui-ci ne déclare aucune propriété.
- Peut déclarer des méthodes.
- Peut implémenter des interfaces.
class Client
{
public const ACTIVE = 'active';
public const INACTIVE = 'inactive';
public const ARCHIVED = 'archived';
private string $name = '';
private status $status = '';
// Il fallait une méthode pour récupérer les valeurs.
public static function getAll(): array
{
return [
self::ACTIVE,
self::INACTIVE,
self::ARCHIVED,
];
}
// Il fallait contrôler les valeurs affectées.
public function setStatus(string $status): void
{
if (in_array($status, self::getAll()) === false) {
throw new Exception('Unexpected status value.');
}
}
}
// Les valeurs sont récupérées depuis une méthode à coder.
foreach (ClientStatus::getAll() as $client_status) {
echo '<option value="' . $client_status . '">' . $client_status . '</option>';
}enum ClientStatus: string
{
case ACTIVE = 'active';
case INACTIVE = 'inactive';
case ARCHIVED = 'archived';
}
class Client
{
private string $name = '';
private status $status = '';
// Plus de contrôle à coder.
public function setStatus(ClientStatus $status): void
{
$this->status = $status;
}
// Méthode pour implémenter de la logique métier
public function sendNewsletter(): bool
{
return match ($this) {
self::ACTIVE => true,
default => false
};
}
// 2ème méthode pour un cas courant : obtenir un libellé pour chaque valeur
public function getTranslation(): bool
{
return match ($this) {
self::ACTIVE => 'Client actif',
self::INACTIVE => 'Client inactif',
self::ARCHIVED => 'Client archivé',
};
}
}
// Plus besoin de créer une méthode pour récupérer les valeurs.
foreach (ClientStatus::getAll() as $client_status) {
echo '<option value="' . $client_status->value . '">' . $client_status->getTranslation() . '</option>';
}
// Usage de la méthode implémentant une logique métier.
$send_newsletter = ClientStatus::ACTIVE->sendNewsletter();
// Afficher le nom / la valeur :
echo ClientStatus::ACTIVE->name; // Affiche "ACTIVE"
echo ClientStatus::ACTIVE->value; // Affiche "active"
// Obtenir le nom à partir de la valeur :
// Si la valeur n'existe pas, une exception est renvoyée.
echo ClientStatus::from('active'); // Affiche "ACTIVE"
echo ClientStatus::tryFrom('wrong-value'); // null