## Différences avec les objets

Bien que les Enums soient construites sur la base de classes et d'objets, elles ne prennent pas en charge toutes les fonctionnalités liées aux objets. En particulier, les cas d'énumérations ne peuvent pas avoir d'état.

- Les constructeurs et les destructeurs sont interdits.
- L'héritage n'est pas pris en charge. Les Enums ne peuvent pas étendre ou être étendues.
- Les propriétés statiques ou d'objet ne sont pas autorisées.
- Le clonage d'un cas d'énumération n'est pas autorisé, car les cas doivent être des instances singleton.
- Les méthodes magiques, à l'exception de celles énumérées ci-dessous, ne sont pas autorisées.
- Les énumérations doivent toujours être déclarées avant d'être utilisées.

Les fonctionnalités suivantes sont disponibles pour les objets et se comportent de la même manière que pour tout 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 Enums peuvent implémenter un nombre quelconque d'interfaces.
- Les enums et les cas peuvent avoir des attributs qui leur sont attachés. Le filtre `TARGET_CLASS` inclut les Enums elles-mêmes. Le filtre cible `TARGET_CLASS_CONST` inclut les cas d'Enum.
- Les méthodes magiques __call, __callStatic, et __invoke
- Les constantes `__CLASS__` et `__FUNCTION__` se comportent normalement

La constante magique `::class` sur un type Enum évalue le nom du type, y compris l'espace de noms, exactement comme pour un objet. La constante magique `::class` sur une instance d'un cas Case évalue également le type Enum, puisqu'il s'agit d'une instance de ce type.

En outre, les cas d'énumération ne peuvent pas être instanciés directement avec `new`, ni avec ReflectionClass::newInstanceWithoutConstructor() de la réflexion. Ces deux méthodes entraîneront une erreur.

`<?php
$clovers = new Suit();
// Error: Cannot instantiate enum Suit
$horseshoes = (new ReflectionClass(Suit::class))->newInstanceWithoutConstructor()
// Error: Cannot instantiate enum Suit
?>`