PHP 8.2 contiene mejoras de rendimiento, corrección de errores y funcionalidades nuevas. También expande algunas funcionalidades relacionadas con propiedades de solo lectura introducidas desde la versión 8.1.

Novedades

En PHP 8.2 se simplifica un poco el lenguaje al eliminar advertencias sobre valores de configuración INI, se descontinúa el soporte para propiedades de clase dinámicas y se corrige la lógica que maneja los arreglos y ciertos tipos de operaciones de transformación y/o codificación de cadenas.

Otros de los cambios más importantes incluidos en esta versión son los siguientes:

Clases de solo lectura

Siguiendo la tendencia iniciada en PHP 8.1 donde se añadió soporte para propiedades de clase de solo lectura, a partir de PHP 8.2, también es posible declarar clases enteras como clases de solo lectura. Al declarar una clase como de solo lectura, PHP declara todas las propiedades de dicha clase como propiedades de solo lectura, previene propiedades dinámicas en la clase e impone restricciones de tipo en todas las propiedades de la clase.

Al igual que haríamos con las propiedades de clase de solo lectura, para definir una clase como clase de solo lectura utilizamos la palabra clave readonly como prefijo al declarar la clase:

readonly class BlogData
{
  public string $title;
  public Status $status;

  public function __construct(string $title, Status $status)
  {
    $this->title = $title;
    $this->status = $status;
  }
}

Constantes en Traits

A partir de PHP 8.2 es posible definir constantes en clases de tipo trait

En PHP, un trait es una estructura de código similar a las clases, pero diseñada para agrupar funcionalidades de manera más granular y consistente que las anteriores. No se puede instanciar directamente un trait. Este es un añadido a la herencia tradicional y habilita composición horizontal de comportamientos, es decir, permite combinar miembros de clases sin necesidad de usar herencia directamente.

Las constantes de un trait se incluirán también en cualquier clase que use dicho trait.

// declaración de un rasgo (trait)
trait Rasgo
{
  public const CONSTANTE = 1;
}

// Uso del rasgo dentro de una clase
class Foo
{
  use Rasgo;
}

var_dump(Foo::CONSTANTE); // Devuelve el valor de la constante (1)
var_dump(Rasgo::CONSTANTE); // Arroja un error

No se puede acceder a una constante directamente a través del nombre del trait, pero si es posible acceder a ella a través de la clase que haga uso de dicho trait.

Mejoras en el sistema de tipos

null, false y true como tipos de dato independientes

Al incluir true y false como tipos de dato independientes en el sistema de validación, es posible declarar alguno de estos valores por separado en lugar de validar el tipo bool en funciones booleanas que siempre devuelven el mismo valor, lo que sería menos específico requiriendo comprobación adicional.

Aunque versiones anteriores de PHP ya incluían soporte parcial para el tipo null como tipo disponible en unión de datos, intentar utilizarlo fuera de la unión de tipos de datos arrojaba errores. A partir de esta versión, null también posee soporte completo como tipo de datos independiente, y puede declararse en aislamiento como cualquier otro tipo de datos.

// declarando 'false' como tipo de datos independiente
function siempreDevuelveFalse(): false { /* ... */ }
// declarando 'true' como tipo de datos independiente
function siempreDevuelveTrue(): true { /* ... */ }

// declarando 'null' como tipo de datos independiente
function siempreDevuelveNull(): null { /* ... */ }

Unión e Intersección de tipos combinada (DNF types)

Se incluye soporte para datos DNF (Disjoint Normal Form), el cual permite combinar Unión e Intersección de datos, facilitándonos declarar tipos de parámetros, datos de retorno y propiedades de una manera más flexible y/o precisa.

Importante: Al combinar intersección y unión de datos, los datos en intersección deben ir agrupados entre paréntesis.

class Foo
{
  public function bar( (A&B)|null $entity )
  {
    return $entity;
  }
}

El código anterior solo acepta un parámetro si su valor satisface la intersección (es tanto de tipo ‘A’, como de tipo ‘B’ simultaneamente) o al no satisfacerla, si el valor satisface la unión (Es del tipo C, donde C es null). En esencia, DNF consiste en la combinación de intersección con unión de datos en una misma evaluación.

Propiedades dinámicas descontinuadas

Con el propósito de evitar errores, queda descontinuada por defecto la asignación dinámica de propiedades de clase a partir de esta versión. Los métodos mágicos __get y __set no se verán afectados por este cambio.

Se puede reactivar la asignación dinámica de propiedades en una clase usando el atributo #[\AllowDynamicProperties].

class Usuario
{
  public $nombre;
}

// Clase personalizada
$usuario = new Usuario();
$usuario->apellido = 'Doe'; // Devuelve aviso de descontinuación

// Clase stdClass
$usuario = new stdClass();
$usuario->apellido = 'Doe'; // Se mantiene permitido

Nueva extensión de números aleatorios

A lo largo de la historia de PHP, éste ha soportado varios Generadores de Números Aleatorios (RNG) con diferentes grados de rendimiento, casos de uso y adecuación para aplicaciones seguras. PHP 8.2 va más allá al refactorizar toda la funcionalidad relacionada con RNG a una nueva extensión llamada random.

La extensión random proporciona la misma funcionalidad sin romper ninguna API, por lo que las funciones existentes rand, mt_rand, random_bytes, y random_int continúan funcionando sin cambios. También proporciona una nueva API de programación orientada a objetos para generar números aleatorios con una arquitectura conectable, por lo que ahora es fácil sustituir el RNG por defecto y proporcionar nuevos RNGs, haciendo que las aplicaciones PHP sean seguras y fáciles de probar.

Clases, Funciones e Interfaces nuevas

  • Función mysqli_execute_query y método mysqli::execute_query.
  • Atributos #[\AllowDynamicProperties] y #[\SensitiveParameter].
  • Métodos ZipArchive::getStreamIndex, ZipArchive::getStreamName, y ZipArchive::clearError.
  • Métodos ReflectionFunction::isAnonymous y ReflectionMethod::hasPrototype.
  • Funciones curl_upkeep, memory_reset_peak_usage, ini_parse_quantity, libxml_get_external_entity_loader, sodium_crypto_stream_xchacha20_xor_ic y openssl_cipher_key_length.

Material relacionado

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Novedades de PHP 8.1