PHP 8.1 ofrece nuevas funcionalidades y mejoras en la experiencia de desarrollo, en esta versión también se descontinúan o restringen características no deseadas. Con estos cambios el equipo de PHP intenta dar otro paso hacia adelante en la modernización y optimización del lenguaje. A continuación, exploraremos algunos de los cambios más significativos que trae esta actualización.

Enumeraciones

se añade soporte para enumeraciones. Una enumeración es un tipo de dato personalizado que posee una cantidad predeterminada de valores posibles, y permite prevenir la representación de valores no válidos.

Los tipos enumerados deben ser declarados usando la palabra clave enum.

<?php

enum BlogStatus
{
  case Draft;
  case Published;
  case Archived
}

Con lo que ahora podemos implementar comprobación de tipos personalizada en funciones y métodos.

function acceptStatus(BlogStatus $status)
{
  // ...
}

acceptStatus(BlogStatus::Draft);

Propiedades de solo lectura

Los valores de las propiedades de solo lectura no pueden ser cambiados luego de haber sido inicializados, y una propiedad de clase de solo lectura solo puede inicializarse una vez.

Las propiedades de clase de solo lectura se declaran con la palabra clave readonly.

class BookId
{
  public readonly int $uid;

  public function __construct(int $uid)
  {
    $this->uid = $suid;
  }
}

Si intentamos sobrescribir el valor de una propiedad de solo lectura, o cambiarla fuera del ámbito de la clase, esta devolverá una excepción.

$bookId = new BookId(123);
$bookId->status = 124; // No permitido, devuelve una excepción

Fibras (Fibers)

Las fibras son una nueva característica de PHP que aporta concurrencia ligera y controlada. En esencia, una fibra es un bloque de código que mantiene su propia pila (variables y estado), y que puede ser iniciado, suspendido, o terminado cooperativamente por el código principal y la fibra.

Las fibras son similares a los hilos de un programa informático. Los hilos son programados por el sistema operativo, y no se garantiza cuándo se pausan o reanudan. Las fibras se crean, inician, se suspenden y terminan por el propio programa, y permiten un control fino de la ejecución del programa principal y la ejecución de la fibra.

Con las fibras, el código dentro de la fibra puede suspender el bloque de código y devolver cualquier dato al programa principal. El programa principal puede reanudar la fibra desde el punto en que se suspendió.

La ejecución concurrente no equivale a ejecución simultánea. Una fibra no permite la ejecución simultánea de múltiples fibras o del hilo principal y una fibra por sí misma.

$response = $httpClient->request('https://example.com/');
print json_decode($response->getBody()->buffer())['code'];

Mejoras en el sistema de tipos

Intersección de datos pura

La intersección de tipos permite declarar que el tipo de dato de un parámetro debe satisfacer dos o más restricciones de tipo de manera simultánea.

Puedes pensar en el uso de intersección de datos como el opuesto a utilizar unión de datos.

No se permite mezclar sintaxis de intersección de datos con sintaxis de unión de datos en PHP 8.1.

Funciones: Tipo de devolución never

Las funciones o métodos declarados con el tipo de devolución never nunca devolverán un valor, y siempre lanzarán una excepción o finalizarán el programa con una llamada a los métodos die() o exit().

function redirect(string $uri): never
{
  header('location: ' . $uri);
  exit();
}

Si llamamos redirect, dentro de otra función, el código escrito después de la llamada será código muerto, detectable por análisis estático.

function redirToLoginPage()
{
  redirect('/login');
  echo "Mensaje de ejecución exitosa"; // Código muerto, detectado por análisis estático
}

Constantes de clase finales

Ahora es posible declarar constantes de clase finales, para que éstas no puedan ser sobre-escritas en clases hijas a nuestra clase principal. Para esto declaramos la constante como principal utilizando la palabra clave final.

En versiones previas, la clase hija puede sobre-escribir el valor de las constantes de su clase padre.

class Foo
{
  public const NOMBRE = 'Foo';
}

class Bar extends Foo
{
  public const NOMBRE = 'Bar'; // No hay error
}

A partir de PHP 8.1 puedes evitar que clases hijas sobre-escriban el valor de dicha constante que definamos en la clase padre al declararlas como final.

class Foo
{
  final public const NOMBRE = 'Foo';
}

class Bar extends Foo
{
  public const NOMBRE = 'Bar'; // Arroja un error, el valor permanece sin alterar
}

Nuevas Clases, Interfaces y Funciones

  • Nuevo atributo #[ReturnTypeWillChange].
  • Nuevas funciones fsync y fdatasync.
  • Nueva función de arreglos array_is_list.
  • Nuevos métodos para Sodium y XChaCha20.

Mejoras de Rendimiento

Aplicación de pruebas: Symfony (Tiempo por petición)

25 ejecuciones consecutivas, 250 peticiones (sec) (Valores más bajos = Mejor rendimiento)

 

Material relacionado

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

Lección anterior Cambios en el manejo de errores en PHP 8 Lección siguiente Novedades de PHP 8.2