match is not switch, and the three differences

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.