🐘 PHP 8.5: Pequeños cambios, grandes mejoras
Bueno porfin he acabado mi recopilación de algunos patrones de diseño que ya acabé un poco cansado y ahora vamos a hablar de otras cositas como que… ¡Ya está entre nosotros la versión 8.5 de PHP!. A diferencia de otras versiones que rompían todo, esta actualización se centra en hacernos la vida más agradable a los desarrolladores. Viene cargada de “Quality of Life improvements”, es decir, mejoras que hacen que escribir código sea menos tedioso y más limpio.
Aquí te resumo lo más interesante de forma muy simple.

🚀 El operador pipe |>
Si vienes del mundo de Linux o de lenguajes funcionales, esto te va a encantar. El operador Pipe (|>) nos permite encadenar funciones de una manera mucho más legible.
El Problema (antes)
Hasta ahora si querías aplicar varias funciones a un valor, acababas con un popurrí de paréntesis difícil de leer:
$resultado = strtolower(trim(htmlentities($input)));
Se puede apreciar un lindo follón bastante complicado de leer, y es un ejemplo bastante usual.
La solución (ahora)
Con el operador Pipe, pasamos el valor de una función a la siguiente, de izquierda a derecha (o de arriba a abajo), como si fuera una tubería:
$resultado = $input
|> htmlentities(...)
|> trim(...)
|> strtolower(...);
El ícono sale representado como
|>pero realmente es |>, que se convierte automáticamente y no deja ver los cáracteres reales.
Mucho más limpio, ¿verdad? El valor de la izquierda se pasa automáticamente como primer argumento a la función de la derecha.
🔍 array_first() y array_last()
¡Por fin! Después de mucho tiempo pidiéndolo, PHP incluye funciones nativas para obtener el primer y el último elemento de un array sin tener que hacer malabares con reset(), end() o array_key_first().
Antes
$frutas = ['manzana', 'pera', 'plátano'];
// Para sacar el primero...
$primera = reset($frutas); // Pero cuidado, esto mueve el puntero interno...
// O la forma segura pero fea:
$primera = $frutas[array_key_first($frutas)];
Ahora
$frutas = ['manzana', 'pera', 'plátano'];
$primera = array_first($frutas); // 'manzana'
$ultima = array_last($frutas); // 'plátano'
Simple y directo, como debe ser.
👯 Clonar con modificaciones (clone with)
Si trabajas con objetos inmutables (que no se pueden cambiar una vez creados), sabrás que clonarlos para cambiar solo una propiedad era un poco rollo.
Antes
Tenías que clonar el objeto y luego, de alguna manera mágica (o con métodos with...), cambiar la propiedad.
$coche = new Coche('Rojo', 'V8');
$cocheAzul = clone $coche;
$cocheAzul->color = 'Azul'; // Esto fallaba si la propiedad era readonly
Ahora
PHP 8.5 introduce una sintaxis preciosa para esto:
$coche = new Coche('Rojo', 'V8');
// Clona el coche y cambia SOLO el color en el nuevo objeto
$cocheAzul = clone $coche with {
color: 'Azul'
};
Esto es genial para mantener nuestros objetos seguros e inmutables pero fáciles de trabajar.
🌐 Nueva Extensión URI
PHP 8.5 introduce una extensión nativa para manejar URLs de forma robusta. Olvídate de los problemas con parse_url(). Esta nueva extensión cumple con los estándares RFC 3986 y WHATWG.
$uri = new Uri\Rfc3986\Uri('https://usuario:pass@ejemplo.com:8080/ruta?query=1#fragmento');
echo $uri->getHost(); // ejemplo.com
echo $uri->getPort(); // 8080
// Modificar la URL es súper sencillo e inmutable
$nuevaUri = $uri->withPath('/nueva-ruta');
Por fin se estandariza el trabajar con URLs.
🧠 Límite de Memoria Estricto (max_memory_limit)
¿Alguna vez has tenido un script que devora memoria y se salta los límites? Seguro que si, yo un montón. Ahora tenemos una directiva INI llamada max_memory_limit.
Esta directiva actúa como un techo duro. Incluso si un script intenta subir su propio límite con ini_set('memory_limit', '-1'), no podrá superar lo que diga max_memory_limit. Es ideal para proveedores de hosting o para asegurar la estabilidad de tu servidor.
O para ti, chapucillas, que siempre la acabas liando.
✨ Mejoras en Atributos
Los atributos siguen ganando poder. Ahora puedes usar:
#[Override]en propiedades: Para asegurar que estás sobrescribiendo una propiedad de una clase padre.#[Deprecated]en constantes y traits: Marca constantes o traits enteros como obsoletos para avisar a otros desarrolladores.
class MiClase {
#[Deprecated("Usa NUEVA_CONSTANTE en su lugar")]
public const VIEJA_CONSTANTE = 1;
}
⚠️ Atributo #[NoDiscard]
A veces creamos funciones que devuelven algo importante, y si el programador ignora ese resultado, es probable que esté cometiendo un error. Imagina una función que te devuelve un error si algo falla, pero no lanza una excepción. Si ignoras el resultado, no te vas a enterar del fallo.
Ahora puedes marcar tus funciones con #[NoDiscard]:
#[NoDiscard]
function conectarBaseDatos(): bool {
// ... lógica ...
return false; // Falló
}
// Si haces esto, PHP te avisará:
conectarBaseDatos(); // ⚠️ Warning: Unused return value
Es una forma de decirle al desarrollador: ¡Eh Pavo! Lo que te devuelvo es importante, no lo ignores, que te reviento.
🗑️ Depreciaciones y Eliminaciones
Como en toda limpieza, hay cosas que se van. Aquí lo más importante que debes revisar:
- Casteos antiguos:
(boolean),(integer),(double)y(binary)están depreciados. Usa(bool),(int),(float)y(string). - Operador Backtick (
`): Ese operador mágico para ejecutar comandos de shell (alias deshell_exec) está depreciado. Mejor usa las funciones explícitas. nullcomo índice de array: Usarnullpara acceder a un array o enarray_key_existsahora generará una advertencia de depreciación.
✅ Conclusión
PHP 8.5 no reinventa la rueda, pero la hace girar mucho más suave. El operador Pipe y las funciones de array son cosas que usaremos todos los días.
Pos EA nos vemos en los bares chavales! 🍻