Novedades de PHP 7.4 cover image

Novedades de PHP 7.4

Kenny Horna • 03 de noviembre, 2019

php

PHP 7.4 es la última versión de la serie 7.X antes de la esperada PHP 8, así que indagaremos en las novedades y cambios que nos trae.

Sobre PHP 7.4

El lanzamiento de la nueva versión está pensada para el 28 de noviembre del 2019.

Principales novedades

-> Funciones Flecha

Las funciones flechas (Arrow Functions) son muy útiles para resumir la sintaxis de las funciones mono-lineales.

Si antes tenías que escribir algo de este estilo:

array_map(function (User $usuario) { 
    return $usuario->id; 
}, $usuarios)

Ahora lo puedes hacer de manera más simple:

array_map(fn (User $usuario) => $usuario->id, $usuarios)

Hay algunas observaciones interesantes de esta adición:

  • Pueden siempre acceder al contexto padre, por lo que no es necesario pasar elementos mediante el keyword use.
  • Solo deben contener una expresión, que a su vez, es el valor retornado.
  • $this está disponible tal como sucede en closures normales.

Como ejemplo podemos tomar la siguiente función que tan solo multiplica los valores de un arreglo por un factor:

$numeros = [1, 2, 3, 4, 5];
$factor = 2;

array_map(function ($numero) use ($factor) { 
    return $numero * factor; 
}, $numeros);

Si notamos, en PHP 7.3 o inferior, teníamos que indicarle a nuestra función anónima la existencia de $factor mediante el use pues de otro modo no existía en el contexto de la función cierre. En cambio, ahora podríamos cogerlo directamente del contexto padre:

$numeros = [1, 2, 3, 4, 5];
$factor = 2;

array_map(fn ($numero) => $numero * $factor, $numeros);

Puedes leer más sobre esta adición en el RFC

-> Propiedades de tipo clase insinuadas

Las variables de tipo clase ahora también pueden ser insinuadas (type-hinted):

class ClaseA
{
    public string $nombre;
    public User $usuario;
    public ?Order $orden;
}

Puedes leer más sobre esta adición en el RFC

-> Operador de extensión para arreglos

Ahora es posible utilizar el operador de extensión (...) para los arreglos. Mira el siguiente ejemplo:

$a = [1, 2, 3];
$b = [4, 5, 6];

$numeros = [0, ...$a, ...$b, 7, 8, 9];

// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

Observación: Esto solo funcionará en arreglos con llaves numéricas.

Puedes leer más sobre esta adición en el RFC

-> Operador de asignación de fusión nula

Ahora tenemos un operador de asignación de fusión nula, una abreviatura para las operaciones de fusión nulas. Si antes hacíamos lo siguiente:

$data['fecha'] = $data['fecha'] ?? new DateTime();

Ahora podemos hacerlo aún más corto:

$data['fecha'] ??= new DateTime();

Puedes leer más sobre esta adición en el RFC

-> Separador literal numérico

Ahora podemos utilizar el _ para separar visualmente las cifras de valores numéricos. El motor de PHP simplemente ignorará los _:

$numeroSinFormato = 6120456.90;
$numeroConFormato = 6_120_456.90;

Puedes leer más sobre esta adición en el RFC

-> Precarga

Una de las más interesantes adiciones al core de PHP -a bajo nivel- es la precarga. Esto puede traer bastante beneficios a nivel de rendimiento.

En resumen: Si utilizas algún framework, sus archivos tienen que ser cargados y enlazados con cada request. La precarga le permite al servidor cargar los archivos PHP en memoria al iniciar el servidor, de este modo, los tendrá permanentemente disponible para todos los futuros requests.

La mejora de performance trae un costo: Si realizas modificaciones en alguno de los archivos precargados, tendrás que reiniciar el servidor para que estos puedan ser nuevamente cargados.

Puedes leer más sobre esta adición en el RFC

-> Serialización personalizada de objetos

Dos nuevos métodos mágicos han sido incluídos: __serialize y __unserialize .

