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
| Novedad | Descripcion |
|---|---|
| Property Hooks | Getters/setters declarativos en propiedades |
| Asymmetric Visibility | Lectura publica, escritura privada |
| new en inicializadores | new ClassName() en valores por defecto |
| array_find/any/all | Nuevas funciones de array funcional |
| HTML5 DOM | Parser nativo compatible con HTML5 |
| Lazy Objects | Inicializacion 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.