## Unterschiede zu Objekten

Obwohl Enums auf Klassen und Objekten aufgebaut sind, unterstützen sie nicht alle objektbezogenen Funktionen. Insbesondere dürfen Enum-Fälle keinen Zustand haben.

- Konstruktoren und Destruktoren sind nicht erlaubt.
- Vererbung wird nicht unterstützt; Enums dürfen weder erweitern noch erweitert werden.
- Statische oder Objekteigenschaften sind nicht erlaubt.
- Enum-Fälle dürfen nicht geklont werden, weil die Fälle Singleton-Instanzen sein müssen.
- Magische Methoden sind mit Ausnahme der unten aufgeführten nicht erlaubt.
- Enums müssen immer deklariert werden, bevor sie verwendet werden.

Folgende Objektfunktionalität ist verfügbar und verhält sich wie bei jedem anderen Objekt auch:

- Public, private und protected Methoden.
- Public, private und protected statische Methoden.
- Public, private, und protected Konstanten.
- Enums können eine beliebige Anzahl von Schnittstellen implementieren.
- Zu Enums und Fällen können Attribute hinzugefügt werden. Der Zielfilter `TARGET_CLASS` enthält auch die Enums selbst. Der Zielfilter `TARGET_CLASS_CONST` schließt die Enum-Fälle ein.
- Die magischen Methoden __call, __callStatic, und __invoke
- Die Konstanten `__CLASS__` und `__FUNCTION__` verhalten sich wie üblich.

Bei einem Enum-Typ entspricht die magische Konstante `::class` dem Namen des Typs einschließlich des Namensraums, genau wie bei einem Objekt. Bei einer Case-Instanz wird die magische Konstante `::class` ebenfalls nach dem Enum-Typ ausgewertet, da es sich um eine Instanz dieses Typs handelt.

Außerdem dürfen Enum-Fälle nicht direkt mit `new` oder mit ReflectionClass::newInstanceWithoutConstructor() instanziiert werden. Beides führt zu einem Fehler.

`<?php
$clovers = new Suit();
// Error: Cannot instantiate enum Suit
$horseshoes = (new ReflectionClass(Suit::class))->newInstanceWithoutConstructor()
// Error: Cannot instantiate enum Suit
?>`
`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open