PHP 8.1

PHP 8.1 cuenta con varias características interesantes y las iré resumiendo en esta publicación. Hay mejoras de rendimiento, nuevas funciones y distintos extras que mejoran su sintaxis. Lo ideal es conocerlas e implementarlas en nuevos proyectos para que estos sean mas legibles y de fácil mantenimiento.

Al llamarse X.1, o "punto algo" debemos inmediatamente comprender que se trata de una mejora o progreso. No pienses que lo aprendido hasta este momento queda obsoleto o anticuado.

¡Comencemos!

Enums (Enumeraciones)

¿Has visto este tipo de dato al crear un campo en una tabla? Básicamente trae la misma filosofía. Es definir una lista de valores permitidos. Con esto conseguimos un código más fuerte y seguro, mostrando así mucha coherencia y rigurosidad debido a que no puedes trabajar con nada que no esté definido en la enumeración.

Tendría básicamente la siguiente estructura:

enum Role 
{
    case Admin;
    case User;
}

Luego podemos usarlo como un tipo que define valores limitados. Es interesante porque proporciona una capa más de validación.

Si tenemos un bloque de código dedicado a la creación de usuarios este podría lucir de la siguiente manera o con la siguiente estructura:

function create(Role $role)
{
    // ...  
}

Propiedad de solo lectura - readonly

Esto nos permite tener un nivel más de coherencia al momento de declarar propiedades en una clase. Precisamente conseguimos que alguna propiedad no pueda mutar luego de ser iniciada, su sintaxis es la siguiente:

public readonly Role $role;

En una clase podríamos verla de la siguiente manera:

class User
{
    public readonly Role $role;
  
    // ...
}

Esto quiere decir básicamente que una vez iniciada esta no podrá cambiar.

Expresión new como parte de un parámetro en __construct()

Esto es bien interesante, cuando necesitábamos estos casos podíamos desarrollar la lógica dentro del método constructor, ahora somos capaces de decir que su valor por defecto es la iniciación de una clase. Dicho en otras palabras, hoy día es posible colocar como parámetro por defecto a un objeto instanciado.

public function __construct(
    Search $search = new Default(),
) 
{
    // ...
}

¡Increíble!

Siempre será interesante conocer lo que el lenguaje de programación ofrece.

Intersección

Lo podemos conseguir como pure intersection types o tipos de intersección pura que podríamos usar al momento de resolver varias restricciones. Nos ayuda a mejorar el estilo de comprobación, veamos lo que nos dice la documentación de PHP.

function count_and_iterate(Iterator $value) {
    if (!($value instanceof Countable)) {
        throw new TypeError('El valor debe ser contable');
    }
  
    // ...
}

Básicamente necesitamos que $value sea una instancia de Iterator pero luego comprobamos que esta también sea una instancia de Countable.

¿Cómo se ha mejorado?

function count_and_iterate(Iterator&Countable $value) {
    // ...
}

Nota que se hace a través del ampersand (signo &). Aquí estamos pensando en que $value sea de ambos tipos.

Quizás se te parezca a la funcionalidad de union, pero veamos que la diferencia es que con la unión buscábamos que el argumento sea de al menos uno de los tipos.

Revisemos en detalle:

  1. Unión: Signo (|) Iterator|Countable, cumple la función del operador or o ||.
  2. Intersección: Signo (&) Iterator&Countable cumple la función del operador and o &&.

Never return

Con este tipo básicamente especificamos que no devolveremos nada y en cambio produciremos una excepción o directamente usaremos die(), exit() u otras funciones similares. Si hacemos uso de alguna de estas funciones o si lanzamos una excepción directamente estamos diciendo que nuestro proyecto NUNCA llegará al final, esa podría ser la razón de que se llame never.

function example(): never
{
    // ...
}

Constantes como final

Esto es algo que prohibe sobrescribir a nuestras constantes en clases heredadas. Para el ejemplo veamos primero a una clase madre llamada Base.

class Base
{
    final public const PREFIX = "__";
}

Ahora veamos a su clase hija.

class Post extends Base
{
    public const PREFIX = "__BASE"; // Error
}

Desestructuración de Array

Esto quiere decir que hoy día es posible unir diferentes array aun cuando estas tienen la llave o key del tipo texto o string.

Veamos el ejemplo de la documentación:

$arrayA = ['a' => 1];
$arrayB = ['b' => 2];

$result = ['a' => 0, ...$arrayA, ...$arrayB];

// ['a' => 1, 'b' => 2]

Podemos ver que se reemplazó el valor de la llave a, precisamente porque el key coincide.

¿Cómo se hacia antes de esta versión?

Usando array_merge, directamente de la siguiente manera:

$result = array_merge(['a' => 0], $arrayA, $arrayB);

Otro ejemplo:

<?php

$posts = [
    // ...
    // ...
];

$series = [
    // ...
    // ...
];

$result = [...$posts, ...$series];

Parece muy sencillo, solo recuerda que antes únicamente era posible si el key era un entero.

Fibers

Es la gran noticia de esta versión, en PHP la ejecución era en secuencia, es decir, este se detenía hasta obtener un resultado (obtenía un resultado y se continuaba trabajando con el resto del código).

Queremos decir que ahora podemos trabajar en paralelo y esto hace por supuesto a que podemos desarrollar varios hilos o procesos por separado.

El objetivo es poder trabajar con diferentes ejecuciones en simultáneo y proporcionar mayor rendimiento desde PHP, bondad que podemos usar directamente pero que serán muy útiles en sistemas como ReactPHP, Guzzle o Swoole, estos proyectos profesionales de terceros para trabajar con la simultaneidad que he mencionado.

La buena noticia es que nos acercamos a un mundo de asíncronos y solicitudes paralelas desde PHP. Aquí se debe ver lo que es síncrono y asíncrono.

  1. Sincrono: Sucede al mismo tiempo.
  2. Asíncrono: No sucede al mismo tiempo.

Otras nuevas mejoras

  1. Funciones fsync y fdatasync: Lo usaremos para trabajar con archivos, podemos estar al tanto de cambios y así garantizar la correcta escritura.
  2. Función array_is_list: Es como un IF directo en una sola línea para verificar si un listado de datos es directamente una lista o un array sin keys personalizados, la pregunta que se hace es ¿El array es una lista? Digamos que devolverá true si los keys están en orden secuencial y comenzando en 0. Devolverá false si sus keys son personalizados.

Estas funciones y el resto de característica las estaremos explicando y utilizando en las diferentes series y cursos, obtén un plan y aprende PHP cada día

Compartir en: Facebook Twitter