irynaDev15 May 2026 10:53

Native enums landed in PHP 8.1 and most examples show the basic definition. Here are patterns I use in production that are less obvious.

PHP
<?php
enum Status: string
{
case Active = 'active';
case Inactive = 'inactive';
case Banned = 'banned';
public function label(): string
{
return match($this) {
Status::Active => 'Active user',
Status::Inactive => 'Inactive user',
Status::Banned => 'Banned',
};
}
public function canLogin(): bool
{
return $this === Status::Active;
}
public function isModerated(): bool
{
return in_array($this, [Status::Inactive, Status::Banned]);
}
}
// Backed enum: get from string safely
$fromDb = Status::tryFrom('active');
var_dump($fromDb?->label()); // string(11) "Active user"
$invalid = Status::tryFrom('unknown');
var_dump($invalid); // NULL (no exception, unlike ::from())
// All cases as select options
$options = array_map(
fn(Status $s) => ['value' => $s->value, 'label' => $s->label()],
Status::cases()
);
print_r($options);
// Enum in match expression
$status = Status::Banned;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Adding methods to enums is the part most people skip. An enum with methods replaces a whole class of switch statements that would otherwise be scattered across the codebase.

Replies (2)
serhiit15 May 2026 11:22

Implementing interfaces on enums is another underused feature:

PHP
<?php
interface HasColor
{
public function color(): string;
}
enum Priority: int implements HasColor
{
case Low = 1;
case Medium = 2;
case High = 3;
public function color(): string
{
return match($this) {
Priority::Low => '#6c757d',
Priority::Medium => '#fd7e14',
Priority::High => '#dc3545',
};
}
}
function renderBadge(HasColor $item): string
{
return "color: {$item->color()}";
}
echo renderBadge(Priority::High) . "\n"; // color: #dc3545
echo renderBadge(Priority::Low) . "\n"; // color: #6c757d
// Sort by value
$cases = Priority::cases();
usort($cases, fn($a, $b) => $b->value <=> $a->value); // high to low
foreach ($cases as $p) {
echo $p->name . ": " . $p->value . "\n";
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0
johnsmith15 May 2026 13:44

One gotcha I ran into: you cannot use new on an enum, and you cannot add regular properties to them. If you need instance state alongside enum cases, you need a separate class. Trying to add public string $description as a property to an enum will produce a parse error.

The workaround people use is a method that returns the associated data from a hardcoded match, which you can see in the examples above. Not ideal for large datasets, but for a fixed set of states it is perfectly fine.

0
Write a reply
Markdown. ```php blocks are runnable.