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:
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%):
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 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
- Reescribe
calificar()usando unmatchcon rangos definidos como constantes. - Usa
array_filtercon una arrow function para quedarte solo con los precios mayores de 20€. - Crea una función
restarEstricta(int $a, int $b): inty 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