Ir al contenido principal
Volver a artículos

PHP 8.4 lanzado

Krodox Team November 21st, 2024 php

PHP 8.4 es la versión sobre la que corren hoy la mayoría de aplicaciones Laravel, y es la que por fin eliminó buena parte del código repetitivo de getters y setters en PHP. Estas son las características que importan en la práctica, con ejemplos.

Características clave de PHP 8.4

1. Property hooks

La incorporación principal. Las propiedades pueden interceptar sus propias lecturas y escrituras, sin que la clase necesite un par explícito de getter y setter.

class Locale
{
    public string $countryCode {
        set (string $countryCode) {
            $this->countryCode = strtoupper($countryCode);
        }
    }

    public string $combinedCode {
        get => sprintf('%s_%s', $this->languageCode, $this->countryCode);
        set (string $value) {
            [$this->languageCode, $this->countryCode] = explode('_', $value, 2);
        }
    }
}

La segunda propiedad se calcula al leer y se descompone al escribir, y quien la usa la trata simplemente como una propiedad. Gran parte del código de acceso existe únicamente para normalizar un valor de entrada; esto elimina casi todo.

2. Visibilidad asimétrica

El acceso de lectura y el de escritura ya pueden diferir, lo que expresa "público para leer, privado para modificar" sin escribir un getter.

class PhpVersion
{
    public private(set) string $version = '8.4';
}

Encaja de forma natural con los property hooks: los hooks controlan cómo se lee o escribe una propiedad, la visibilidad asimétrica controla quién puede hacerlo.

3. El atributo #[\Deprecated]

La obsolescencia deja de ser una convención de docblock y pasa a ser algo que el motor y tus herramientas entienden.

#[\Deprecated(
    message: 'use PhpVersion::getVersion() instead',
    since: '8.4',
)]
public function getVersion(): string
{
    // ...
}

4. Una API DOM moderna con soporte HTML5

La extensión DOM antigua es anterior a HTML5 y se notaba. PHP 8.4 añade una API nueva que analiza HTML5 correctamente y admite selectores CSS:

$dom = Dom\HTMLDocument::createFromString($html, LIBXML_NOERROR);

$node = $dom->querySelector('main > article:last-child');

var_dump($node->classList->contains('featured'));

Si alguna vez recurriste a una librería de scraping solo porque DOMDocument destrozaba el marcado moderno, esta es la solución.

5. Nuevas funciones de arrays

array_find(), array_find_key(), array_any() y array_all() cubren las cuatro cosas para las que todo el mundo escribía antes un foreach.

$featured = array_find($articles, fn ($article) => $article->featured);

if (array_any($articles, fn ($article) => $article->draft)) {
    // ...
}

6. API de objetos para BCMath

Los números de precisión arbitraria pasan a ser objetos reales con soporte de operadores, en lugar de cadenas pasadas por bcadd() y compañía.

use BcMath\Number;

$total = new Number('0.12345') + new Number('2');

7. Mejoras menores de conveniencia

El encadenamiento de métodos ya no exige envolver new entre paréntesis:

var_dump(new PhpVersion()->getVersion());

PDO también ganó subclases específicas por driver — Pdo\Sqlite, Pdo\MySql, Pdo\Pgsql — de modo que el comportamiento propio de cada driver se expresa en el sistema de tipos y no en la documentación.

Por qué actualizar

  1. Menos código repetitivo. Los property hooks y la visibilidad asimétrica eliminan toda una categoría de código que existía solo para proteger una propiedad.
  2. Mejores señales para las herramientas. #[\Deprecated] es legible por máquinas, así que el análisis estático puede actuar sobre él.
  3. Menos apaños. La nueva API DOM y las funciones de arrays sustituyen dependencias externas habituales.
  4. Margen de soporte. Mantenerse al día es lo que abarata las actualizaciones futuras.

Dónde encaja hoy

PHP 8.4 sigue siendo un objetivo sensato. Laravel 13 admite de PHP 8.3 a 8.5, así que 8.4 queda cómodamente en mitad del rango soportado, y es lo que corre este sitio.

Si planificas más a futuro, PHP 8.5 ya está disponible y añade el operador pipe, clone with y un analizador de URI integrado.

Como siempre, prueba antes de actualizar, no después.