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
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
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
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
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
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
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
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
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
¿Has encontrado un error o tienes una sugerencia?
Escribenos