PHP 8.1 fue liberado el 25 de noviembre de 2021 y es una actualización importante para PHP. Contiene muchas características nuevas y mejoradas, incluyendo enumeraciones, propiedades readonly, sintaxis first-class callable, fibers, tipos de intersección, mejoras de rendimiento y más.
Enumerables
Antes de PHP 8.1, para simular los enumerables, necesitábamos hacer lo siguiente:
<?php
class Status
{
const DRAFT = 'draft';
const PUBLISHED = 'published';
const ARCHIVED = 'archived';
}
function acceptStatus(string $status) {...}
A partir de PHP 8.1 podemos hacer lo siguiente:
<?php
enum Status
{
case Draft;
case Published;
case Archived;
}
function acceptStatus(Status $status) {...}Además, también podemos definir el tipo de dato de un enum de la siguiente forma:
<?php
enum PostType: string {
case Car = 'car';
case Course = 'course';
case Project = 'project';
}Propiedades readonly
Antes de PHP 8.1, para definir propiedades de sólo lectura, debíamos hacer lo siguiente:
<?php
class BlogData
{
private Status $status;
public function __construct(Status $status)
{
$this->status = $status;
}
public function getStatus(): Status
{
return $this->status;
}
}En PHP 8.1 podemos hacer uso de readonly en las propiedades de una clase de la siguiente forma:
<?php
class BlogData
{
public function __construct(public readonly Status $status) {}
}Sintaxis First-class Callable
En PHP 8.1 es posible obtener una referencia a cualquier función; esto se llama sintaxis First-class Callable.
<?php
$foo = $this->foo(...);
$fn = strlen(...);Expresión new en el constructor
Antes de PHP 8.1, para poder simular el uso de new en un constructor, necesitábamos hacer lo siguiente:
<?php
class Service
{
private Logger $logger;
public function __construct(
?Logger $logger = null,
) {
$this->logger = $logger ?? new NullLogger();
}
}A partir de PHP 8.1 podemos hacer uso de new directamente de la siguiente forma:
<?php
class Service
{
private Logger $logger;
public function __construct(
Logger $logger = new NullLogger(),
) {
$this->logger = $logger;
}
}Nuevo tipo de retorno never
Una función o método declarado con el tipo never indica que no devolverá un valor y producirá una excepción o finalizará la ejecución del script con una llamada de die(), exit(), trigger_error(), o similar.
<?php
function redirect(string $uri): never {
header('Location: ' . $uri);
exit();
}
function redirectToLoginPage(): never {
redirect('/login');
echo 'Hello'; // <- dead code detected by static analysis
}Constantes de clase final
En PHP 8.1 es posible declarar la constante final en una clase, para que no puedan ser sobreescrita en las clases heredadas como sucedía en versiones anteriores de PHP.
<?php
class Foo
{
final public const XX = "foo";
}
class Bar extends Foo
{
public const XX = "bar"; // Fatal error
}Nueva función array_is_list
La función array_is_list() en PHP 8.1 devuelve verdadero si un array es una lista ordenada y secuencial de elementos, comenzando por el índice 0, y falso en caso contrario.
<?php
$array1 = [1, 2, 3, 4, 5];
array_is_list($array1); // true
$array2 = [0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 5];
array_is_list($array2); // false
$array3 = [1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5];
array_is_list($array3); // false
$array4 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
array_is_list($array4); // true
$array5 = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry'];
array_is_list($array5); // falseHasta aquí esta entrada revisando algunas de las más poderosas novedades de PHP 8, espero que te haya resultado útil, si quieres seguir conociendo todas las novedades de PHP 8 no te pierdas la ruta de PHP 8.