Menu

Expression match en PHP : match ou switch, match(true)

match ($x) { 1, 2 => 'low', default => 'other' } compare une valeur avec le === strict, renvoie le résultat de la première branche qui correspond et lève une UnhandledMatchError quand rien ne correspond. match ou switch, match(true) et match avec les enums.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

match ($value) { ... } compare une valeur à une liste de branches avec le === strict et renvoie le résultat de la première branche qui correspond. Plusieurs valeurs peuvent partager une branche, default attrape le reste, et si rien ne correspond PHP lève une UnhandledMatchError.

Remarquez le point-virgule après l'accolade fermante : match est une expression, comme 1 + 2, donc l'ensemble forme une seule instruction d'affectation. Chaque branche s'écrit values => result, séparée des autres par une virgule, et une virgule finale après la dernière branche est permise.

Plusieurs valeurs dans une branche

Listez les valeurs séparées par des virgules. La branche correspond si le sujet est identique (===) à l'une d'elles.

Renvoyer directement match depuis une fonction, comme ici, est la façon la plus courante de l'utiliser.

match ou switch

La même correspondance écrite des deux façons, avec une entrée qui montre la plus grande différence : la comparaison. switch utilise ==, donc la chaîne "1" correspond à case 1. match utilise ===, donc non.

matchswitch
Comparaisonstricte ===souple ==
Résultatrenvoie une valeurinstruction, ne renvoie rien
Passage à la branche suivantejamaisoui, jusqu'au break
Plusieurs valeurs1, 2 =>empilées case 1: case 2:
Aucune correspondancelève UnhandledMatchErrorne fait rien
Corps d'une brancheune expressionautant d'instructions que voulu

Utilisez match quand vous transformez une valeur en une autre. Gardez switch quand une branche a besoin de plusieurs instructions ou quand le passage au cas suivant est le but ; la page switch montre les deux cas.

UnhandledMatchError : quand aucune branche ne correspond

Sans branche default, une valeur qui ne correspond à rien est une erreur, pas un null silencieux. C'est voulu : un nouveau code de statut ou une faute de frappe échoue bruyamment au lieu de passer inaperçu.

PHP s'arrête avec PHP Fatal error: Uncaught UnhandledMatchError: Unhandled match case of type string. Une configuration de développement (avec zend.exception_ignore_args désactivé) nomme plutôt la valeur : Unhandled match case 'XL'. Corrigez-le soit en ajoutant default => 'other', soit en interceptant l'erreur là où une valeur inconnue est attendue :

match(true) pour des plages et des conditions

match compare le sujet à chaque branche, donc si le sujet est true, chaque branche peut être une condition. La première condition qui vaut exactement true l'emporte.

Deux détails dans ce bloc. throw est une expression depuis PHP 8, il peut donc être le résultat d'une branche. Et comme la comparaison est stricte, chaque condition doit renvoyer un vrai booléen : une branche comme $name => ... ne correspond jamais à true, même quand $name est une chaîne non vide. Seule la branche qui correspond est évaluée, donc le throw ne s'exécute que pour un âge négatif.

match avec les enums

match et les enums vont bien ensemble : dans une méthode d'enum, match ($this) associe chaque case à une valeur. Voir les enums PHP pour les enums elles-mêmes.

Pas de default ici, volontairement. Si quelqu'un ajoute un cinquième case plus tard, appeler color() dessus lève une erreur au lieu de renvoyer une mauvaise couleur.

Plusieurs instructions dans une branche

Une branche contient une seule expression, donc 'save' => { ...; ... } n'est pas du PHP valide. Déplacez le travail dans une fonction et appelez-la depuis la branche. Les fonctions des branches qui ne correspondent pas ne sont jamais appelées.

Mettez $format à 'json' ou 'xml' et relancez.

Questions fréquentes

Quelle est la différence entre match et switch en PHP ?

match compare avec le === strict, renvoie une valeur, ne passe jamais à la branche suivante, accepte plusieurs valeurs séparées par des virgules par branche et lève une UnhandledMatchError quand aucune branche ne correspond. switch compare avec le == souple, est une instruction qui ne renvoie rien, passe au cas suivant sans break, et ne fait rien sans prévenir quand aucun case ne correspond.

Que se passe-t-il quand aucune branche ne correspond dans une expression match PHP ?

PHP lève une UnhandledMatchError. Ajoutez une branche default => ... pour traiter toutes les autres valeurs, ou interceptez l'erreur avec try { ... } catch (\UnhandledMatchError $e) { ... }.

Comment utiliser match avec des conditions comme « supérieur à » en PHP ?

Comparez avec true : match (true) { $age < 13 => 'child', $age < 18 => 'teen', default => 'adult' }. Chaque branche est une condition, et la première qui vaut exactement true l'emporte.

Une branche de match peut-elle exécuter plusieurs instructions en PHP ?

Non, chaque branche est une seule expression. Placez les instructions dans une fonction ou une méthode et appelez-la depuis la branche, par exemple 'export' => exportCsv($rows).

Quelle version de PHP a ajouté match ?

PHP 8.0. En PHP 7, la même logique demande une instruction switch ou une recherche dans un tableau comme $labels[$status] ?? 'Unknown'.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER