PHP Moderno: match, Arrow Functions y Tipado Estricto

Tres características de PHP 8 que hacen el código más corto y más seguro

🔀 1. Expresión match()

Resultado:

calificar(7.5)
Notable

Prueba una nota

function calificar(float $nota): string {
    return match(true) {
        $nota >= 9 => 'Sobresaliente',
        $nota >= 7 => 'Notable',
        $nota >= 5 => 'Bien',
        $nota >= 4 => 'Suficiente',
        default    => 'Insuficiente',
    };
}
💡 match vs switch

match compara con === (sin conversión de tipos), no necesita break, y es una expresión: devuelve un valor directamente. Con match(true) puedes evaluar condiciones en lugar de solo valores exactos.

➡️ 2. Arrow Functions (fn)

Precios con IVA (21%):

10 € + IVA
12.1 €
25.5 € + IVA
30.86 €
99.9 € + IVA
120.88 €

Introduce varios precios

$precios = [10, 25.5, 99.9];
$preciosConIva = array_map(fn($p) => round($p * 1.21, 2), $precios);
💡 fn vs function()

fn($p) => round($p * 1.21, 2) es equivalente a function($p) use ($iva) { return round($p * $iva, 2); }, pero captura automáticamente las variables del entorno (aquí no hace falta ni use) y es de una sola expresión.

🧩 3. Tipado Estricto (declare(strict_types=1))

Resultado de sumarEstricta():

Prueba dos valores en el formulario →

Prueba la función tipada

declare(strict_types=1);

function sumarEstricta(int $a, int $b): int {
    return $a + $b;
}

sumarEstricta(5, 3);    // 8, correctosumarEstricta(5.5, 3);  // TypeError: 5.5 no es un int exacto
💡 ¿Por qué activar strict_types?

Sin declare(strict_types=1), PHP convierte automáticamente los tipos ("5.5" pasaría a truncarse a 5). Con tipado estricto, un valor que no encaja exactamente con el tipo declarado lanza un TypeError, ayudándote a detectar bugs antes.

🎯 Conceptos Clave

match()

  • Comparación estricta (===)
  • Es una expresión, devuelve un valor

Arrow functions

  • Sintaxis corta: fn($x) => ...
  • Capturan variables externas automáticamente

strict_types

  • Se declara al inicio del archivo
  • Evita conversiones de tipo silenciosas

💪 Ejercicio Práctico

Practica lo aprendido

  1. Reescribe calificar() usando un match con rangos definidos como constantes.
  2. Usa array_filter con una arrow function para quedarte solo con los precios mayores de 20€.
  3. Crea una función restarEstricta(int $a, int $b): int y prueba qué pasa si le pasas un array.

Solución 2

$carosSolo = array_filter($precios, fn($p) => $p > 20);

Solución 3

function restarEstricta(int $a, int $b): int {
    return $a - $b;
}
restarEstricta([1,2], 3); // TypeError: Argument #1 ($a) must be of type int, array given