PHP 8.4 fue liberado el 21 de noviembre de 2024, vamos a ver algunas de las nuevas características que nos ofrecerá esta nueva versión de PHP.
PHP 8.4 marca un paso importante en la evolución del lenguaje, trayendo consigo una serie de características que mejoran tanto la productividad como el rendimiento. Entre las novedades más destacadas se encuentran los hooks para propiedades (property hooks), la visibilidad asimétrica (asymmetric visibility), una API DOM mejorada con soporte para HTML5, optimizaciones significativas de rendimiento y una limpieza general que refina el ecosistema. En esta entrada, exploraremos todo lo que PHP 8.4 tiene para ofrecer y cómo estas mejoras pueden beneficiar tus proyectos.
Hooks para Propiedades
Los property hooks son una novedad en PHP 8.4 e introducen un enfoque nativo y robusto para trabajar con propiedades calculadas. Ahora, podemos definir getters y setters directamente en las propiedades de nuestras clases, eliminando la necesidad de métodos explícitos o docblocks que pueden volverse inconsistentes con el tiempo.
Esta característica permite:
Preprocesar o postprocesar valores de manera confiable sin recurrir a métodos auxiliares.
Mejor compatibilidad con IDEs y herramientas de análisis estático, lo que facilita la comprensión y el mantenimiento del código.
Un ejemplo práctico para ilustrarlo:
<?php
class Product
{
public function __construct(
public string $name,
public float $price,
) {}
}
class CartViewModel
{
public function __construct(
private array $products = [],
) {}
public float $totalPrice {
get {
return array_reduce(
$this->products,
fn ($carry, Product $product) => $carry + $product->price,
0
);
}
}
public Product $product {
get => $this->product;
set (Product $product) {
$this->products[] = $product;
$this->product = $product;
}
}
}
$cart = new CartViewModel();
$cart->product = new Product(name: 'Laptop', price: 999.99);
$cart->product = new Product(name: 'Mouse', price: 49.99);
echo $cart->totalPrice; // 1049.98Con los property hooks podemos hacer ese tipo de cosas. Esta funcionalidad mejora la legibilidad y reduce la necesidad de código repetitivo, lo que se traduce en aplicaciones más eficientes, fáciles de leer y de mantener.
Visibilidad asimétrica
Con PHP 8.4, podemos definir propiedades con visibilidad asimétrica, lo que permite establecer diferentes niveles de acceso para lectura y escritura. Esto elimina la necesidad de métodos innecesarios, como setters y getters manuales, al mismo tiempo que protege las propiedades contra modificaciones no deseadas desde fuera de la clase.
Al utilizar la visibilidad asimétrica, puedes permitir que una propiedad sea leída públicamente mientras restringes su modificación exclusivamente al ámbito interno de la clase.
Ejemplo: Controlando el acceso a un contador de visitas
<?php
class PageStats
{
public private(set) int $visitCount = 0;
public function registerVisit(): void
{
$this->visitCount++;
}
}
$pageStats = new PageStats();
echo $pageStats->visitCount; // 0
$pageStats->registerVisit();
$pageStats->registerVisit();
echo $pageStats->visitCount; // 2
Con esta característica, PHP 8.4 ofrece un control más intuitivo y flexible sobre las propiedades de nuestras clases.
Atributo #[\Deprecated]
Con PHP 8.4, el nuevo atributo #[\Deprecated] permite marcar funciones, métodos y constantes de clases como obsoletos de manera nativa. Esto elimina la necesidad de usar comentarios docblock para indicar que una funcionalidad está en desuso, haciéndolo más claro y formal dentro del lenguaje.
El atributo también permite incluir información adicional, como un mensaje que explique la alternativa recomendada y la versión en la que se introdujo la deprecación.
Ejemplo: Migrando nombres de métodos
Supongamos que queremos cambiar el nombre de un método en una clase para hacerlo más claro, pero queremos mantener el método antiguo con un aviso de deprecación mientras los desarrolladores actualizan sus implementaciones.
<?php
class Logger
{
#[\Deprecated(
message: "Use Logger::logMessage() instead.",
since: "8.4"
)]
public function writeLog(string $message): void
{
$this->logMessage($message);
}
public function logMessage(string $message): void
{
echo "[Log]: " . $message . PHP_EOL;
}
}
$logger = new Logger();
$logger->writeLog('This is a deprecated method.');
$logger->logMessage('This is the new method.');new MyClass()->method() sin paréntesis
PHP 8.4 introduce una mejora de sintaxis que permite acceder directamente a métodos y propiedades de un objeto recién instanciado sin necesidad de envolver la expresión new entre paréntesis. Esto simplifica el código, eliminando una fuente común de confusión y mejorando la legibilidad en situaciones donde necesitas llamar a métodos o acceder a propiedades inmediatamente después de crear un objeto.
Ejemplo: Creación y uso directo de un objeto
Antes de PHP 8.4, era necesario envolver el operador new en paréntesis para acceder directamente a un método o propiedad, ahora no:
<?php
class Greeting
{
public function hi(string $name): string
{
return "Hi, $name!";
}
}
// < php 8.4
echo (new Greeting('Alice'))->hi('Alice');
// >= php 8.4
echo new Greeting('Bob')->hi('Bob');Nuevas funciones array_*()
PHP 8.4 introduce cuatro nuevas funciones para trabajar con arrays: array_find(), array_find_key(), array_any() y array_all(). Estas funciones ofrecen una forma más declarativa y legible de realizar búsquedas y evaluaciones sobre arrays, simplificando tareas comunes.
1. array_find()
Busca y devuelve el primer valor que cumpla con una condición específica, o null si no se encuentra ningún valor.
Ejemplo: Encontrar el primer número par
<?php
$numbers = [1, 3, 5, 8, 10, 15];
// Buscar el primer número par
$firstEven = array_find($numbers, fn($value) => $value % 2 === 0);
echo $firstEven; // 82. array_find_key()
Busca y devuelve la clave del primer valor que cumpla con una condición específica, o null si no se encuentra ninguna clave.
Ejemplo: Encontrar la clave del primer número negativo
<?php
$numbers = [5, -3, 8, -1, 7];
// Buscar la clave del primer número negativo
$negativeKey = array_find_key($numbers, fn($value) => $value < 0);
echo $negativeKey; // 13. array_any()
Evalúa si algún valor en el array cumple con una condición. Devuelve true si al menos un valor cumple con la condición; de lo contrario, devuelve false.
Ejemplo: Verificar si hay números mayores que 50
<?php
$numbers = [10, 25, 47, 51, 8];
// Verificar si algún número es mayor que 50
$hasLargeNumbers = array_any($numbers, fn($value) => $value > 50);
var_dump($hasLargeNumbers); // bool(true)4. array_all()
Evalúa si todos los valores en el array cumplen con una condición. Devuelve true si todos los valores cumplen con la condición; de lo contrario, devuelve false.
Ejemplo: Verificar si todos los números son positivos
<?php
$numbers = [3, 7, 12, -4, 9];
// Verificar si todos los números son positivos
$allPositive = array_all($numbers, fn($value) => $value > 0);
var_dump($allPositive); // bool(false)Estas funciones mejoran notablemente la experiencia de trabajar con arrays en PHP, haciéndolo más declarativo y expresivo.
Nuevas clases de DOM con soporte para HTML5
PHP 8.4 introduce nuevas clases en la extensión DOM, como Dom\HTMLDocument, que proporcionan una manera más moderna, intuitiva y compatible con el estándar para trabajar con documentos HTML5. Estas nuevas clases no solo facilitan tareas como el web scraping o manipulación de documentos HTML, sino que también ofrecen una API más cercana a la que se usa en el navegador, haciendo que los desarrolladores se sientan en un entorno más familiar.
Antes de PHP 8.4: Sintaxis más compleja y menos moderna
Antes, el manejo de documentos HTML requería varias líneas de código adicionales para buscar elementos específicos y manipularlos.
<?php
$dom = new DOMDocument();
$dom->loadHTML(
<<<'HTML'
<main>
<article>PHP 8.4 is a feature-rich release!</article>
<article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>
</main>
HTML,
LIBXML_NOERROR,
);
// Uso de XPath para buscar elementos
$xpath = new DOMXPath($dom);
$node = $xpath->query(".//main/article[not(following-sibling::*)]")[0];
// Extracción manual de clases
$classes = explode(" ", $node->getAttribute('class'));
var_dump(in_array("featured", $classes)); // bool(true)Con PHP 8.4: Simplificación con Dom\HTMLDocument
Ahora podemos utilizar Dom\HTMLDocument para simplificar el análisis y la manipulación de documentos HTML, con soporte completo para selectores CSS y manejo directo de clases.
<?php
$dom = Dom\HTMLDocument::createFromString(
<<<HTML
<main>
<article>PHP 8.4 is a feature-rich release!</article>
<article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>
</main>
HTML,
LIBXML_NOERROR,
);
$node = $dom->querySelector('main > article:last-child');
var_dump($node->classList->contains("featured")); // bool(true)Ventajas del nuevo enfoque
Compatibilidad con estándares: Las nuevas clases de DOM son completamente compatibles con HTML5, reduciendo problemas relacionados con estructuras modernas de documentos.
Selectores CSS: Ya no es necesario usar XPath para localizar nodos; ahora puedes usar selectores CSS, que son más familiares y legibles.
Manejo de clases mejorado: Con propiedades como
classList, puedes trabajar directamente con las clases de un elemento, eliminando la necesidad de parsear manualmente el atributoclass.Simplificación del código: Reduce significativamente la cantidad de líneas necesarias para lograr las mismas tareas.
Hasta aquí esta entrada revisando algunas de las más poderosas novedades de PHP 8.4, espero que te haya resultado útil, si quieres seguir conociendo todas las novedades de PHP 8 no te pierdas la ruta de PHP 8.