sergey_web1 Oct 2025 19:42

match uses strict comparison (===) unlike switch. That change alone is enough to justify migrating switch statements but there are some behaviors that surprised me.

Replies (5)
alex_petrov1 Oct 2025 19:54

match throws UnhandledMatchError when no arm matches and there is no default. switch falls through to nothing silently.

PHP
<?php
$status = 'archived';
// switch: silently does nothing
switch ($status) {
case 'active': echo "active\n"; break;
case 'inactive': echo "inactive\n"; break;
// 'archived' falls through silently
}
// match: throws UnhandledMatchError
try {
$label = match($status) {
'active' => 'Active',
'inactive' => 'Inactive',
// no default, 'archived' is unhandled
};
} catch (\UnhandledMatchError $e) {
echo "Unhandled: {$status}\n";
}
// correct: add default
$label = match($status) {
'active' => 'Active',
'inactive' => 'Inactive',
default => ucfirst($status),
};
echo $label . "\n";
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0
nphp1 Oct 2025 21:49

Multiple conditions can share one arm: match($status) { “active”, “trial” => true, default => false }. Cleaner than repeating the same result for similar inputs.

0
ivan_morozov1 Oct 2025 23:03

Complex conditions in match arms: match(true) { $x > 10 => "high", $x > 0 => "medium", default => "low" }. This pattern replaces if-elseif chains with something more readable.

0
vova1 Oct 2025 23:28

Match arms are short-circuited: they are not all evaluated, just like if-else. This matters if arms have side effects (they should not, but legacy code sometimes has them in switch cases).

0
sergey_web2 Oct 2025 00:28

The no-fall-through behavior eliminates the common switch bug where you forget a break and execution falls into the next case. PHP developers have been burned by that for 25 years.

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