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

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

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

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

- Методы 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

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open