PHP 8.3 열거형을 이용한 비디오 카테고리 관리
I’m happy to translate the article for you, but I’ll need the full text of the post (the content you’d like translated). Could you please paste the article’s body here? Once I have that, I can provide a Korean translation while preserving the source link, formatting, markdown, and any code blocks.
카테고리를 위한 Enum 사용
Enum 사용 전 (취약하고 타입 안전성 없음)
// Before: 취약하고 타입 안전성 없음
class Categories {
const MUSIC = 'music';
const GAMING = 'gaming';
const ENTERTAINMENT = 'entertainment';
}
function getVideos(string $category): array { /* ... */ }
getVideos('musci'); // 오타가 컴파일에 통과해 조용히 실패
Enum 사용 후 (타입 안전, IDE 지원, 완전 매칭)
// After: 타입 안전, IDE 지원, 완전 매칭
enum Category: string {
case Music = 'music';
case Gaming = 'gaming';
case Entertainment = 'entertainment';
}
function getVideos(Category $category): array { /* ... */ }
getVideos(Category::Music); // 타입 안전
YouTube 카테고리 ID 매핑
enum VideoCategory: int {
case FilmAnimation = 1;
case AutosVehicles = 2;
case Music = 10;
case PetsAnimals = 15;
case Sports = 17;
case ShortMovies = 18;
case TravelEvents = 19;
case Gaming = 20;
case Videoblogging = 21;
case PeopleBlogs = 22;
case Comedy = 23;
case Entertainment = 24;
case NewsPolitics = 25;
case HowtoStyle = 26;
case Education = 27;
case ScienceTech = 28;
case NonprofitsActivism = 29;
case Movies = 30;
case AnimeAnimation = 31;
case ActionAdventure = 32;
case Classics = 33;
case Documentary = 35;
case Shorts = 42;
public function label(): string {
return match($this) {
self::FilmAnimation => 'Film & Animation',
self::Music => 'Music',
self::Gaming => 'Gaming',
self::Entertainment => 'Entertainment',
self::NewsPolitics => 'News & Politics',
self::ScienceTech => 'Science & Tech',
self::HowtoStyle => 'How-to & Style',
self::Education => 'Education',
self::Comedy => 'Comedy',
self::Sports => 'Sports',
self::PeopleBlogs => 'People & Blogs',
default => $this->name,
};
}
public function slug(): string {
return strtolower(preg_replace('/[^a-z0-9]+/i', '-', $this->label()));
}
public function icon(): string {
return match($this) {
self::Music => 'music-note',
self::Gaming => 'gamepad',
self::Entertainment => 'star',
self::NewsPolitics => 'newspaper',
self::ScienceTech => 'flask',
self::Sports => 'trophy',
default => 'play-circle',
};
}
/**
* Categories displayed in the navigation bar.
*/
public static function navCategories(): array {
return [
self::Music,
self::Gaming,
self::Entertainment,
self::NewsPolitics,
self::ScienceTech,
self::Sports,
self::HowtoStyle,
self::Education,
self::Comedy,
self::PeopleBlogs,
];
}
}
Region 열거형
enum Region: string {
case US = 'US';
case GB = 'GB';
case JP = 'JP';
case KR = 'KR';
case TW = 'TW';
case SG = 'SG';
case VN = 'VN';
case TH = 'TH';
case HK = 'HK';
public function label(): string {
return match($this) {
self::US => 'United States',
self::GB => 'United Kingdom',
self::JP => 'Japan',
self::KR => 'South Korea',
self::TW => 'Taiwan',
self::SG => 'Singapore',
self::VN => 'Vietnam',
self::TH => 'Thailand',
self::HK => 'Hong Kong',
};
}
public function flag(): string {
// Convert country code to flag emoji
$chars = str_split($this->value);
return implode('', array_map(
fn(string $c) => mb_chr(ord($c) - ord('A') + 0x1F1E6),
$chars
));
}
public function hreflang(): string {
return match($this) {
self::JP => 'ja',
self::KR => 'ko',
self::TW => 'zh-TW',
self::HK => 'zh-HK',
self::VN => 'vi',
self::TH => 'th',
default => 'en',
};
}
}
포괄적인 매칭 예시
// This match is exhaustive — add a new Region case
// and PHP warns you about every unhandled match
function cronInterval(Region $region): string {
return match($region) {
Region::US, Region::GB => '*/2 * * * *',
Region::JP, Region::KR => '*/3 * * * *',
Region::TW, Region::SG, Region::HK => '*/4 * * * *',
Region::VN, Region::TH => '*/6 * * * *',
};
}
class CacheConfig {
const int HOME_TTL = 10800;
const int WATCH_TTL = 21600;
const int SEARCH_TTL = 600;
const int CATEGORY_TTL = 86400;
const string CACHE_DIR = 'data/pagecache';
}
타입이 지정된 상수는 열거형을 잘 보완하며, 실수로 인한 타입 불일치를 방지하고 버그의 전체 범주—예를 들어 지역 코드 오타, 잘못된 카테고리 ID, 잘못 구성된 캐시 정책—를 제거합니다. PHP 8.1 이상을 사용하고 있다면 이를 채택하지 않을 이유가 없습니다.