Solo Laravel

Noticias, Tips, Tutoriales

Lo nuevo en PHP 8.4

PHP 8.4: novedades de la versión

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();