match

(PHP 8)

L'expression match permet d'effectuer une évaluation basée sur le contrôle d'identité d'une valeur. De la même manière qu'une instruction switch, une expression match a une expression sujet qui est comparée à plusieurs alternatives. Contrairement à switch, elle s'évalue à une valeur, comme les expressions ternaires. Contrairement à switch, la comparaison est une vérification d'identité (===) plutôt qu'un contrôle d'égalité faible (==). Les expressions Match sont disponibles à partir de PHP 8.0.0.

Exemple #1 Structure d'une expression match

<?php
$return_value
= match (subject_expression) {
single_conditional_expression => return_expression,
conditional_expression1, conditional_expression2 => return_expression,
};
?>

Exemple #2 Utilisation de base des expressions match

<?php
$food
= 'cake';

$return_value = match ($food) {
'apple' => 'This food is an apple',
'bar' => 'This food is a bar',
'cake' => 'This food is a cake',
};

var_dump($return_value);
?>

L'exemple ci-dessus va afficher :

 string(19) "This food is a cake" 

Note: Le résultat d'une expression match n'a pas besoin d'être utilisé.

Note: Une expression matchdoit être terminée par un point-virgule ;.

L'expression match est similaire à une instruction switch mais présente quelques différences essentielles:

  • Une expression match compare les valeurs de manière stricte (===) et non de manière faible comme le fait l'instruction switch.
  • Une expression match renvoie une valeur.
  • Les expressions match ne passent pas aux cas suivants comme le font les les instructions switch.
  • Une expression match doit être exhaustive.

Comme les instructions switch, les expressions match sont exécutées bras par bras. Au début, aucun code n'est exécuté. Les expressions conditionnelles ne sont évaluées que si toutes les expressions conditionnelles précédentes ne correspondent pas à l'expression de l'objet. Seule l'expression de retour correspondant à l'expression conditionnelle correspondante sera évaluée. Par exemple :

<?php
$result
= match ($x) {
foo() => ...,
$this->bar() => ..., // $this->bar() n'est pas appelé si foo() === $x
$this->baz => beep(), // beep() n'est pas appelé sauf si $x === $this->baz

Les bras de l'expression de match peuvent contenir plusieurs expressions séparées par une virgule. Il s'agit d'un OU logique et d'une abréviation pour plusieurs bras qui utilisent la même expression comme résultat.

<?php
$result
= match ($x) {
// Ce bras
$a, $b, $c => 5,
// Est équivalent à ces trois bras :
$a => 5,
$b => 5,
$c => 5,
};
?>

Le motif default est un cas particulier. Ce motif correspond à tout ce qui n'a pas été recherché précédemment. Par exemple :

<?php
$expressionResult
= match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
default =>
baz(),
};
?>

Note: L'utilisation de plusieurs motifs par défaut entraînera une erreur E_FATAL_ERROR.

Une expression match doit être exhaustive. Si l'expression n'est traitée par aucun bras de match, une erreur UnhandledMatchError est lancée.

Exemple #3 Exemple d'une expression match non gérée

<?php
$condition
= 5;

try {
match (
$condition) {
1, 2 => foo(),
3, 4 => bar(),
};
} catch (
\UnhandledMatchError $e) {
var_dump($e);
}
?>

L'exemple ci-dessus va afficher :

 object(UnhandledMatchError)#1 (7) { ["message":protected]=> string(33) "Unhandled match value of type int" ["string":"Error":private]=> string(0) "" ["code":protected]=> int(0) ["file":protected]=> string(9) "/in/ICgGK" ["line":protected]=> int(6) ["trace":"Error":private]=> array(0) { } ["previous":"Error":private]=> NULL } 

Utilisation d'expressions match pour gérer les contrôles de non-identité

Il est possible d'utiliser une expression match pour traiter les cas conditionnels de non-identité en utilisant true comme expression sujet.

Exemple #4 Utilisation d'une expression match généralisée pour effectuer des branchements sur des plages d'entiers

<?php

$age
= 23;

$result = match (true) {
$age >= 65 => 'senior',
$age >= 25 => 'adult',
$age >= 18 => 'young adult',
default =>
'kid',
};

var_dump($result);
?>

L'exemple ci-dessus va afficher :

 string(11) "young adult" 

Exemple #5 Utilisation d'une expression match généralisée pour effectuer des branchements sur le contenu d'une chaîne de caractères

<?php

$text
= 'Bienvenue chez nous';

$result = match (true) {
str_contains($text, 'Welcome') || str_contains($text, 'Hello') => 'en',
str_contains($text, 'Bienvenue') || str_contains($text, 'Bonjour') => 'fr',
// ...
};

var_dump($result);
?>

L'exemple ci-dessus va afficher :

 string(2) "fr" 
To Top