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
match
doit ê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 instructionsswitch
. -
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
// etc.
};
?>
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"
Version en cache
28/12/2024 02:13:37 Cette version de la page est en cache (à la date du 28/12/2024 02:13:37) afin d'accélérer le traitement. Vous pouvez activer le mode utilisateur dans le menu en haut pour afficher la dernère version de la page.Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-control-structures.match.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.