Leccion 43 de 75 7 min de lectura

Match Expression

match es una expresion similar a switch pero mas potente: usa comparacion estricta, retorna valores directamente y lanza error si no hay coincidencia.

Sintaxis basica

A diferencia de switch, match es una expresion que retorna un valor:

PHP
<?php

declare(strict_types=1);

$nota = 8;

// match retorna un valor directamente
$calificacion = match (true) {
    $nota >= 9 => 'Sobresaliente',
    $nota >= 7 => 'Notable',
    $nota >= 5 => 'Aprobado',
    default => 'Suspenso',
};

echo $calificacion; // Notable

// Comparando valores directos
$dia = 3;

$nombreDia = match ($dia) {
    1 => 'Lunes',
    2 => 'Martes',
    3 => 'Miercoles',
    4 => 'Jueves',
    5 => 'Viernes',
    6, 7 => 'Fin de semana',
    default => 'Dia invalido',
};

echo $nombreDia; // Miercoles

Match vs Switch

PHP
<?php

declare(strict_types=1);

$codigo = 200;

// Con switch: verboso, necesita break
switch ($codigo) {
    case 200:
    case 201:
        $mensaje = 'Exito';
        break;
    case 400:
        $mensaje = 'Error cliente';
        break;
    case 500:
        $mensaje = 'Error servidor';
        break;
    default:
        $mensaje = 'Desconocido';
}

// Con match: conciso, sin break
$mensaje = match ($codigo) {
    200, 201 => 'Exito',
    400 => 'Error cliente',
    500 => 'Error servidor',
    default => 'Desconocido',
};

Comparacion estricta

match usa === (comparacion estricta), evitando bugs sutiles de switch:

PHP
<?php

declare(strict_types=1);

$valor = '0';

// switch usa == (comparacion debil)
switch ($valor) {
    case 0:
        echo 'Cero'; // Se ejecuta! ('0' == 0 es true)
        break;
}

// match usa === (comparacion estricta)
$resultado = match ($valor) {
    0 => 'Numero cero',
    '0' => 'String cero',  // Este se ejecuta
    default => 'Otro',
};

echo $resultado; // String cero

Error si no hay coincidencia

Si no hay default y ninguna rama coincide, match lanza UnhandledMatchError:

PHP
<?php

declare(strict_types=1);

$color = 'amarillo';

// Esto lanza UnhandledMatchError
$hex = match ($color) {
    'rojo' => '#FF0000',
    'verde' => '#00FF00',
    'azul' => '#0000FF',
    // No hay default ni 'amarillo'
};

// Solucion: agregar default
$hex = match ($color) {
    'rojo' => '#FF0000',
    'verde' => '#00FF00',
    'azul' => '#0000FF',
    default => '#000000',
};

Match con expresiones

Las ramas pueden contener expresiones complejas:

PHP
<?php

declare(strict_types=1);

$edad = 25;

$categoria = match (true) {
    $edad < 13 => 'Nino',
    $edad < 18 => 'Adolescente',
    $edad < 65 => 'Adulto',
    default => 'Senior',
};

echo $categoria; // Adulto

// Con llamadas a funciones
$texto = '  hola mundo  ';

$procesado = match (true) {
    str_starts_with($texto, ' ') => trim($texto),
    strlen($texto) > 20 => substr($texto, 0, 20) . '...',
    default => $texto,
};

echo $procesado; // 'hola mundo'

Match con Enums

PHP
<?php

declare(strict_types=1);

enum Estado: string
{
    case Pendiente = 'pending';
    case Pagado = 'paid';
    case Enviado = 'shipped';
    case Entregado = 'delivered';
}

function getIcono(Estado $estado): string
{
    return match ($estado) {
        Estado::Pendiente => '⏳',
        Estado::Pagado => '💰',
        Estado::Enviado => '📦',
        Estado::Entregado => '✅',
    };
}

echo getIcono(Estado::Enviado); // 📦

Ejercicios

Ejercicio 1: Convertir codigo HTTP

Crea una funcion que reciba un codigo HTTP y retorne su categoria usando match: 2xx = 'success', 3xx = 'redirect', 4xx = 'client_error', 5xx = 'server_error'.

Ver solucion
PHP
<?php

declare(strict_types=1);

function categoriaHttp(int $codigo): string
{
    return match (true) {
        $codigo >= 200 && $codigo < 300 => 'success',
        $codigo >= 300 && $codigo < 400 => 'redirect',
        $codigo >= 400 && $codigo < 500 => 'client_error',
        $codigo >= 500 && $codigo < 600 => 'server_error',
        default => 'unknown',
    };
}

echo categoriaHttp(200); // success
echo categoriaHttp(404); // client_error
echo categoriaHttp(500); // server_error

Ejercicio 2: Calcular precio con descuento

Crea una funcion que reciba un tipo de cliente (normal, premium, vip) y retorne el porcentaje de descuento usando match.

Ver solucion
PHP
<?php

declare(strict_types=1);

function descuento(string $tipoCliente): int
{
    return match ($tipoCliente) {
        'normal' => 0,
        'premium' => 10,
        'vip' => 25,
        default => 0,
    };
}

function precioFinal(float $precio, string $tipoCliente): float
{
    $desc = descuento($tipoCliente);
    return $precio * (1 - $desc / 100);
}

echo precioFinal(100, 'vip'); // 75

¿Te está gustando el curso?

Cursos premium con proyectos reales y soporte.

Descubrir cursos premium