La diferencia entre estos métodos y __sleep y __wakeup puedes leerlo en detalle en la discusión del RFC.

-> Reflexión para referencias

Librerías como el var dumper de Symfony dependen fuertemente de la API de reflexión para arrojar una variable de manera confiable.

Previamente, no era posible reflejar referencias de manera apropiada, resultando en que estas librerías dependan de "hacks" para poder detectarlas.

PHP 7.4 añade la clase ReflectionReference que soluciona este inconveniente.

Puedes leer más sobre esta adición en el RFC

-> Referencias débiles

Las "referencias débiles" son referencias a objetos que no las previenen de ser destruidas.

Puedes leer más sobre esta adición en el RFC

-> Función mb_str_split añadida

Esta función provee la misma funcionalidad que str_split pero en strings multi-byte. This function provides the same functionality as str_split, but on multi-byte strings.

Puedes leer más sobre esta adición en el RFC

-> Registro de Hashing de contraseñas

Se han realizado cambios internos al modo en que las librerías de hashing son utilizadas, de modo que sea más fácil para el usuario el poder utilizarlas. De hecho, una nueva función password_algo ha sido añadida la cual lista todos los algoritmos de contraseñas registradas.

Puedes leer más sobre esta adición en el RFC

Cambios y deprecaciones

Así como hay nuevas funciones, también hay cosas que han sido modificadas, que dejarán de funcionar en PHP 7.4 o se mostrarán con advertencia para luego ser "deprecadas" en PHP 8.

- Precedencia de concatenación

Si antes escribías esto:

echo "sum: " . $a + $b;

PHP lo interpretaba así:

echo ("sum: " . $a) + $b;

En PHP 8, lo hará del siguiente modo:

echo "sum :" . ($a + $b);

PHP 7.4 mostrará una advertencia de deprecación al encontrar una expresión sin paréntesis ((/)) que contenga un operador (+ / -) y que sea precedido por un ..

Puedes leer más sobre esta modificación en el RFC

- Operador ternario de asociación izquierda, deprecado

El operador ternario tiene algunas inconsistencias. Este RFC añade una alerta de deprecación que luego generará un error de compilación en PHP 8:

1 ? 2 : 3 ? 4 : 5;   // Deprecado
(1 ? 2 : 3) ? 4 : 5; // Ok

Puedes leer más sobre esta modificación en el RFC

- Se permitirán excepciones en __toString

Previamente, no se podían arrojar excepciones desde __toString. Esto era por un antiguo artilugio que se implementó para dar solución a otro problema. El equipo de PHP ha corregido esto y ahora se podrán arrojar excepciones desde este método.

Puedes leer más sobre esta modificación en el RFC

- Acceso a elementos de arreglos mediante llaves {}

Antes, podías también acceder a elementos de tus arreglos haciendo esto:

$numeros = [1, 2];
echo $numeros[1]; // imprime 2
echo $numeros{1}; // también imprime 2

$cadena = "kenny";
echo $cadena[0]; // imprime "k"
echo $cadena{0}; // también imprime "k"

A partir de ahora: $arreglo{indice} ya no sera posible.

Esto ya no será posible.

Puedes leer más sobre esta modificación en el RFC

Resto de cambios

Hay muchas otras adiciones, mejores, advertencias y deprecaciones, tales como:

  • Aviso al acceder a un array inválido (RFC)
  • Mejoras a proc_open (RFC)
  • strip_tags ahora acepta arreglos (RFC)
  • ext-hash activado por defecto (RFC)
  • Mejoras a password_hash (RFC)
  • Muchas deprecaciones pequeñas/menores (RFC)

Entre muchos otros.

Cierre

Como puedes notar, PHP 7.4 trae consigo interesantes adiciones y modificaciones que, en mi opinión, seguirán impulsando el resurgimiento de este gran lenguaje de programación.

Como siempre, cualquier comentario, duda, aclaración o corrección es bienvenido.