Situación actual: PHP2Shell. Dos vulnerabilidades críticas de PHP (CVSS 9.2) permiten ejecutar código malicioso sin autenticación. Parches desde el 21/10/2026.Qué hacer ahora →

PHP 8.0 a 8.5: las novedades más importantes

De match y JIT en PHP 8.0 al operador pipe y la extensión URI en PHP 8.5: las novedades de cada versión, los obstáculos al actualizar y lo que aportan a la seguridad.

Actualizado 5 min de lecturaConocimiento de PHP

En resumen: PHP 8.0 (noviembre de 2020) trajo argumentos con nombre, atributos, tipos de unión, match, el operador nullsafe y un compilador JIT. Después siguieron cada año: 8.1 con enums y fibers, 8.2 con clases readonly, 8.3 con constantes de clase tipadas, 8.4 con property hooks y 8.5 con el operador pipe y la extensión URI. Cada versión declara además obsoletas cosas antiguas. Por eso, al actualizar cuentan las pruebas y, para la seguridad, cuenta sobre todo operar una rama con soporte y con el parche al día.

Las novedades de PHP 8 de un vistazo

La tabla resume los puntos clave de las páginas de versiones de php.net. Fechas de primera publicación según php.net.

Versión Publicada Novedades principales Selección de funciones obsoletas y cambios incompatibles
8.0 26/11/2020 argumentos con nombre, atributos, Constructor Property Promotion, tipos de unión, match, ?->, JIT 0 == 'foobar' es ahora false, errores de tipo en lugar de advertencias
8.1 25/11/2021 enums, propiedades readonly, First-Class Callables strlen(...), new en inicializadores, tipos de intersección, never, fibers –
8.2 08/12/2022 clases readonly, tipos DNF, null/false/true como tipos, extensión Random, constantes en traits, #[\SensitiveParameter] propiedades dinámicas declaradas obsoletas
8.3 23/11/2023 constantes de clase tipadas, #[\Override], json_validate(), mb_str_pad(), php -l para varios archivos –
8.4 21/11/2024 property hooks, visibilidad asimétrica, #[\Deprecated], nueva API DOM con HTML5, BcMath\Number, array_find(), lazy objects parámetros nullable implícitos declarados obsoletos; IMAP, OCI8, PDO_OCI, pspell pasan a PECL
8.5 20/11/2025 operador pipe, extensión URI, Clone With, #[\NoDiscard], array_first()/array_last() operador de comillas invertidas declarado obsoleto, disable_classes eliminado

PHP 8.0 y 8.1: el gran salto

PHP 8.0 hizo el lenguaje notablemente más estricto y expresivo. Según la página de la versión, las funciones internas lanzan ahora de forma sistemática TypeError o ValueError en lugar de emitir solo advertencias. Las comparaciones entre números y cadenas de caracteres siguen reglas más limpias.

<?php
// PHP 8.0: match compara de forma estricta y no necesita break
$status = 404;
echo match (true) {
    $status >= 500 => 'Serverfehler',
    $status >= 400 => 'Anfragefehler',
    default        => 'in Ordnung',
};

// PHP 8.0: operador nullsafe
$land = $bestellung?->kunde?->adresse?->land;

PHP 8.1 trajo los enums, es decir, tipos de enumeración con valores fijos, y las propiedades readonly, que solo pueden fijarse una vez:

<?php
enum Rolle: string {
    case Leser = 'leser';
    case Redakteur = 'redakteur';
    case Admin = 'admin';
}

final class Benutzer {
    public function __construct(
        public readonly string $name,
        public readonly Rolle $rolle,
    ) {}
}

$b = new Benutzer('Erika', Rolle::from('redakteur'));

Rolle::from() lanza un error ante valores desconocidos. Eso evita que cadenas arbitrarias de formularios se cuelen como rol. Quien necesite un valor vacío en lugar de un error usa Rolle::tryFrom(), que devuelve null ante valores desconocidos.

También son novedad de 8.1 los fibers, una base para procesos concurrentes sobre la que se construyen bibliotecas de procesamiento asíncrono. En el funcionamiento normal de un sitio web apenas se nota, pero sí en los frameworks modernos y en las colas.

PHP 8.2 y 8.3: ordenar y asegurar

PHP 8.2 declaró obsoletas las propiedades dinámicas. Quien asigna a un objeto una propiedad no declarada recibe un aviso; con #[\AllowDynamicProperties] puede permitirse para clases concretas. Por eso los plugins antiguos suelen generar muchos mensajes en el registro.

Para la seguridad son interesantes la nueva extensión Random, cuyo randomizer por defecto utiliza, según la página de la versión, un generador de números aleatorios criptográficamente seguro, y el atributo #[\SensitiveParameter], que oculta valores como contraseñas en los stack traces. Más sobre valores aleatorios seguros en Números aleatorios y tokens seguros en PHP.

