enum(열거형, PHP 8.1+)은 고정된 명명된 값 집합을 갖는 타입을 정의합니다 — 제약된 옵션 집합(상태, 역할, 타입)에 대해, 클래스 상수나 매직 문자열을 쓰던 옛 방식보다 훨씬 나은 타입 안전성을 제공하는, 오래 기다려 온 기능입니다.
순수 enum (명명된 케이스만)
{
Active;
Inactive;
Pending;
}
= ::;
{}
(::);
();
순수 enum은 명명된 케이스를 정의합니다. 타입 힌트로 사용하면 유효한 값만 보장합니다 — 임의의 문자열/정수를 전달하는 버그를 제거합니다.
enum Status: string { // 문자열 값으로 "백드(backed)"
case Active = 'active';
case Inactive = 'inactive';
case Pending = 'pending';
}
Status::Active->value; // 'active' — 백킹 값
Status::from('active'); // Status::Active — 값으로부터 변환
Status::tryFrom('bad'); // 유효하지 않으면 null (예외 대신)
Status::cases(); // [Active, Inactive, Pending] — 모든 케이스
백드 enum은 각 케이스를 스칼라(문자열 또는 정수)와 연관시킵니다 — 데이터베이스에 저장하거나 직렬화하는 데 유용하며, 값으로부터 변환하는 from()/tryFrom()과 모든 케이스를 나열하는 cases()가 있습니다.
enum Status: string {
case Active = 'active';
case Inactive = 'inactive';
public function label(): string { // enum의 메서드
return match($this) {
Status::Active => 'Active User',
Status::Inactive => 'Inactive User',
};
}
public function isActive(): bool {
return $this === Status::Active;
}
}
Status::Active->label(); // "Active User"
enum은 메서드를 가질 수 있고(인터페이스를 구현할 수도 있음), 각 케이스에 동작을 붙일 수 있습니다 — 강력한 도메인 모델링 도구로 만듭니다.
// ❌ enum 이전 — 클래스 상수나 매직 문자열: 타입 안전성 없음, 오타에 취약
class Status { const ACTIVE = 'active'; const INACTIVE = 'inactive'; }
function setStatus(string $s) {} // 어떤 문자열이든 받음 — "actve" 오타도 통과
enum(PHP 8.1+)은 제약된 값 집합에 적절한 타입 안전성을 가져오는 중요하고 오래 기다려 온 기능이며 — 현대 PHP 코드베이스가 이를 채택함에 따라 점점 더 이해가 필수적입니다.
enum 이전에 개발자들은 고정된 옵션 집합(상태, 역할, 타입, 상태)을 클래스 상수나 원시 문자열/정수로 표현했는데, 이는 타입 안전성이 없고(어떤 문자열이든 받아들여져 "actve" 같은 오타가 통과하여 런타임 버그를 야기) 유효한 값을 제약할 방법이 없었습니다.
enum이 이를 해결합니다. 타입 힌트로서 enum은 유효한 케이스만 전달될 수 있음을 보장하여, 유효하지 않은 값을 런타임 버그가 아닌 타입 수준에서 잡습니다 — 상당한 안전성 향상입니다. 백드 enum(스칼라 값을 가진)은 데이터베이스와 직렬화에 깔끔하게 통합되고(변환에 from()/tryFrom()), enum은 메서드를 가질 수 있어(각 케이스에 동작 부착, 예: label()이나 isActive()) 도메인 모델링에 강력합니다.
순수 enum vs 백드 enum, 그 메서드, 그리고 enum이 오류 나기 쉬운 옛 상수/문자열 방식을 어떻게 대체하는지를 이해하는 것은 현대적이고 타입 안전한 PHP를 작성하는 데 중요한 지식입니다 — enum은 이제 고정된 값 집합을 모델링하는 관용적인 방법이며 현재 프레임워크와 애플리케이션에서 널리 사용되므로, 이를 숙달하는 것은 현대 PHP에 대한 능숙함과 유효하지 않은 값 버그라는 한 부류 전체를 예방하는 더 안전하고 표현력 있으며 자기 설명적인 코드를 작성하는 능력을 반영합니다.