PHPerKaigi 2024

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
?>
add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top