Différences avec les objets
Bien que les énumérations soient construites sur des classes et des objets, elles ne prennent pas en charge toutes les fonctionnalités liées aux objets. En particulier, il est interdit aux cas Enum d'avoir un état.
- Les constructeurs et les destructeurs sont interdits.
- L'héritage n'est pas pris en charge. Les énumérations ne peuvent pas s'étendre ou être étendues.
- Les propriétés statiques ou d'objet ne sont pas autorisées.
- Le clonage d'un cas Enum n'est pas pris en charge, car les cas doivent être des instances singleton.
- Les méthodes magiques , à l'exception de celles répertoriées ci-dessous, ne sont pas autorisées.
- Les énumérations doivent toujours être déclarées avant d'être utilisées.
La fonctionnalité d'objet suivante est disponible et se comporte exactement comme sur n'importe quel autre objet :
- Méthodes publiques, privées et protégées.
- Méthodes statiques publiques, privées et protégées.
- Constantes publiques, privées et protégées.
- Les énumérations peuvent implémenter n'importe quel nombre d'interfaces.
- Les énumérations et les cas peuvent avoir des attributs qui leur sont attachés. Le TARGET_CLASSfiltre cible inclut les énumérations elles-mêmes. Le TARGET_CLASS_CONSTfiltre cible inclut Enum Cases.
- Méthodes magiques __call , __callStatic et __invoke
- __CLASS__et __FUNCTION__les constantes se comportent normalement
La ::classconstante magique sur un type Enum évalue le nom du type, y compris tout espace de noms, exactement comme un objet. La ::class constante magique sur une instance Case est également évaluée au type Enum, car il s'agit d'une instance de ce type.
De plus, les cas d'énumération ne peuvent pas être instanciés directement avec new, ni avec ReflectionClass::newInstanceWithoutConstructor() en réflexion. Les deux entraîneront une erreur.
<?php
$clovers = new Suit();
// Error: Cannot instantiate enum Suit
$horseshoes = (new ReflectionClass(Suit::class))->newInstanceWithoutConstructor()
// Error: Cannot instantiate enum Suit
?>