switch compares loosely, falls through by default and is a statement rather than an expression, and all three of those have produced bugs in code that looked correct.
$label = match ($status) {
'paid', 'settled' => 'Complete',
'pending' => 'Awaiting payment',
default => 'Unknown',
};
// switch ('0' == 0) is true; match ('0' === 0) is not
// no break needed; no fallthrough possible
// and with no default and no arm matching:
// UnhandledMatchError, rather than silently doing nothing
The unhandled error is the most valuable of the three differences: a switch with no matching case and no default does nothing at all, which is how a new status value silently produces a blank label. Omitting default deliberately turns an unhandled case into an exception, which is what you want for anything enumerable. Arms take a single expression, so a branch needing three statements wants a method rather than a longer arm.