Хотя перечисления построены на классах и объектах, они не поддерживают все функциональные возможности, связанные с объектами. В частности, случаям Enum запрещено иметь состояние.

  • Конструкторы и деструкторы запрещены.
  • Наследование не поддерживается. Перечисления не могут расширяться или расширяться.
  • Статические или объектные свойства не допускаются.
  • Клонирование случая Enum не поддерживается, так как случаи должны быть одноэлементными экземплярами.
  • Магические методы , кроме перечисленных ниже, запрещены.

Доступны следующие функциональные возможности объекта, и они ведут себя так же, как и для любого другого объекта:

  • Публичные, частные и защищенные методы.
  • Публичные, частные и защищенные статические методы.
  • Общедоступные, частные и защищенные константы.
  • Перечисления могут реализовывать любое количество интерфейсов.
  • К перечислениям и случаям могут быть прикреплены атрибуты . Целевой TARGET_CLASSфильтр включает сами перечисления. Целевой TARGET_CLASS_CONSTфильтр включает Enum Cases.
  • __call , __callStatic и __invoke магические методы
  • __CLASS__и __FUNCTION__константы ведут себя как обычно

Волшебная ::classконстанта типа Enum оценивается как имя типа, включая любое пространство имен, точно так же, как объект. Магическая константа в ::class экземпляре Case также оценивается как тип Enum, поскольку это экземпляр этого типа.

Кроме того, случаи перечисления не могут быть созданы непосредственно с помощью new, а также с помощью ReflectionClass::newInstanceWithoutConstructor() в отражении. Оба приведут к ошибке.

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