>  기사  >  백엔드 개발  >  PHP8.1의 새로운 기능 설명 Enums 열거형

PHP8.1의 새로운 기능 설명 Enums 열거형

藏色散人
藏色散人원래의
2021-11-10 15:09:314905검색

이 기사는 번역되었습니다. 원본 주소: https://stitcher.io/blog/php-enums

PHP 8.1: Enumerations

드디어 출시되었습니다. 내장된 열거형 지원이 PHP에 추가될 예정입니다. 8.1 지원! 어떤 사람들은 오래 전에 이 일을 했어야 했다고 생각할 수도 있지만, 여러분은 내 불평을 듣지 못했습니다. 이 문서에서는 새로 추가된 기능을 자세히 살펴보겠습니다.

내 PHP 기능 게시물에서 늘 그렇듯이, 열거형의 모양에 대한 높은 수준의 개요부터 시작합니다.

enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
}

열거형의 좋은 점은 상수 값 집합을 나타낸다는 점이지만, 가장 중요한 것은 이러한 값이 be 다음과 같이 입력하세요:

class BlogPost
{
    public function __construct(
        public Status $status, 
    ) {}
}

이 예에서 열거형을 생성하여 aBlogPost에 전달하는 방법은 다음과 같습니다.

$post = new BlogPost(Status::DRAFT);

기본 사항은 여기까지이며 보시다시피 전혀 복잡하지 않습니다. 추가로 작성해야 할 부분이 많지만, 열거형에 대해 좀 더 자세히 살펴보겠습니다!

#Enumeration 메서드

Enumeration은 클래스와 마찬가지로 메서드를 정의할 수 있습니다. 이는 특히 일치 연산자와 결합할 때 매우 강력한 기능입니다:

enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
    
    public function color(): string
    {
        return match($this) 
        {
            Status::DRAFT => 'grey',   
            Status::PUBLISHED => 'green',   
            Status::ARCHIVED => 'red',   
        };
    }
}

메소드는 다음과 같이 사용할 수 있습니다:

$status = Status::ARCHIVED;
$status->color(); // 'red'

정적 메소드도 허용됩니다:

enum Status
{
    // …
    
    public static function make(): Status
    {
        // …
    }
}

열거형에서 self를 사용할 수도 있습니다:

enum Status
{
    // …
    
    public function color(): string
    {
        return match($this) 
        {
            self::DRAFT => 'grey',   
            self::PUBLISHED => 'green',   
            self::ARCHIVED => 'red',   
        };
    }
}

# 열거형 인터페이스

열거형은 일반 클래스와 마찬가지로 인터페이스를 구현할 수 있습니다.

interface HasColor
{
    public function color(): string;
}
enum Status implements HasColor
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
    
    public function color(): string { /* … */ }
}

# 열거형 값 - 일명 "지원되는 열거형"

열거형 값은 내부적으로 객체로 표시되지만 값을 할당할 수 있습니다. 필요에 따라 그들에게 유용합니다. 데이터베이스에 직렬화합니다.

enum Status: string
{
    case DRAFT = 'draft';
    case PUBLISHED = 'published';
    case ARCHIVED = 'archived';
}

열거형 정의의 유형 선언에 주의하세요. 모든 열거형 값이 해당 유형에 속함을 나타냅니다. 정수로 만들 수도 있습니다. 열거형 값으로는 int와 string만 허용됩니다.

enum Status: int
{
    case DRAFT = 1;
    case PUBLISHED = 2;
    case ARCHIVED = 3;
}

유형 열거형에 대한 기술 용어는 더 간단한 값으로 "지원"되기 때문에 "지원 열거형"이라고 합니다. 열거형 값을 할당하기로 결정한 경우 모든 케이스에는 값이 있어야 합니다. 그것들을 혼합하고 일치시킬 수는 없습니다. "지원"이 없는 열거형을 "순수 열거형"이라고 합니다.

#인터페이스로 지원되는 열거형

