PHP 8.4 ha sido lanzado oficialmente, en seguida algunas de las novedades más interesantes
Property Hooks
PHP 8.4 presenta una de las características más importantes del lenguaje en la actualidad, el cual está inspirado en otros lenguajes modernos como C#, Kotlin, Swift.. etc.
Los property hooks permitirán al desarrollador definir una lógica para obtener y establecer su valor, directamente dentro de la propiedad, con lo cual no será necesario tener métodos getter / setter por separado, por ejemplo:
class User implements Named { private bool $isModified = false; public function __construct( private string $first, private string $last ) {} public string $fullName { // Sobreescribir la lógica de la acción "read" get => $this->first . " " . $this->last; // Sobreescribir la lógica de la acción "write" set { [$this->first, $this->last] = explode(' ', $value, 2); $this->isModified = true; } } }
Visibilidad Asimétrica
La visibilidad asimétrica, por otra parte, permitirá definir diferentes opciones para la visibilidad para la lectura y escritura de una propiedad, es decir, podrás definir que una propiedad sea accesible para todos pero restringir la escritura de esta misma en algunas partes específicas del código.
Con esto, se atienden algunas limitaciones que traían consigo las propiedades “readonly” que se presentaron anteriormente.
class Book { public function __construct( public private(set) string $title, public protected(set) string $author, protected private(set) int $pubYear, ) {} } class SpecialBook extends Book { public function update(string $author, int $year): void { $this->author = $author; // OK $this->pubYear = $year; // Fatal Error } } $b = new Book('How to PHP', 'Peter H. Peterson', 2024); echo $b->title; // How to PHP echo $b->author; // Peter H. Peterson echo $b->pubYear; // Fatal Error
MyClass()->method() sin paréntesis
Aunque el encadenamiento de métodos ya era posible en PHP, la instanciación y el acceso a miembros a través de encadenamiento tenía qué hacerse utilizando paréntesis extra para evitar un error fatal de PHP.
En PHP 8.4, será posible encadenar métodos al instanciar una clase, sin tener que agregar estos paréntesis, de la siguiente forma:
// Envolver entre paréntesis para acceder a los miembros de la clase // Requerido en <= PHP 8.3 $request = (new Request())->withMethod('GET')->withUri('/hello-world'); // PHP Parse error (<= PHP 8.3): syntax error, unexpected token "->" // Válido en PHP 8.4 $request = new Request()->withMethod('GET')->withUri('/hello-world');
Crear DateTime a partir de un timestamp de Unix
PHP 8.4 introduce el nuevo método createFromTimestamp()
, el cual podrá recibir un timestamp de Unix o timestamp con microsegundos.
$dt = DateTimeImmutable::createFromTimestamp(1718337072); $dt->format('Y-m-d'); // 2024-06-14 $dt = DateTimeImmutable::createFromTimestamp(1718337072.432); $dt->format('Y-m-d h:i:s.u'); // 2024-06-14 03:51:12.432000
Nuevas funciones de búsqueda en Array
Con PHP 8.4 llegan las funciones array_find()
, array_find_key()
, array_any()
, array_all()
.
Nuevas funciones para cadenas multi-byte
Aunque PHP contaba ya con funciones trim, ltrim, rtrim, ucfirst y lcfirst, en PHP 8.4 se han añadido estas mismas funciones con soporte para cadenas multi-byte:
- mb_trim()
- mb_ltrim()
- mb_rtrim()
- mb_ucfirst()
- mb_lcfirst()
Atributo #[\Deprectated]
El nuevo atributo #[\Deprectated]
proporciona al desarrollador la habilidad de marcar como deprecadas las funciones, métodos y constantes de clase:
class PhpVersion { #[\Deprecated( message: "use PhpVersion::getVersion() instead", since: "8.4", )] public function getPhpVersion(): string { return $this->getVersion(); } public function getVersion(): string { return '8.4'; } } $phpVersion = new PhpVersion(); // Deprecated: Method PhpVersion::getPhpVersion() is deprecated since 8.4, use PhpVersion::getVersion() instead echo $phpVersion->getPhpVersion();
- Ejemplos gracias a Laravel News
- Toda la información sobre el lanzamiento de PHP 8.4 en https://www.php.net/releases/8.4/en.php.