switch and match

The switch statement

The switch statement compares one value against many case labels. When a label matches, execution starts there and continues downward until a break stops it. It fits decisions where one variable selects between many outcomes.

$role = "editor"; switch ($role) { case "admin": echo "full access"; break; case "editor": echo "can edit"; break; default: echo "read only"; }

Leaving out break is called fall-through: PHP keeps running into the next case. Use it only on purpose, with a comment that says so, because silent fall-through is a classic source of bugs.

The match expression

The match expression does the same job but returns a value, so you assign the result instead of echoing inside every arm. Arms use =>, accept comma-separated conditions, and never fall through.

Because it is an expression, match fits anywhere a value fits: on the right side of an assignment, inside a function call, or inside another expression.

$role = "editor"; $label = match ($role) { "admin" => "full access", "editor", "author" => "can edit", default => "read only", }; echo $label;

Strict comparison

The two constructs compare differently: switch uses loose == comparison while match uses strict === comparison of value plus type. The string "200" therefore matches the integer 200 in a switch, but not in a match.

$code = "200"; var_dump($code == 200); // true under loose rules $result = match ($code) { 200 => "integer two hundred", "200" => "string two hundred", default => "other", }; echo $result;

Default arms

A switch without a matching case and without default silently does nothing. A match without a matching arm and without default throws UnhandledMatchError instead. Always add a default arm unless the exception is exactly what you want.

$action = "preview"; $message = match ($action) { "save" => "saved", "delete" => "deleted", default => "unknown action", }; echo $message;

Next: Ternary, ?? and ?->

Article author: Arthur Isaev