개체와의 차이점

열거형은 클래스와 개체를 기반으로 하지만 모든 개체 관련 기능을 지원하지는 않습니다. 특히 Enum 케이스는 상태를 갖는 것이 금지되어 있습니다.

  • 생성자와 소멸자는 금지됩니다.
  • 상속은 지원되지 않습니다. 열거형은 확장하거나 확장할 수 없습니다.
  • 정적 또는 개체 속성은 허용되지 않습니다.
  • 케이스는 싱글톤 인스턴스여야 하므로 Enum 케이스 복제는 지원되지 않습니다.
  • 아래 나열된 방법을 제외한 Magic methods은 허용되지 않습니다.

다음 개체 기능을 사용할 수 있으며 다른 개체에서와 마찬가지로 작동합니다.

  • 공개, 비공개 및 보호된 메서드.
  • 공개, 비공개 및 보호된 정적 메서드.
  • 공개, 비공개 및 보호된 상수.
  • 열거형은 인터페이스를 원하는 수만큼 구현할 수 있습니다.
  • 열거형과 케이스에는 attributes이 첨부되어 있을 수 있습니다. TARGET_CLASS 대상 필터에는 열거형 자체가 포함됩니다. TARGET_CLASS_CONST 대상 필터에는 Enum Cases가 포함됩니다.
  • __call, __callStatic__invoke 매직 메서드
  • __CLASS____FUNCTION__ 상수는 정상적으로 작동합니다.

Enum 유형의 ::class 매직 상수는 모든 네임스페이스를 포함하는 유형 이름으로 평가되며 개체와 정확히 동일합니다. Case 인스턴스의 ::class 매직 상수도 Enum 유형의 인스턴스이므로 Enum 유형으로 평가됩니다.

또한 열거형 케이스는 new 또는 리플렉션에서 ReflectionClass::newInstanceWithoutConstructor()를 사용하여 직접 인스턴스화할 수 없습니다. 둘 다 오류가 발생합니다.

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