이 기사는 번역되었습니다. 원본 주소: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!