Match vs Switch
CategoriasPHPProgramación

Expresión Match en PHP 8 vs Switch

Expresión Match en PHP 8 vs Switch

Con la aparición de PHP 8, se han hecho bastantes avances significativos para que PHP se adapte a los tiempos modernos y siga siendo el rey indiscutible para el desarrollo web. Si, actualmente se pueden usar muchas combinaciones de tecnologías para crear una web: PHP y Node, javascript, ruby, python, etc. ¡Pero ese es otro tema!

A lo que vamos, es que PHP 8 introdujo un montón de novedades y muchas de ellas demandadas por la comunidad, para hacer el lenguaje más actual a estos nuevos tiempos. Aunque sí que es verdad, que en algunos casos PHP pecaba un poco de anticuado y por eso más de uno se atrevía a decir (aún hoy algún que otro lo sigue diciendo) que PHP estaba/está muerto. ¡Qué equivocados! Si, lo siento, soy un PHP lover 🥰

A lo que íbamos… PHP introdujo varios cambios y novedades y una de ellas fue la expresión match.

Veamos de que trata todo esto.

La expresión match, al igual que switch, nos permite realizar la evaluación de un valor, pero con algunas diferencias. Por eso, match no viene a ser un sustituto completo para switch, sino una alternativa más segura, expresiva y predecible.

Para entenderlo mejor miremos la siguiente estructura switch:

<?php

$estado = 404;

switch ($estado) {
    case 200:
        $mensaje = 'OK';
        break;
    case 404:
        $mensaje = 'No encontrado';
        break;
    default:
        $mensaje = 'Error desconocido';
}

echo "El estado es $estado: $mensaje";

En primer lugar, debemos saber que switch usa una comparación débil (==), y ya con eso podemos imaginarnos que en algunos escenarios puede que no nos resulte tan efectivo.

Por ejemplo:

<?php

switch ('0') {
    case 0:
        echo 'Coincide';
}

Esto siempre coincidirá, porque switch usa ==, no ===.

Por otro lado, siempre requiere el uso de break, de lo contrario caeríamos (valga la redundancia) en el llamado fall-through.

Y, por último, pero no menos importante, no devuelve un valor, al menos no directamente.

La alternativa: expresión match

Es la alternativa moderna en PHP 8 y aparece para resolver estas debilidades con un enfoque más funcional y estricto.

El ejemplo que pusimos al principio del switch, se puede resumir de la siguiente manera:

<?php

$estado = 404;

$mensaje = match ($estado) {
    200 => 'OK',
    404 => 'No encontrado',
    default => 'Error desconocido',
};

echo "El estado es $estado: $mensaje";

¿Qué diferencia no?

Aquí match:

  • Usa comparación estricta (===)
  • Devuelve un valor
  • No existe el fall-through
  • Obliga a contemplar todos los casos (o default)

Veamos algunos puntos.

Comparación estricta:

<?php
// comparación estricta
$valor = match ('0') {
    0 => 'Número',
    '0' => 'Cadena',
};

echo "El tipo de valor es: $valor";

Como vemos, al usar === internamente, no hay ambigüedad y cada tipo importa. Cosa que, con switch, esto sería imposible de distinguir.

Devuelve valores:

No hay ningún echo ni hace falta hacer una asignación de variables, sino que directamente nos devuelve un valor como resultado.

No existe el fall-through:

Porque sencillamente no existe el break.

En match, podemos decir que cada línea es independiente, por tanto, no se puede “caer” en otra por descuido.

¿Resultado? Es más seguro.

<?php
$rol = 'admin';

$tipo_acceso = match ($rol) {
    'admin' => 'Acceso total',
    'user'  => 'Acceso limitado',
};

echo "El tipo de acceso es: $tipo_acceso";

Match es una expresión y switch es una estructura: ¿Qué significa que algo sea una expresión o una estructura?

Lo que nos permite hacer cosas como estas:

<?php
$ext = 'pdf';

