PHP 8.4 llegó en noviembre de 2024 con mejoras significativas al lenguaje. Es la versión más relevante desde PHP 8.0, que introdujo el JIT. Si ya conoces PHP 8.2 o 8.3, en este artículo encontrarás todas las novedades de PHP 8.4 explicadas con ejemplos prácticos y código real. Además de las nuevas características, veremos su compatibilidad con Symfony y Laravel y las mejoras de rendimiento.

Property Hooks — La novedad más importante

Los property hooks permiten definir lógica get/set directamente en las propiedades de una clase, eliminando la necesidad de getters y setters en muchos casos.

class Usuario {
    public string $nombreCompleto {
        get {
            return "$this->nombre $this->apellido";
        }
        set {
            [$this->nombre, $this->apellido] = explode(" ", $value, 2);
        }
    }

    public function __construct(
        private string $nombre,
        private string $apellido
    ) {}
}

$usuario = new Usuario("Maria", "Garcia");
echo $usuario->nombreCompleto;     // Maria Garcia

$usuario->nombreCompleto = "Carlos Lopez";
echo $usuario->nombre;  // Carlos

Asymmetric Visibility

Ahora puedes definir visibilidades diferentes para leer y escribir una propiedad desde fuera de la clase.

class Pedido {
    public private(set) int $id;
    public protected(set) string $estado = "pendiente";

    public function __construct(int $id) {
        $this->id = $id;
    }
}

$pedido = new Pedido(123);
echo $pedido->id;       // Lectura publica: OK
// $pedido->id = 999;   // Error: escritura privada desde fuera

new en inicializadores

PHP 8.4 permite usar new directamente en parámetros por defecto de funciones y atributos de propiedades.

class Logger {
    public function __construct(
        private Handler   $handler   = new FileHandler(),
        private Formatter $formatter = new JsonFormatter()
    ) {}
}

// Antes (PHP 8.3): habia que inicializar en el cuerpo del constructor

array_find(), array_any() y array_all()

$usuarios = [
    ["nombre" => "Ana",   "rol" => "admin"],
    ["nombre" => "Luis",  "rol" => "editor"],
    ["nombre" => "Marta", "rol" => "admin"],
];

// array_find: primer elemento que cumple la condicion
$admin = array_find($usuarios, fn($u) => $u["rol"] === "admin");
// ["nombre" => "Ana", "rol" => "admin"]

// array_find_key: clave del primer elemento
$clave = array_find_key($usuarios, fn($u) => $u["nombre"] === "Luis");
// 1

// array_any: true si alguno cumple
$hayAdmin = array_any($usuarios, fn($u) => $u["rol"] === "admin");  // true

// array_all: true si todos cumplen
$todosAdmin = array_all($usuarios, fn($u) => $u["rol"] === "admin"); // false

Soporte HTML5 con DOM mejorado

// Nueva clase Dom\HTMLDocument para parsing HTML5 nativo
$doc = Dom\HTMLDocument::createFromString(
    "<main><article><h1>Titulo</h1></article></main>"
);
$h1 = $doc->querySelector("h1");
echo $h1->textContent;  // Titulo

Lazy Objects — Inicializacion perezosa

class ConexionDB {
    public function __construct(
        private string $dsn,
        private string $usuario
    ) {
        echo "Conectando a la BD...\n";
    }
}

$reflector = new ReflectionClass(ConexionDB::class);
$proxy = $reflector->newLazyProxy(function(ConexionDB $objeto) {
    return new ConexionDB("mysql:host=localhost", "root");
});

// La conexion no se establece hasta que se use el objeto por primera vez

Resumen de cambios en PHP 8.4

NovedadDescripcion
Property HooksGetters/setters declarativos en propiedades
Asymmetric VisibilityLectura publica, escritura privada
new en inicializadoresnew ClassName() en valores por defecto
array_find/any/allNuevas funciones de array funcional
HTML5 DOMParser nativo compatible con HTML5
Lazy ObjectsInicializacion perezosa de objetos

Preguntas frecuentes sobre PHP 8.4

¿Qué son los property hooks de PHP 8.4?

Los property hooks permiten definir lógica get y set directamente sobre una propiedad de clase sin necesidad de métodos getter y setter separados. Reducen el boilerplate en clases con propiedades controladas y hacen el código más legible. Son similares a los property de Python o C# y son la novedad más impactante de PHP 8.4.

¿PHP 8.4 es compatible con Symfony y Laravel?

Symfony añadió soporte oficial para PHP 8.4 desde Symfony 7.1 y Laravel lo soporta desde Laravel 11.x. Algunas dependencias de terceros pueden tardar en actualizarse. Se recomienda probar el proyecto completo en un entorno de desarrollo antes de migrar en producción, prestando atención a las deprecaciones marcadas en PHP 8.3.

¿PHP 8.4 es más rápido que versiones anteriores?

PHP 8.4 incluye mejoras en el compilador JIT, optimizaciones en el manejo de arrays y en el motor de expresiones regulares. Los lazy objects reducen el consumo de memoria al no inicializar objetos hasta que son necesarios. En benchmarks de aplicaciones web típicas, PHP 8.4 es entre un 5% y 15% más rápido que PHP 8.2 según el tipo de carga.

¿Qué es la Asymmetric Visibility en PHP 8.4?

La Asymmetric Visibility permite definir visibilidades distintas para leer y escribir una propiedad. Por ejemplo, public private(set) int $id hace que $id sea de lectura pública pero solo modificable dentro de la propia clase. Esto elimina la necesidad de patrones como propiedades privadas con getter público para implementar propiedades de solo lectura desde fuera.

Conclusión

PHP 8.4 es una evolución sólida que acerca el lenguaje a patrones modernos. Si usas Symfony, ya puedes aprovechar estas características en producción. Consulta también el artículo sobre novedades de PHP 8.2 y el tutorial de Enums en PHP.