열거형 (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;
출력:
activeBacked 열거형은 값으로부터 열거형을 생성하는 from() 메서드와, 유효하지 않은 값에 대해 오류를 발생시키는 대신 null을 반환하는 tryFrom()을 제공합니다.
<?php
$status = Status::from('active'); // Status::Active를 반환합니다
$invalid = Status::tryFrom('unknown'); // null을 반환합니다
열거형은 메서드도 포함할 수 있으므로 관련 로직을 캡슐화하는 데 강력합니다. 열거형은 타입 힌트와 원활하게 함께 작동하여 함수가 유효한 값만 허용하도록 하므로, 문자열이 예상되는 옵션과 일치하는지 더 이상 확인할 필요가 없습니다.
챌린지
쉬움열거형을 사용하여 주문 상태를 타입 안전한 방식으로 나타내는 주문 관리 시스템을 만들어 보겠습니다. 오타가 나거나 유효하지 않을 수 있는 문자열에 의존하는 대신, 각 상태를 데이터베이스에 적합한 값에 매핑하는 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을 사용하는Orderclass를 Create합니다. OrderStatus 파일을 포함합니다. class는 다음과 같아야 합니다.- constructor promotion을 사용하여 주문 ID(string)와
OrderStatus를 받습니다. getInfo()method는"Order [id]: [status label]"을 반환합니다.getStatusValue()method는 상태의 backed 값을 반환합니다(데이터베이스 저장에 유용합니다).
- constructor promotion을 사용하여 주문 ID(string)와
main.php: Order 파일을 포함합니다. 두 개의 input, 즉 주문 ID와 상태 문자열(예:"shipped")을 받습니다.tryFrom()을 사용하여 문자열 input을 안전하게OrderStatusenum으로 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"
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 PHP 컴파일러