객체와의 차이점
객체와의 차이점 (Differences from objects)
열거형이 클래스와 객체에 기반하지만 모든 객체 기능을 지원하지는 않는다는 점을 다룹니다. enum case에서 금지되는 기능과, 반대로 객체처럼 사용할 수 있는 기능을 정리합니다.
본문
enum은 클래스와 객체를 기반으로 하지만, 모든 객체 관련 기능을 지원하지는 않습니다. 특히 enum case는 상태(state)를 가지는 것이 금지됩니다.
- 생성자(Constructor)와 소멸자(Destructor)는 금지됩니다.
- 상속은 지원되지 않습니다. enum은 확장할 수도, 확장될 수도 없습니다.
- 정적 속성이나 객체 속성은 허용되지 않습니다.
- enum case를 복제(clone)하는 것은 지원되지 않습니다. case는 싱글턴 인스턴스여야 하기 때문입니다.
- 아래에 나열된 것을 제외한 매직 메서드는 허용되지 않습니다.
- enum은 사용되기 전에 항상 선언되어야 합니다.
다음의 객체 기능은 사용할 수 있으며, 다른 어떤 객체에서와 똑같이 동작합니다.
public,private,protected메서드.public,private,protected정적 메서드.public,private,protected상수.- enum은 원하는 만큼 많은 인터페이스를 구현할 수 있습니다.
- enum과 case에는 속성(attribute)을 붙일 수 있습니다.
TARGET_CLASS대상 필터는 enum 그 자체를 포함합니다.TARGET_CLASS_CONST대상 필터는 enum case를 포함합니다. __call,__callStatic,__invoke매직 메서드.__CLASS__와__FUNCTION__상수는 정상적으로 동작합니다.
enum 타입의 ::class 매직 상수는 객체와 똑같이 네임스페이스를 포함한 타입 이름으로 평가됩니다. case 인스턴스의 ::class 매직 상수 역시 그 타입의 인스턴스이므로 enum 타입으로 평가됩니다.
추가로, enum case는 new로 직접 인스턴스화할 수 없고, 리플렉션에서 ReflectionClass::newInstanceWithoutConstructor()로도 만들 수 없습니다. 둘 다 오류로 이어집니다.
<?php
$clovers = new Suit();
// Error: Cannot instantiate enum Suit
$horseshoes = (new ReflectionClass(Suit::class))->newInstanceWithoutConstructor()
// Error: Cannot instantiate enum Suit