Énumérations de base
Les énumérations sont similaires aux classes et partagent les mêmes espaces de noms que les classes, les interfaces et les traits. Ils sont également autochargeables de la même manière. Un Enum définit un nouveau type, qui a un nombre fixe et limité de valeurs légales possibles.
<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
?>
Cette déclaration crée un nouveau type énuméré nommé Suit, qui a quatre et seulement quatre valeurs légales : Suit::Hearts, Suit::Diamonds, Suit::Clubset Suit::Spades. Les variables peuvent être affectées à l'une de ces valeurs légales. Une fonction peut être vérifiée par rapport à un type énuméré, auquel cas seules les valeurs de ce type peuvent être transmises.
<?php
function pick_a_card(Suit $suit) { ... }
$val = Suit::Diamonds;
// OK
pick_a_card($val);
// OK
pick_a_card(Suit::Clubs);
// TypeError: pick_a_card(): Argument #1 ($suit) must be of type Suit, string given
pick_a_card('Spades');
?>
Une énumération peut avoir zéro ou plusieurs casedéfinitions, sans maximum. Une énumération à zéro cas est syntaxiquement valide, même si elle est plutôt inutile.
Pour les cas d'énumération, les mêmes règles de syntaxe s'appliquent à toute étiquette en PHP, voir Constants.
Par défaut, les cas ne sont pas intrinsèquement soutenus par une valeur scalaire. Autrement dit, Suit::Hearts n'est pas égal à "0". Au lieu de cela, chaque cas est soutenu par un objet singleton de ce nom. Cela signifie que:
<?php
$a = Suit::Spades;
$b = Suit::Spades;
$a === $b; // true
$a instanceof Suit; // true
?>
Cela signifie également que les valeurs d'énumération ne sont jamais les unes
Ce type de cas, sans données connexes, est appelé un "cas pur". Une énumération qui ne contient que des cas purs est appelée une énumération pure.
Tous les cas purs sont implémentés en tant qu'instances de leur type enum. Le type enum est représenté en interne comme une classe.
Tous les cas ont une propriété en lecture seule, name, c'est-à-dire le nom sensible à la casse du cas lui-même.
<?php
print Suit::Spades->name;
// prints "Spades"
?>
Il est également possible d'utiliser les fonctions defined() et constant() pour vérifier l'existence ou lire un cas d'énumération si le nom est obtenu dynamiquement. Ceci est cependant déconseillé car l'utilisation d'énumérations sauvegardées devrait fonctionner pour la plupart des cas d'utilisation.