PHP 8.3 añadió constantes de clase tipadas, el atributo #[\Override] contra errores de escritura al sobrescribir métodos y json_validate(), que comprueba JSON sin decodificarlo por completo.

PHP 8.4 y 8.5: recursos modernos del lenguaje

PHP 8.4 introdujo los property hooks, es decir, lógica directamente en las propiedades, y la visibilidad asimétrica como public private(set). Se añadieron una nueva API DOM con compatibilidad con HTML5 y funciones como array_find(), array_any() y array_all(). Según la página de la versión, las extensiones IMAP, OCI8, PDO_OCI y pspell se movieron del núcleo a PECL. Las aplicaciones que usan, por ejemplo, IMAP necesitan entonces un paquete aparte.

PHP 8.5 trajo el operador pipe, que encadena llamadas de izquierda a derecha:

<?php
$slug = '  Neue Produkte 2026  '
    |> trim(...)
    |> strtolower(...)
    |> (fn(string $s): string => str_replace(' ', '-', $s));
// Resultado: "neue-produkte-2026"

También es novedad una extensión URI que descompone direcciones según la RFC 3986 y el estándar WHATWG URL. Esto es relevante para la seguridad, porque las URL analizadas de forma inconsistente son una causa conocida de comprobaciones eludidas. El operador de comillas invertidas, forma abreviada de shell_exec(), está declarado obsoleto y el ajuste disable_classes se ha eliminado. Quien lo utilizaba debería adaptar su refuerzo.

Novedades, actualizaciones y PHP2Shell

Las funciones nuevas del lenguaje no cierran vulnerabilidades del intérprete. Frente a PHP2Shell solo ayuda el parche al día de la rama correspondiente: 8.5.12, 8.4.27, 8.3.36 u 8.2.35. Para PHP 8.1 y 8.0 ya no hay actualizaciones oficiales. Quien se queda ahí debe actualizar, y en ello ayudan poco las novedades y mucho los cambios incompatibles.

Un camino de actualización seguro en cinco pasos:

  1. Fijar la versión de destino, acorde con los requisitos del sistema del fabricante y con el ciclo de versiones.
  2. Llevar las dependencias de Composer y los plugins a versiones compatibles.
  3. Comprobar el código con análisis estático y pruebas frente a la versión de destino.
  4. Probar en un entorno de pruebas con una copia de los datos de producción y analizar los registros en busca de funciones obsoletas.
  5. Cambiar, reiniciar todos los procesos de PHP y documentar el estado.

Los antecedentes sobre los tipos los ofrece El sistema de tipos de PHP.

¿Cómo ayuda PHP SOS en concreto?

  • Comprobar la compatibilidad: analizamos su código y sus extensiones en busca de cambios incompatibles con la versión de destino.
  • Realizar la actualización: con la migración a una versión de PHP con soporte llevamos las aplicaciones a una versión superior, con pruebas.
  • Adaptar el refuerzo: sustituimos ajustes eliminados como disable_classes por alternativas eficaces.
  • Mantener el parche al día: tras la actualización mantenemos la rama al día y demostramos cada reinicio.

Preguntas frecuentes

¿Qué versión de PHP 8 debería usar hoy?

Para proyectos nuevos, PHP 8.4 u 8.5, porque son las que se mantienen más tiempo: 8.4 hasta finales de 2028 y 8.5 hasta finales de 2029. Lo decisivo es lo que admita su aplicación según los requisitos del sistema del fabricante. PHP 8.2 termina el 31 de diciembre de 2026.

¿Qué suele romperse más al pasar de PHP 7.4 a PHP 8?

A menudo son las comprobaciones de tipos más estrictas: en PHP 8 las funciones internas lanzan TypeError o ValueError en lugar de emitir solo advertencias. También llaman la atención las comparaciones modificadas entre números y cadenas de caracteres. El análisis estático y las pruebas descubren la mayor parte de antemano.

¿Hace el JIT que mi sitio web sea más rápido?

Casi nunca. Según la página de la versión PHP 8.0, el rendimiento de las aplicaciones web típicas está más o menos al nivel de PHP 7.4, mientras que las tareas que requieren mucho cálculo pueden beneficiarse claramente. Desde PHP 8.4 el JIT está desactivado por defecto.

¿Qué novedades ayudan a la seguridad?

Entre otras, la nueva extensión Random de PHP 8.2 con un valor por defecto criptográficamente seguro, el atributo SensitiveParameter contra las contraseñas en los stack traces, los enums y las propiedades readonly para datos más inequívocos y los errores de tipo más consecuentes desde PHP 8.0.

Fuentes

Contacto inmediato

Cada hora cuenta. Escríbanos ahora.

Describa brevemente el sistema, la versión de PHP y lo que ha observado. Nos pondremos en contacto, aclararemos la situación y trabajaremos en remoto hasta que el incidente quede cerrado y documentado.

Ayuda inmediata