인터페이스와 함께 지원되는 열거형을 사용하는 경우 열거형 유형은 열거형 이름 바로 뒤와 Implements 키워드 앞에 나타나야 합니다.

enum Status: string implements HasColor
{
    case DRAFT = 'draft';
    case PUBLISHED = 'published';
    case ARCHIVED = 'archived';
    
    // …
}

#Serialization support enums

열거형 케이스에 값을 할당하려면 직렬화 및 역직렬화 방법이 필요할 수 있습니다. 이를 직렬화하면 열거형 값에 액세스할 수 있는 방법이 필요하다는 의미입니다. 이는 읽기 전용 공용 속성을 통해 수행됩니다:

$value = Status::PUBLISHED->value; // 2

다음을 사용하여 값에서 열거를 복원할 수 있습니다: Enum::from

$status = Status::from(2); // Status::PUBLISHED

알 수 없는 값이 전달되면 null을 반환하는 tryFrom도 있습니다. from을 사용하는 경우에는 예외가 있습니다.

$status = Status::from('unknown'); // ValueError
$status = Status::tryFrom('unknown'); // null

열거에 내장된 직렬화 및 역직렬화 기능을 사용할 수도 있습니다. 또한 지원되는 열거형과 함께 json_encode를 사용할 수 있으며 결과는 열거형 값이 됩니다. 이 동작은 JsonSerialized를 구현하여 재정의할 수 있습니다.

# 열거형 값 나열 ​​

정적 메서드를 사용하여 열거형에서 사용 가능한 모든 사례 목록을 가져올 수 있습니다. Enum::cases()

Status::cases();
/* [
    Status::DRAFT, 
    Status::PUBLISHED, 
    Status::ARCHIVED
] */

이 배열에는 실제 열거형 개체가 포함되어 있습니다.

array_map(
    fn(Status $status) => $status->color(), 
    Status::cases()
);

#열거형은 객체입니다.

열거형 값은 객체로 표현된다고 이미 언급했는데, 실제로는 싱글톤 객체입니다. 즉, 다음과 같이 비교할 수 있습니다.

$statusA = Status::PENDING;
$statusB = Status::PENDING;
$statusC = Status::ARCHIVED;
$statusA === $statusB; // true
$statusA === $statusC; // false
$statusC instanceof Status; // true

#Enums as array key

enum 값은 실제로 객체이므로 현재는 이를 배열 키로 사용할 수 없습니다. 다음과 같은 경우 오류가 발생합니다.

$list = [
    Status::DRAFT => 'draft',
    // …
];

이 동작을 변경하기 위한 RFC가 있지만 아직 투표되지 않았습니다.

즉, SplObjectStorage 및 WeakMaps에서는 열거형을 키로만 사용할 수 있습니다.

#Traits

열거는 클래스와 같은 특성을 사용할 수 있지만 더 많은 제한이 있습니다. 내장 열거형 메소드를 재정의하는 것은 허용되지 않으며 클래스 속성을 포함할 수 없습니다. 열거형에서의 사용은 금지됩니다.

#Reflection 및 속성

예상대로 열거형을 처리하기 위해 ReflectionEnum, ReflectionEnumUnitCase 및 ReflectionEnumBackedCase와 같은 일부 리플렉션 클래스가 추가되었습니다. 이름에서 알 수 있는 것과 정확히 일치하는 새로운 enum_exists 함수도 있습니다.

일반 클래스 및 속성과 마찬가지로 열거형 및 해당 사례에는 속성을 사용하여 주석을 달 수 있습니다. TARGET_CLASS 필터에는 열거형도 포함됩니다.

마지막 사항: 열거형에는 읽기 전용 속성도 있습니다. RFC에서는 이것이 구현 세부 사항이며 디버깅 목적으로만 사용해야 한다고 언급합니다. 그러나 여전히 언급할 가치가 있습니다. $enum->name

위 내용은 PHP8.1의 새로운 기능 설명 Enums 열거형의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.