Un vistazo a las nuevas funcionalidades de PHP 8.2

Foto Alejandro

December 11, 2022 Compartir

php

Principales características, mejoras de rendimiento y cambios más importantes de PHP 8.2

¡PHP 8.2 está aquí! La nueva versión del lenguaje más popular para la web fue lanzada el 8 de diciembre de 2022. Esta actualización incluye una serie de mejoras y nuevas funcionalidades que estoy seguro que te encantarán. En este artículo te daré un breve resumen de todo lo que la nueva versión de PHP tiene para ofrecer.


Tabla de contenidos

  1. Clases de solo lectura
  2. Deprecado de propiedades dinámicas
  3. Nueva forma de generar valores aleatorios
  4. Nuevos tipos de datos: null, true y false
  5. Tipos DNF (Disjunctive Normal Form)
  6. Declaración de constantes en Traits

Clases de solo lectura RFC

Las propiedades de solo lectura fueron introducidas en PHP 8.1. Esta nueva característica se basa en ellas, pero añadiendo azúcar sintáctico que permite implementar una clase para que todas sus propiedades de la clase sean de solo lectura a la vez.

En lugar de escribir esto:

class Payment
{
    public function __construct(
        public readonly string $reference, 
        public readonly Amount $amount,
        public readonly Instrument $instrument,
    ) {}
}

Ahora podemos escribir eso:

readonly class Payment
{
    public function __construct(
        public string $reference, 
        public Amount $amount,
        public Instrument $instrument,
    ) {}
}

En esencia, hacer que una clase sea de solo lectura es exactamente igual que hacer que cada propiedad sea de solo lectura; sin embargo, es importante tener en cuenta que también evitará que se añadan propiedades dinámicas a una clase en tiempo de ejecución:

$payment = new Payment();

$payment->unknown = 'wrong';

Uncaught Error: Cannot create dynamic property Payment::$unknown

Por otro lado, debemos tener en cuenta que solo podemos extender desde clases de solo lectura si la clase hija también es de solo lectura.


Deprecado de propiedades dinámicas RFC

Este es un cambio que probablemente dolerá un poco a equipos y desarrolladores. Las propiedades dinámicas quedan obsoletas a partir PHP 8.2 y generarán una excepción ErrorException en PHP 9.0:

class Payment
{
    public string $reference;
}

// …

$post->amount = new Amount();

Uncaught Error: Cannot create dynamic property Payment::$amount

Ten en cuenta que las clases que implementen __get y __set seguirán funcionando con normalidad:

class Payment
{
    private array $properties = [];

    public function __set(string $code, mixed $value): void
    {
        $this->properties[$code] = $value;
    }
}

// …

$post->code = 'AS232WE3221';

Nueva forma de generar valores aleatorios RFC

PHP 8.2 agrega un nuevo generador de números aleatorios que soluciona muchos problemas con el anterior: es más eficiente, más seguro, más fácil de mantener y no depende del estado global, eliminando una variedad de errores difíciles de detectar al generar valores aleatorios con PHP.

Contamos con una nueva clase llamada Randomizer, que nos permite inyectarle un motor de aleatorización específico según nuestras necesidades. Por ejemplo, para diferenciar entre un entorno de producción y otro de pruebas:

$engine = $isProduction
    ? new Random\Engine\Secure()
    : new Random\Engine\Mt19937(1234);

$randomizer = new Random\Randomizer($engine);

$randomizer->shuffleString('awesome');

Nuevos tipos de datos: null, true y false RFC

PHP 8.2 agrega tres nuevos tipos de datos (o algo así) que podemos utilizar como tipos de retorno en nuestros métodos y en cualquier lugar donde las declaraciones de tipos estén actualmente permitidas.

class Nil
{
    public null $nil = null;

    public function foo(null $v): null
    {
        // ...

        return null;
    }
}
public function myFunction(): string|false
{
    // ...
}
class Falsy
{
    public false $nil = false;

    public function alwaysFalse(false $v): false
    {
        // ...
    }
}

Lo mismo ahora también se aplica a true y null.


Tipos DNF (Disjunctive Normal Form) RFC

De acuerdo a la documentación oficial:

La forma normal disyuntiva (DNF) es una forma estándar de organizar expresiones booleanas. Es decir, una forma de estructurar una expresión booleana en una serie OR's y AND's. Cuando se aplica a declaraciones de tipos, permite una forma estándar de escribir tipos combinados de Unión e Intersección que el analizador puede manejar.

Los tipos DNF nos permiten combinar tipos de unión e intersección, siguiendo una regla estricta: al combinar tipos de unión e intersección, los tipos de intersección deben agruparse con corchetes.

En la práctica, eso se ve así:

function generateSlug((HasTitle&HasId)|null $post): string 
{
    if ($post === null) {
        return '';
    }

    return 
        strtolower($post->getTitle()) 
        . $post->getId();
}

En este caso, (HasTitle&HasId)|null es el tipo DNF.

Es una buena adición, especialmente porque significa que ahora podemos tener tipos de intersección nullables, que es probablemente el caso de uso más importante para esta nueva característica.


Declaración de constantes en Traits RFC

Ya podemos declarar constantes en nuestros traits o rasgos:

trait Payable
{
    public const CONSTANT = 1;

    public function foo(): int
    {
        return self::CONSTANT;
    }
}

Te en cuenta que no podemos acceder a la constante a través del nombre del trait:

trait Payable
{
    public const CONSTANT = 1;

    public function foo(): int
    {
        return Payable::CONSTANT; // Error
    }
}

Payable::CONSTANT; // Error

Sin embargo podemos acceder a las constantes de un trait a través de las clases que lo usan:

class BillingDocument
{
    use Payable;
}

BillingDocument::CONSTANT; // 1

Aunque hemos mencionado algunas de las características más importantes de PHP 8.2 en este artículo, no hemos cubierto todas las novedades que se han implementado. Si quieres explorar el listado completo de cambios y mejoras, te recomiendo revisar las notas de lanzamiento de PHP 8.2. Allí encontrarás una descripción detallada de todas las nuevas funcionalidades.

En resumen, PHP ha implementado una serie de características y mejoras que pueden ser muy útiles para tu desarrollo profesional y hacer tu trabajo más eficiente y productivo. Espero ver cómo estas características se integrarán en la comunidad de PHP y cómo afectarán la forma en que construimos aplicaciones. Si eres un desarrollador de PHP o estás interesado en aprender este popular lenguaje de programación, espero que hayas encontrado este artículo útil y que te animes a explorar estas nuevas características.

Autor

Hola 👋, Soy Alejandro, un desarrollador de software que disfruta crear y mejorar herramientas que resuelvan problemas y hagan que la vida de las personas sea más sencilla, bella y cómoda. Algunas veces escribo sobre las cosas que he aprendido con el tiempo. Espero que el contenido te sea de ayuda.