Contenido

2026-05-13

PHP 8.5: novedades principales

Un repaso practico por las mejoras mas importantes de PHP 8.5: URI, pipe operator, clone with, NoDiscard y cambios de compatibilidad.

PHP 8.5: novedades principales

PHP 8.5 fue lanzado el 20 de noviembre de 2025 como una nueva version menor del lenguaje. No es un cambio tan disruptivo como saltar de PHP 7 a PHP 8, pero si trae varias mejoras que hacen el codigo mas expresivo, mas seguro y un poco mas comodo para trabajar en aplicaciones modernas.

La idea general de PHP 8.5 es clara: menos codigo accidental, mejores APIs nativas y mas herramientas para escribir programas que sean faciles de leer.

Nueva extension URI

Una de las novedades mas importantes es la extension URI. Hasta ahora, muchas aplicaciones dependian de parse_url(), librerias externas o validaciones propias para trabajar con URLs.

PHP 8.5 agrega una API nativa para parsear y manipular URIs siguiendo estandares como RFC 3986 y WHATWG URL.

use Uri\Rfc3986\Uri;

$uri = new Uri('https://example.com/blog/php-85?ref=home');

echo $uri->getHost(); // example.com
echo $uri->getPath(); // /blog/php-85

Esto es especialmente util para frameworks, routers, clientes HTTP y cualquier sistema que necesite tratar URLs con cuidado.

Pipe operator

El nuevo operador |> permite encadenar transformaciones de izquierda a derecha. Es una forma mas legible de escribir operaciones que antes terminaban como funciones anidadas.

Antes:

$slug = strtolower(
    str_replace(' ', '-',
        trim(' PHP 8.5 Novedades ')
    )
);

Ahora:

$slug = ' PHP 8.5 Novedades '
    |> trim(...)
    |> (fn ($value) => str_replace(' ', '-', $value))
    |> strtolower(...);

La ventaja no es solo estetica. El flujo se lee en el mismo orden en que ocurre: toma este valor, limpialo, transformalo y conviertelo.

Clone with

PHP 8.5 tambien mejora el patron de objetos inmutables con clone(). Ahora puedes clonar un objeto y cambiar algunas propiedades en el mismo paso.

readonly class Money
{
    public function __construct(
        public int $amount,
        public string $currency,
    ) {}

    public function withAmount(int $amount): self
    {
        return clone($this, [
            'amount' => $amount,
        ]);
    }
}

Esto hace mas natural trabajar con objetos readonly, value objects y modelos donde no quieres mutar el estado original.

Atributo NoDiscard

El atributo #[\NoDiscard] sirve para marcar funciones o metodos cuyo valor de retorno no deberia ignorarse.

#[\NoDiscard]
function createToken(): string
{
    return bin2hex(random_bytes(16));
}

createToken(); // advertencia: el resultado se ignoro

Esto ayuda en APIs donde llamar la funcion sin usar el resultado suele ser un bug. Es una mejora pequena, pero muy buena para librerias y codigo critico.

array_first y array_last

PHP 8.5 agrega array_first() y array_last(), dos funciones simples pero practicas para obtener el primer o ultimo valor de un array.

$events = ['login', 'purchase', 'logout'];

echo array_first($events); // login
echo array_last($events);  // logout

Si el array esta vacio, devuelven null. Hay que recordar que null tambien puede ser un valor valido dentro del array, asi que en algunos casos conviene validar la lista antes.

Mejoras en errores y debugging

Los errores fatales ahora pueden incluir stack trace. Eso vuelve mas facil entender que paso cuando ocurre un limite de memoria, un timeout u otro fallo fuerte.

Tambien llegan dos funciones nuevas:

get_error_handler();
get_exception_handler();

Antes podias registrar handlers con set_error_handler() y set_exception_handler(), pero no habia una forma directa de consultar el handler actual. Esto mejora integraciones con frameworks, librerias de observabilidad y sistemas de testing.

Mas cambios interesantes

PHP 8.5 trae varias mejoras adicionales:

  • Los atributos pueden aplicarse a constantes.
  • #[\Override] tambien puede usarse en propiedades.
  • #[\Deprecated] puede marcar traits y constantes.
  • Las propiedades estaticas soportan visibilidad asimetrica.
  • Closure::getCurrent() facilita recursion dentro de funciones anonimas.
  • setcookie() y setrawcookie() soportan la clave partitioned.
  • Intl agrega herramientas nuevas como IntlListFormatter.
  • CLI agrega php --ini=diff para ver configuraciones INI que difieren de los valores por defecto.

Deprecaciones que debes mirar

Como toda version menor moderna, PHP 8.5 tambien limpia algunas partes antiguas del lenguaje.

Algunas de las deprecaciones mas relevantes:

  • El operador de backticks como alias de shell_exec() queda deprecado.
  • Los casts no canonicos como (boolean), (integer), (double) y (binary) quedan deprecados.
  • __sleep() y __wakeup() quedan soft-deprecated frente a __serialize() y __unserialize().
  • Terminar case con punto y coma en vez de dos puntos queda deprecado.
  • Usar null como offset de array o en array_key_exists() queda deprecado.

Si mantienes proyectos antiguos, estas son las areas que conviene revisar antes de actualizar.

Conclusion

PHP 8.5 no cambia la forma completa de programar en PHP, pero si pule muchas zonas del lenguaje. La extension URI, el pipe operator y clone with son las mejoras mas visibles. #[\NoDiscard], los nuevos handlers y las funciones de arrays apuntan a algo igual de importante: hacer que el codigo comun sea mas claro y menos propenso a errores.

Para proyectos nuevos, PHP 8.5 es una base muy atractiva. Para proyectos existentes, la actualizacion deberia empezar por revisar deprecaciones, correr tests y prestar atencion a librerias que trabajen con URLs, serializacion, errores o procesos shell.

Fuentes

  • PHP.net: lanzamiento oficial de PHP 8.5. https://www.php.net/releases/8.5/index.php
  • PHP.Watch: resumen de cambios en PHP 8.5. https://php.watch/versions/8.5
  • PHP.Watch: calendario de releases PHP 8.5. https://php.watch/versions/8.5/releases