Modern PHP Features
Thème :
Junior
2 vues ·16/21 leçons

Les Patterns Avancés de l’Expression Match

L’expression match (PHP 8.0+) est un switch bien plus puissant. Découvrons les patterns d’utilisation avancés.

Match Retourne des Valeurs

<?php
$status = 'active';

$message = match($status) {
    'active' => "L'utilisateur est actuellement actif",
    'pending' => "En attente d'activation",
    'banned' => "L'utilisateur a été banni",
    default => 'Statut inconnu',
};

echo $message;

Plusieurs Valeurs Par Bras

<?php
$day = 'Samedi';

$type = match($day) {
    'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi' => 'Jour de semaine',
    'Samedi', 'Dimanche' => 'Week-end',
};

Match avec des Expressions

<?php
$age = 25;

$category = match(true) {
    $age < 13 => 'enfant',
    $age < 20 => 'adolescent',
    $age < 30 => 'jeune adulte',
    $age < 60 => 'adulte',
    default => 'senior',
};

Retourner des Valeurs Complexes

<?php
$action = 'create';

[$method, $template] = match($action) {
    'create' => ['POST', 'form.html'],
    'edit' => ['PUT', 'form.html'],
    'delete' => ['DELETE', 'confirm.html'],
    'view' => ['GET', 'show.html'],
    default => throw new InvalidArgumentException("Action inconnue : $action"),
};

Lancer une Exception dans un Match

<?php
function getStatusCode(string $status): int {
    return match($status) {
        'ok' => 200,
        'created' => 201,
        'not_found' => 404,
        'error' => 500,
        default => throw new ValueError("Statut invalide : $status"),
    };
}

Comparaison Match VS Switch

<?php
// Switch — comparaison lâche, "fall-through"
switch ($value) {
    case 0:
    case '0':    // Les deux correspondent à cause de la comparaison lâche !
        $result = 'zero';
        break;
    default:
        $result = 'autre';
}

// Match — comparaison stricte (===), pas de "fall-through"
$result = match($value) {
    0 => 'zéro entier',
    '0' => 'zéro chaîne',
    default => 'autre',
};

Match avec les Enums

<?php
enum Status {
    case Active;
    case Inactive;
    case Pending;
}

$status = Status::Active;

$color = match($status) {
    Status::Active => 'vert',
    Status::Inactive => 'gris',
    Status::Pending => 'jaune',
};

Exemple Concret

Constructeur de réponse HTTP avec expressions match imbriquées

<?php
declare(strict_types=1);

// Constructeur de réponse HTTP avec match
class ResponseBuilder {
    public static function fromStatusCode(int $code): array {
        return match(true) {
            $code >= 200 && $code < 300 => [
                'type' => 'success',
                'message' => match($code) {
                    200 => 'OK',
                    201 => 'Créé',
                    204 => 'Pas de Contenu',
                    default => 'Succès',
                },
            ],
            $code >= 400 && $code < 500 => [
                'type' => 'client_error',
                'message' => match($code) {
                    400 => 'Mauvaise Requête',
                    401 => 'Non Autorisé',
                    403 => 'Interdit',
                    404 => 'Introuvable',
                    422 => 'Erreur de Validation',
                    default => 'Erreur Client',
                },
            ],
            $code >= 500 => [
                'type' => 'server_error',
                'message' => match($code) {
                    500 => 'Erreur Interne du Serveur',
                    502 => 'Mauvaise Passerelle',
                    503 => 'Service Indisponible',
                    default => 'Erreur Serveur',
                },
            ],
            default => [
                'type' => 'unknown',
                'message' => 'Statut Inconnu',
            ],
        };
    }
}

print_r(ResponseBuilder::fromStatusCode(404));
// ['type' => 'client_error', 'message' => 'Introuvable']
?>

Les Grimoires


📘 Cette leçon fait partie du cours PHP 8.x Moderne : Les Dernières Fonctionnalités du Langage sur la plateforme d’apprentissage RostoDev.

Prêt à passer à la suite ?

Vous avez terminé cette leçon sur Les Patterns Avancés de l'Expression Match. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.