Menu
Coddy logo textTech

열거형 (PHP 8.1)

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 59번째.

PHP 8.1 이전에는 상태나 유형과 같은 고정된 값 집합을 나타내려면 class 상수나 매직 문자열을 사용해야 했으며, 두 방법 모두 오류가 발생하기 쉬웠습니다. 열거형(enumerations)은 특정한 사전 정의 값만 가질 수 있는 타입을 정의하는 올바른 방법을 제공합니다.

열거형을 enum 키워드를 사용하여 Define합니다:

<?php
enum Status {
    case Pending;
    case Active;
    case Completed;
}

$status = Status::Active;
echo $status->name;

출력:

Active

열거형은 backed 값을 가질 수도 있습니다. 즉, each case와 연결된 문자열 또는 정수 값입니다. 이는 데이터베이스나 API에 열거형을 저장할 때 유용합니다.

<?php
enum Status: string {
    case Pending = 'pending';
    case Active = 'active';
    case Completed = 'completed';
}

$status = Status::Active;
echo $status->value;

출력:

active

Backed 열거형은 값으로부터 열거형을 생성하는 from() 메서드와, 유효하지 않은 값에 대해 오류를 발생시키는 대신 null을 반환하는 tryFrom()을 제공합니다.

<?php
$status = Status::from('active');      // Status::Active를 반환합니다
$invalid = Status::tryFrom('unknown'); // null을 반환합니다

열거형은 메서드도 포함할 수 있으므로 관련 로직을 캡슐화하는 데 강력합니다. 열거형은 타입 힌트와 원활하게 함께 작동하여 함수가 유효한 값만 허용하도록 하므로, 문자열이 예상되는 옵션과 일치하는지 더 이상 확인할 필요가 없습니다.

challenge icon

챌린지

쉬움

열거형을 사용하여 주문 상태를 타입 안전한 방식으로 나타내는 주문 관리 시스템을 만들어 보겠습니다. 오타가 나거나 유효하지 않을 수 있는 문자열에 의존하는 대신, 각 상태를 데이터베이스에 적합한 값에 매핑하는 backed enum을 Create합니다.

코드를 세 개의 파일로 구성합니다.

  • OrderStatus.php: OrderStatus라는 문자열 backed enum을 Create하고, 다음 four case를 정의합니다.
    • Pending'pending'를 값으로 가집니다.
    • Processing'processing'를 값으로 가집니다.
    • Shipped'shipped'를 값으로 가집니다.
    • Delivered'delivered'를 값으로 가집니다.
    각 상태에 대해 사람이 읽을 수 있는 설명을 반환하는 label() method를 추가합니다.
    • Pending는 "Awaiting confirmation"을 반환합니다.
    • Processing는 "Being prepared"를 반환합니다.
    • Shipped는 "On the way"를 반환합니다.
    • Delivered는 "Order complete"를 반환합니다.
  • Order.php: enum을 사용하는 Order class를 Create합니다. OrderStatus 파일을 포함합니다. class는 다음과 같아야 합니다.
    • constructor promotion을 사용하여 주문 ID(string)와 OrderStatus를 받습니다.
    • getInfo() method는 "Order [id]: [status label]"을 반환합니다.
    • getStatusValue() method는 상태의 backed 값을 반환합니다(데이터베이스 저장에 유용합니다).
  • main.php: Order 파일을 포함합니다. 두 개의 input, 즉 주문 ID와 상태 문자열(예: "shipped")을 받습니다. tryFrom()을 사용하여 문자열 input을 안전하게 OrderStatus enum으로 convert합니다. 상태가 유효하면 Order를 Create하고 두 줄을 출력합니다.
    • getInfo()의 결과
    • getStatusValue()의 결과
    상태 문자열이 유효하지 않으면 "Invalid status"를 출력합니다.

이 challenge는 enum이 어떻게 타입 안전성을 제공하는지 보여 줍니다. Order class는 유효한 상태만 받을 수 있으며, tryFrom() method를 사용하면 유효하지 않은 값의 위험 없이 사용자 input을 안전하게 처리할 수 있습니다.

직접 해보기

<?php

require_once 'Order.php';

// 입력 읽기
$orderId = trim(fgets(STDIN));
$statusString = trim(fgets(STDIN));

// TODO: OrderStatus::tryFrom()을 사용하여 status 문자열을 안전하게 enum으로 변환
// tryFrom()은 값이 유효하지 않으면 null을 반환합니다

// TODO: status가 유효하면 Order를 생성하고 다음을 출력:
// - getInfo()의 결과
// - getStatusValue()의 결과

// TODO: If the status is invalid, print "Invalid status"

?>
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 PHP 컴파일러