Differences from objects

Оновлено: 11.05.2023

Хоча зчислення побудовані на класах та об'єктах, вони не підтримують всю функціональність, пов'язану з об'єктами. Зокрема, випадкам Enum заборонено мати стан.

  • Конструктори та деструктори заборонені.
  • Спадкування не підтримується. Зчислення не можуть розширюватися або бути розширеними.
  • Статичні або об'єктні властивості не допускаються.
  • Клонування зчислення не підтримується, оскільки зчислення повинні бути єдиними екземплярами.
  • Магічні методи, за винятком перелічених нижче, заборонені.
  • Зчислення завжди повинні бути оголошені перед використанням.

Наступна функціональність об'єкта доступна і поводиться так само, як і на будь-якому іншому об'єкті:

  • Загальнодоступні, приватні та захищені методи.
  • Загальнодоступні, приватні та захищені статичні методи.
  • Загальнодоступні, приватні та захищені константи.
  • Зчислення можуть реалізовувати будь-яку кількість інтерфейсів.
  • Зчислення та випадки можуть мати атрибути, прикріплені до них. Цільовий фільтр TARGET_CLASS включає самі зчислення. Цільовий фільтр TARGET_CLASS_CONST включає перелічені випадки.
  • __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
?>