ConFoo 2025

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

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

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

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

  • Методы 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
?>
Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top