지원되는 열거형

기본적으로 열거 케이스에는 이에 상응하는 스칼라가 없습니다. 그것들은 단순히 싱글톤 객체입니다. 그러나 Enumerated Case가 데이터베이스 또는 유사한 데이터 저장소로 왕복할 수 있어야 하는 경우가 많기 때문에 내장 스칼라(따라서 간단하게 직렬화 가능)에 해당하는 것을 본질적으로 정의하는 것이 유용합니다.

열거형에 해당하는 스칼라를 정의하기 위한 구문은 다음과 같습니다.

                  
<?php
enum Suit: string
{
    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';
}
?>
                  
                

이에 상응하는 스칼라 값이 있는 케이스는 더 간단한 값으로 "백업"되기 때문에 지원 케이스라고 합니다. 모든 지원 사례를 포함하는 Enum을 "Backed Enum"이라고 합니다. 지원 열거형에는 지원 사례만 포함될 수 있습니다. Pure Enum에는 Pure Case만 포함될 수 있습니다.

Backed Enum은 int 또는 string 유형으로 뒷받침될 수 있으며 주어진 열거는 한 번에 단일 유형만 지원합니다(즉, int|string의 합집합 없음). 열거형에 해당하는 스칼라가 있는 것으로 표시되면 모든 케이스에 명시적으로 정의된 고유한 스칼라가 있어야 합니다. 자동 생성된 등가 스칼라(예: 순차 정수)가 없습니다. 지원되는 케이스는 고유해야 합니다. 두 개의 백업 enum 케이스는 동일한 스칼라 값을 갖지 않을 수 있습니다. 그러나 상수는 대소문자를 참조하여 효과적으로 별칭을 생성할 수 있습니다. 열거 상수를 참조하십시오.

동등한 값은 리터럴 또는 리터럴 표현식이어야 합니다. 상수 및 상수 표현식은 지원되지 않습니다. 즉, 1 + 1은 허용되지만 1 + SOME_CONST는 허용되지 않습니다.

지원 사례에는 정의에 지정된 값인 추가 읽기 전용 속성 value이 있습니다.

                  
<?php
print Suit::Clubs->value;
// Prints "C"
?>
                  
                

value 속성을 읽기 전용으로 적용하기 위해 변수를 참조로 할당할 수 없습니다. 즉, 다음과 같은 오류가 발생합니다.

                  
<?php
$suit = Suit::Clubs;
$ref = &$suit->value;
// Error: Cannot acquire reference to property Suit::$value
?>
                  
                

지원되는 열거형은 두 가지 추가 메서드를 노출하는 내부 BackedEnum 인터페이스를 구현합니다.

  • from(int|string): self는 스칼라를 가져와 해당 Enum Case를 반환합니다. 하나를 찾지 못하면 ValueError가 발생합니다. 이것은 입력 스칼라가 신뢰되고 누락된 열거형 값이 애플리케이션 중지 오류로 간주되어야 하는 경우에 주로 유용합니다.
  • tryFrom(int|string): ?self는 스칼라를 사용하여 해당 Enum Case를 반환합니다. 하나가 없으면 null을 반환합니다. 이는 입력 스칼라를 신뢰할 수 없고 호출자가 자체 오류 처리 또는 기본값 논리를 구현하려는 경우에 주로 유용합니다.

from()tryFrom() 메서드는 표준 약한/강한 유형 지정 규칙을 따릅니다. 약한 유형 지정 모드에서는 정수 또는 문자열을 전달하는 것이 허용되며 시스템은 그에 따라 값을 강제 변환합니다. float를 전달하는 것도 작동하고 강제됩니다. 엄격한 유형 지정 모드에서 문자열 기반 열거형에서 from()에 정수를 전달하면(또는 그 반대로) TypeError가 발생하고 모든 상황에서 부동 소수점도 마찬가지입니다. 다른 모든 매개변수 유형은 두 모드 모두에서 TypeError를 발생시킵니다.

                  
<?php
$record = get_stuff_from_database($id);
print $record['suit'];

$suit =  Suit::from($record['suit']);
// Invalid data throws a ValueError: "X" is not a valid scalar value for enum "Suit"
print $suit->value;

$suit = Suit::tryFrom('A') ?? Suit::Spades;
// Invalid data returns null, so Suit::Spades is used instead.
print $suit->value;
?>
                  
                

Backed Enum에서 from() 또는 tryFrom() 메서드를 수동으로 정의하면 치명적인 오류가 발생합니다.