Saltar al contenido

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); // false

Novedades en PHP 8

Novedades en PHP 8.2

Novedades en PHP 8.3

Novedades en PHP 8.4

Novedades en PHP 8.5

Hasta 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.

Rutas de aprendizaje