PHP8: Match Expressions

Switch statements in PHP are useful, yet clunky. Think of the new match expression in PHP 8 as an improved switch. It’s far more flexible than its counterpart.

Usage: Replace the switch statement with a match in PHP8, match expressions can also return a value. Let’s take a look at few example how to use match expressions feature.

Example: how to replace switch with match?

Switch

switch ($action) {
    case 'import-posts':
        $status = $this->importPosts();
        break;
    case 'update-posts':
    case 'sync-posts':
        $status = $this->updatePosts();
        break;
    default:
        throw new \Exception('Unsupported');
}

Let’s see how this can be replace by match expressions

Match

As we can see in following example code looks very simple, just few lines vs example above. Match expression can be assigned to the variable also as you can see in the following block.

$status = match($action) {
    'import-posts' => $this->importPosts(),
    'update-posts', 'sync-posts' =>  $this->updatePosts(),
    default => throw new \Exception('Unsupported'),
};

Match expressions can return a value, what does it mean? Let’s take a look at example below.

$gender = match(2) {
    1 => 'Male',
    2 => 'Female',
};

echo $gender; // "Female"

The return value of the expression used in each “arm” (similar to each case in switch blocks) is can be assigned to a variable.

Match expression MUST match a condition, In a match expression, there must be condition that matches the expression, or a default case to handle it. If there are no matches, match expression throws an \UnhandledMatchError exception.

Things to remember:

  • Multiple matching conditions allowed
  • Each matching case must only contain one expression
  • Implicit break: Sharing well-described below

default case

default arm will catch all expressions if none of the other conditions matched.

match vs switch

switch match
Requires PHP ^8.0 No Yes
Returns value No Yes
default condition support Yes Yes
Multiple conditions in single arm Yes Yes
Multiple expressions in code block Yes No
Implicit break No Yes
Falls-through without break Yes No
Throws an exception on no matches No Yes
Match against arbitrary expressions Yes Yes
Strict type-safe comparison No Yes
Author: Danyal
I'm a skilled programmer specializing in Vue.js/Nuxt.js for front-end development and PHP Laravel for back-end solutions. I have a strong focus on API design and development, complemented by experience in web server setup and maintenance. My versatile expertise ensures seamless creation and maintenance of web applications, covering everything from intuitive user interfaces to robust server-side functionality. Passionate about coding and driven by a lifelong learning mindset, I invite you to explore more at danyal.dk.