$tipo = match ($ext) {
    'jpg', 'png', 'gif' => 'imagen',
    'pdf', 'docx'       => 'documento',
    default             => 'otro',
};

echo "El tipo de archivo es: $tipo";

Podemos tener múltiples casos en una sola línea, cosa que con switch necesitaríamos varios case.

También podemos hacer esto otro:

<?php
$edad = 17;
$descuento = match (true) {
    $edad < 18 => 50,
    $edad >= 65 => 30,
    default => 0,
};
echo "El descuento es: $descuento%";

Pero ojo aquí, porque estamos usando match como una expresión condicional, es decir, estamos haciendo que evalué una condición y no es correcto, ya que match compara valores, no ejecuta lógica condicional.

¿Funcionar? Sí que funciona, pero no es el uso principal de match.

Por cierto, otra característica de match es que nos facilita el debugging al ofrecernos la excepción UnhandledMatchError. Dado que, si no hay coincidencia y no existe default, PHP lanzará dicha excepción.

Y ahora la pregunta del millón: ¿Cuándo usar uno u otro?

¿Cuándo usar switch y cuándo match?

Vamos a verlo con un ejemplo.

Imaginemos un sistema de pedidos con estos estados:

  • pendiente
  • pagado
  • enviado
  • cancelado

Pues bien, ¿Cuándo usamos match? 🤔

Cuando queremos decidir un valor.

Por ejemplo, en este caso nos vendría muy bien porque puede que queramos mostrar un mensaje según el estado.

<?php
$estado = 'pagado';

$mensaje = match ($estado) {
    'pendiente' => 'Estamos esperando el pago.',
    'pagado'    => 'El pedido ha sido pagado.',
    'enviado'   => 'El pedido está en camino.',
    'cancelado' => 'El pedido ha sido cancelado.',
    default     => 'Estado del pedido: desconocido',
};

echo $mensaje;

Ahora bien, ¿Cuándo usamos switch? 🤔

Cuando en lugar de decidir un valor, queremos ejecutar acciones.

Siguiendo con el ejemplo anterior, imagina que queremos realizar distintas operaciones según el estado:

<?php
$estado = 'pagado';

switch ($estado) {
    case 'pendiente':
        registrarEvento('Pedido pendiente');
        break;

    case 'pagado':
        descontarStock();
        generarFactura();
        enviarEmailConfirmacion();
        break;

    case 'enviado':
        actualizarTracking();
        break;

    case 'cancelado':
        restaurarStock();
        notificarCancelacion();
        break;

    default:
        registrarError('Estado del pedido: inválido');
}

Creo que queda bastante clara la diferencia ¿no?

En definitiva y resumiendo un poco:

Usamos match cuando:

  • Necesitamos asignar un valor
  • Queremos comparaciones estrictas
  • Buscamos código expresivo y moderno

Usamos switch cuando:

  • Necesitamos ejecutar bloques complejos de lógica
  • Queremos mantener compatibilidad con PHP < 8

Para finalizar, recordemos que match no viene a eliminar switch, pero sí a reemplazarlo en la mayoría de casos comunes. Es más seguro, más legible y está alineado con una forma moderna de escribir PHP.

¡Y hasta aquí! ¡Nos vemos! 😉

Sobre el autor

Comparte:

Este artículo está publicado bajo una licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional . Puedes compartirlo y adaptarlo, incluso con fines comerciales, siempre que cites al autor y mantengas esta misma licencia.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos
Responsable Óscar Martínez +info...
Finalidad Gestionar y moderar los comentarios +info...
Legitimación Consentimiento del interesado. +info...
Destinatarios No se cederán datos a terceros, salvo obligación legal +info...
Derechos Acceder, rectificar y cancelar los datos, así como otros derechos. +info...
Información adicional Puedes consultar la información adicional y detallada sobre protección de datos en nuestra página de política de privacidad.

Este sitio esta protegido por reCAPTCHA y laPolítica de privacidady losTérminos del servicio de Googlese aplican.

El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.