Douze branches case, autant d’instructions break à ne surtout pas oublier : la logique conditionnelle d’une méthode d’expédition personnalisée qui calcule un tarif selon la zone de destination finit souvent par ressembler à un bloc switch difficile à relire d’un coup d’œil. PHP 8.0 introduit l’expression match, une alternative plus concise et surtout plus sûre, qui élimine une catégorie entière de bugs liés à l’oubli d’un break.
Ce billet montre le refactoring d’une méthode d’expédition personnalisée héritant de WC_Shipping_Method, du switch classique vers l’expression match, sans entrer dans la construction du plugin d’expédition lui-même.
Le point de départ : un switch qui grossit
Voici la logique typique d’une méthode calculate_shipping() qui applique un tarif selon une zone commerciale déterminée en amont :
public function calculer_tarif( string $zone ): float {
switch ( $zone ) {
case 'metropole':
$tarif = 4.90;
break;
case 'corse':
$tarif = 9.90;
break;
case 'outre-mer':
$tarif = 14.90;
break;
default:
$tarif = 19.90;
break;
}
return $tarif;
}
Chaque branche oubliant son break laisse le flux d’exécution continuer vers la branche suivante, un comportement hérité du C historique qui surprend encore régulièrement, y compris des développeurs expérimentés relisant du code écrit rapidement.
La même logique avec match

public function calculer_tarif( string $zone ): float {
return match ( $zone ) {
'metropole' => 4.90,
'corse' => 9.90,
'outre-mer' => 14.90,
default => 19.90,
};
}
L’expression match évalue chaque branche avec une comparaison stricte, équivalente à l’opérateur ===, contrairement au switch qui utilise une comparaison lâche pouvant produire des correspondances inattendues entre types différents. Aucune instruction break n’est nécessaire : une seule branche s’exécute, jamais de propagation possible vers la suivante.
Regrouper plusieurs valeurs sur une même branche
Pour des départements groupés sous une même tarification, match accepte une liste de valeurs séparées par une virgule sur une seule ligne :
return match ( $code_departement ) {
'2A', '2B' => 9.90,
'971', '972', '973' => 14.90,
default => 4.90,
};
Ce qui change vraiment côté fiabilité
- Une valeur qui ne correspond à aucune branche et pour laquelle
defaultest absent déclenche uneUnhandledMatchErrorexplicite, plutôt qu’un silence renvoyantnull - Le typage strict des comparaisons élimine les correspondances involontaires entre une chaîne numérique et un entier
- Le code devient une expression qui retourne directement une valeur, sans variable intermédiaire à initialiser puis retourner en fin de méthode
Le cas où match ne convient pas
Pour une logique de zone qui dépend de plusieurs conditions combinées, comme un poids ET une destination, match reste limité à une comparaison de valeur unique par branche : une structure conditionnelle classique, ou un tableau de règles évaluées séquentiellement, garde alors tout son intérêt plutôt que de forcer match dans un usage pour lequel il n’est pas prévu.
Sur nos méthodes d’expédition personnalisées, la règle appliquée est simple : dès qu’une branche de zone tarifaire se limite à une correspondance de valeur unique, match remplace systématiquement le switch, sans exception.
Un point de vigilance lors de la migration
La comparaison stricte de match peut révéler, au moment du refactoring, des cas jusque-là masqués par la comparaison lâche du switch d’origine. Une valeur de zone stockée comme entier quelque part dans le code, comparée à une chaîne dans les branches, provoquait auparavant une correspondance accidentelle qui fonctionnait par hasard ; avec match, cette même valeur tombe dans la branche default, ce qui oblige à corriger la source du type incohérent plutôt que de la laisser filer plus loin dans le calcul du tarif.
En résumé
Le passage de switch à match pour une logique tarifaire de méthode d’expédition n’est pas qu’une question d’esthétique de code : la comparaison stricte et l’absence de propagation entre branches suppriment une catégorie entière d’erreurs silencieuses qui se glissaient facilement dans un switch mal relu.