Ir al contenido principal
Volver a artículos

PHP 8.5 lanzado

Krodox Team February 10th, 2026 php

PHP 8.5 llegó el 20 de noviembre de 2025. Mientras que PHP 8.4 trataba sobre todo de eliminar código repetitivo alrededor de las propiedades, la 8.5 va de expresiones: encadenarlas, clonarlas y detectar las que olvidaste usar.

Características clave de PHP 8.5

1. El operador pipe

El cambio que más se nota. |> pasa el valor de su izquierda al callable de su derecha, de modo que una transformación se lee de arriba abajo en lugar de de dentro hacia fuera.

$slug = $title
    |> trim(...)
    |> (fn ($str) => str_replace(' ', '-', $str))
    |> (fn ($str) => str_replace('.', '', $str))
    |> strtolower(...);

La alternativa era anidar llamadas en orden inverso de lectura, o inventar una variable temporal por paso. Ambas son peores.

2. Clone with

clone ya puede sobrescribir propiedades mientras copia, lo que por fin hace práctico el patrón "wither" en clases readonly.

return clone($this, [
    'alpha' => $alpha,
]);

Antes de esto, un objeto inmutable con varias propiedades readonly obligaba a una llamada al constructor repitiendo todos los campos solo para cambiar uno. Quien haya escrito un objeto de valor reconocerá la cantidad de código que esto elimina.

3. Una extensión URI integrada

PHP ya analiza URLs correctamente, siguiendo RFC 3986 y WHATWG, en lugar de dejar que parse_url() lo aproxime.

use Uri\Rfc3986\Uri;

$uri = new Uri('https://php.net/releases/8.5/en.php');

var_dump($uri->getHost());
// string(7) "php.net"

Incluye normalización, que es justo lo que parse_url() nunca hizo y lo que causó en silencio bastantes fallos de seguridad al comparar URLs a mano.

4. El atributo #[\NoDiscard]

Marca una función cuyo valor de retorno no tiene sentido ignorar, y avisa cuando se ignora.

#[\NoDiscard]
function getPhpVersion(): string
{
    return 'PHP 8.5';
}

Apunta directamente a una clase real de error: métodos que devuelven un valor nuevo en lugar de mutar en el sitio, y que no hacen nada en silencio cuando se descarta su resultado. Las APIs inmutables —incluido el patrón clone with de arriba— son las más beneficiadas.

5. array_first() y array_last()

Dos funciones que siempre deberían haber existido, y que cierran el hueco que dejaron array_find() y compañía en la 8.4.

$lastEvent = array_last($events);

6. Handles compartidos persistentes en cURL

curl_share_init_persistent() permite reutilizar datos de DNS y de conexión entre peticiones en lugar de reconstruirlos cada vez.

$sh = curl_share_init_persistent([
    CURL_LOCK_DATA_DNS,
    CURL_LOCK_DATA_CONNECT,
]);

Para una aplicación que hace muchas llamadas salientes a los mismos hosts, esto elimina la repetición del DNS y del establecimiento TLS.

7. Cambios menores que conviene conocer

  • Los errores fatales ahora incluyen backtraces, lo que reduce drásticamente el trabajo de adivinación al diagnosticar en producción.
  • Closures y callables de primera clase en expresiones constantes, así que pueden aparecer en atributos, constantes y valores por defecto.
  • Los atributos pueden apuntar a constantes, y #[\Override] se aplica ahora a propiedades.
  • Las propiedades estáticas admiten visibilidad asimétrica, extendiendo la característica de la 8.4.
  • Closure::getCurrent() da a un closure una referencia a sí mismo, lo que simplifica la recursión.

Obsolescencias que conviene planificar

La 8.5 marca más obsolescencias que la 8.4, y aparecerán como avisos antes de convertirse en errores:

  • El operador de comillas invertidas como alias de shell_exec()
  • Nombres de cast no canónicos: (boolean), (integer), (double), (binary)
  • Sentencias case terminadas en punto y coma en lugar de dos puntos
  • null usado como índice de array
  • __sleep() y __wakeup() quedan en obsolescencia suave

Dos comportamientos pasan a emitir avisos en lugar de pasar en silencio: desestructurar un valor que no es array, y convertir un float a int perdiendo precisión. Ambos eran fuentes de corrupción silenciosa de datos, así que conviene leer esos avisos en vez de silenciarlos.

El ajuste INI disable_classes se ha eliminado por completo.

Por qué actualizar

  1. Transformaciones más legibles. El operador pipe cambia cómo se lee el código que da forma a los datos.
  2. Inmutabilidad práctica. clone with elimina la principal objeción ergonómica a los objetos de valor readonly.
  3. Menos dependencias. Un analizador de URI correcto en el núcleo sustituye una necesidad habitual de terceros.
  4. Mejores señales de fallo. Los backtraces en errores fatales y #[\NoDiscard] sacan los problemas a la luz antes.

Dónde encaja

Laravel 12 admite de PHP 8.2 a 8.5, así que la 8.5 ya es un objetivo soportado y no algo por lo que esperar. Este sitio corre 8.4, y la lista de obsolescencias de arriba es la razón por la que aún no hemos migrado: conviene auditarla antes de que los avisos se conviertan en errores.

Si todavía estás en 8.3 o anterior, PHP 8.4 es el salto más valioso. Los property hooks y la visibilidad asimétrica cambian cómo escribes clases; la 8.5 refina lo que ya tienes.