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
?>