Отличия от объектов

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

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

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

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

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

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

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