PHP 8 introduce la nueva expresión match
. Una característica poderosa que a menudo será la mejor opción para usar el switch
. Entonces, ¿cuáles son exactamente las diferencias?
Empecemos por comparar los dos. Aquí hay un ejemplo de switch
clásico:
switch ($statusCode) {
case 200:
case 300:
$mensaje = null;
break;
case 400:
$mensaje = 'no encontrado';
break;
case 500:
$mensaje = 'error en el servidor';
break;
default:
$mensaje = 'código desconocido';
break;
}
Aquí está su equivalente usando match
:
$message = match ($statusCode) {
200, 300 => null,
400 => 'no encontrado',
500 => 'error en el servidor',
default => 'código desconocido',
};
En primer lugar, la expresión match
es significativamente más corta:
- no requiere una declaración de ruptura
- puede combinar diferentes brazos en uno usando una coma
- devuelve un valor, por lo que solo tiene que asignar valor una vez
Eso ya es bastante, ¡pero hay aún más!
Sin coerción de tipos
match
hará verificaciones estrictas de tipos en lugar de sueltas. Es como usar === en lugar de ==. La gente probablemente no estará de acuerdo si eso es algo bueno o no, pero ese es un tema en sí mismo.
Los valores desconocidos causan errores
$statusCode = '200';
$mensaje = match ($statusCode) {
200 => null,
default => 'código desconocido',
};
Si olvida verificar un valor, y cuando no hay un brazo predeterminado especificado, PHP lanzará una excepción UnhandledMatchError. De nuevo más rigor, pero evitará que los errores sutiles pasen desapercibidos.
$statusCode = 400;
$mensaje = match ($statusCode) {
200 => 'perfecto',
};
// UnhandledMatchError
Solo expresiones de una sola línea, por ahora
Al igual que los cierres breves, solo puedes escribir una expresión. Los bloques de expresión probablemente se agregarán en algún momento, pero aún no está claro cuándo exactamente.
Combinando condiciones
¿Ya notaste la falta de break? Esto también significa que la coincidencia no permite condiciones fallidas, como las dos líneas de casos combinadas en el primer ejemplo de cambio. Sin embargo, por otro lado, puede combinar condiciones en la misma línea, separadas por comas.
Por lo tanto, tiene la misma funcionalidad que el interruptor en este aspecto, pero con menos escritura y menos formas de equivocarse. Ganar-ganar!
$mensaje = match ($statusCode) {
200, 300, 301, 302 => 'expresiones combinadas',
};
Condiciones complejas y rendimiento
Durante la discusión de RFC, algunas personas sugirieron el siguiente patrón como argumento en contra de agregar la expresión de coincidencia:
$mensaje = [
$this->matchesRegex($line) => 'match A',
$this->matchesOtherRegex($line) => 'match B',
][$line] ?? 'no match';
Sin embargo, hay una gran advertencia: esta técnica ejecutará todas las funciones de expresiones regulares primero, lo que disminuirá el rendimiento. Un buen argumento para el partido.
Lanzar excepciones
Finalmente, debido a las expresiones de lanzamiento en PHP 8, también es posible lanzar directamente desde un brazo, si lo desea.
$mensaje = match ($statusCode) {
200 => null,
500 => throw new ServerError(),
default => 'código desconocido',
};
La coincidencia de patrones
Ok, hay una cosa más: coincidencia de patrones. Es una técnica utilizada en otros lenguajes de programación para permitir coincidencias más complejas que los valores simples. Piense en ello como expresiones regulares, pero para variables en lugar de texto.
La coincidencia de patrones no es compatible en este momento, porque es una función bastante compleja, pero Ilija Tovilo, el autor de RFC, la mencionó como una posible función futura. ¡Algo a tener en cuenta!
Entonces, ¿switch o match?
Si tuviera que resumir la expresión de coincidencia en una oración, diría que es la versión más estricta y moderna de su hermano pequeño interruptor.
Hay algunos casos donde el switch ofrecerá más flexibilidad, especialmente en bloques de código multilínea. Sin embargo, la rigurosidad del operador de coincidencia es atractiva, y la perspectiva de la coincidencia de patrones cambiaría las reglas del juego para PHP.