PHP 7.4 se lanzó en noviembre de 2019 y trajo cambios que hicieron que PHP sea aún más robusto. En este artículo veremos las principales novedades de esta nueva versión y analizaremos en qué situaciones nos pueden ayudar.
Tipado de datos en atributos
PHP es conocido por ser un lenguaje débilmente tipado, es decir, no nos obliga a definir el tipo de una variable al crearla ni nos impide cambiar el tipo de esa variable si lo deseamos.
Sin embargo, la versión 7.4 nos trajo una pequeña novedad que altera este concepto, al menos en el ámbito de la Orientación a Objetos. Ahora podemos definir el tipo de los atributos que creemos en nuestras clases. Veamos un ejemplo, creando una clase llamada “Person”:
class Person {
public int $id;
public string $name;
}
Con este código definimos que el atributo $id debe ser obligatoriamente del tipo entero y el atributo $name debe ser una cadena.
Vamos a crear una nueva instancia de esta clase y definir un valor para el atributo $id:
$glaucio = new Person();
$glaucio->id = "150";
Hemos definido que su valor será el número 150. Este código funcionará, ya que respeta lo que definimos al crear el atributo.
Sin embargo, ¿qué sucede si le proporcionamos el valor “null”? Vamos a instanciar un nuevo objeto para eso.
$joao = new Person();
$joao->id = null;
Al probar el código en el navegador, vemos el siguiente resultado:
El mensaje nos informa que el atributo $id debe ser entero y nos devolvió un error fatal, deteniendo la ejecución del código, lo que muestra que el tipado está funcionando.
Pero pensemos en una situación más. ¿Qué ocurre si le proporcionamos una cadena? Vamos a probar.
$joao->id = "150";
Ahora el atributo $id tiene el valor de la cadena “150”. ¿Qué sucede en este caso? ¡El código funcionará! Esto ocurre porque PHP intentará convertir el valor proporcionado a entero y devolverá un error solo si no puede. En el caso de una cadena, la conversión a entero es posible.
Si deseas que PHP sea lo más “estricto” posible en cuanto a los tipos de datos, simplemente agrega esta línea al principio del código:
declare (strict_types = 1);
Ahora, si probamos el mismo código, veremos el siguiente resultado en el navegador:
Ahora sí, la verificación se realizó por completo. Recordando que enseñamos todo sobre Orientación a Objetos en PHP en nuestro Curso Completo de PHP 7.
¿Cómo puede ayudar este cambio? Tal vez ya estés acostumbrado a usar PHP sin tipado de datos y puede que no consideres este cambio algo bueno. Sin embargo, podemos enfrentar mejor este cambio si lo consideramos como un recurso adicional e identificamos algunas situaciones en las que puede ser útil. Por ejemplo: esta novedad nos ayuda a disminuir las posibilidades de encontrar errores de tipo en nuestro código, lo que puede ahorrarnos algunos dolores de cabeza ?.
Funciones de flecha
Si ya trabajas con JavaScript, imagino que estés acostumbrado a usar Funciones de Flecha en tu código. De hecho, ya hemos hablado sobre este concepto en nuestro Blog, en el artículo Entendiendo Funciones de Flecha de una vez por todas.
Sabemos que este es un recurso que ayuda a hacer nuestro código más compacto, y ahora está disponible también en PHP. Para crear una función de flecha, necesitamos usar la palabra fn, que ahora es reservada, y luego usar la misma sintaxis a la que ya estamos acostumbrados en JavaScript. Veamos un ejemplo.
Imagina que deseamos filtrar un array de números, retornando solo aquellos que son menores que 5. Es posible hacer esto con la función array_filter(). Vamos a usar el siguiente código:
$numbers = [1, 2, 3, 4, 5];
$numbers_filtered = array_filter($numbers, function ($n) {
return ($n < 5);
});
Este código funcionará sin problemas. Sin embargo, con funciones de flecha podemos ejecutar esta misma función en una sola línea, con el siguiente código:
$numbers_filtered = array_filter($numbers, fn($n) => ($n < 5));
Mucho más conciso, ¿no crees?
Sin embargo, es necesario señalar un punto importante. El concepto de funciones de flecha en PHP aún no es 100% igual al que ya conocemos en JavaScript. Por ejemplo, aún no es posible definir una función de flecha como el valor de una variable PHP. Solo podemos usarlas, al menos por ahora, en funciones que esperan otra función como parámetro, como array_filter(), array_map() y array_reduce().
Operador de asignación de null coalescing
El operador null coalescing fue agregado a PHP en la versión 7.0 con el objetivo de simplificar el uso del operador ternario con la función isset(). Por ejemplo, imagina la siguiente situación: tenemos una variable llamada $photo y queremos determinar que si no tiene ningún valor, lo definiremos como “default.png”. Podemos usar el siguiente código para esto:
if (!isset($photo)) {
$photo = "default.png";
}
Sin embargo, usando la versión 7.0, podemos convertir este if() en una sola línea, como vemos a continuación:
$photo = $photo ?? "default.png";
Este operador es realmente muy interesante. Sin embargo, la versión 7.4 simplificó aún más esta sintaxis. Nota que en el código anterior repetimos la llamada a la variable $photo. A partir de ahora, si nos encontramos con esta situación, basta con informar los dos signos de interrogación y el signo de igual juntos, de esta forma:
$photo ??= "default.png";
Aún más simple, ¿no es así?
Esparcimiento de arrays
Esta es otra novedad que nos recuerda los recursos de JavaScript. Podemos decir con cautela que el esparcimiento de arrays es como el “spread operator” de PHP. Esta es una novedad que también llegó para simplificar nuestros códigos.
Veamos un ejemplo. Imagina que tenemos dos arrays: uno llamado $companies y otro llamado $old_companies. Tienen la siguiente estructura:
$companies = ['Facebook', 'Google'];
$old_companies = ['Apple', 'Microsoft', 'IBM'];
Ahora, imagina que deseamos unir esos dos arrays en uno solo. Tal vez ya te venga a la mente la función array_merge(). Podríamos usarla con este código:
$all_companies = array_merge($old_companies, $companies);
Este código funcionaría. Sin embargo, con el recurso de esparcimiento de arrays, podemos implementar los valores de un array en otro en el momento de su creación. Para ello, basta con usar los tres puntos y el nombre del array. El código anterior podría reescribirse de esta forma:
$companies = ['Facebook', 'Google'];
$all_companies = ['Apple', 'Microsoft', 'IBM', ...$companies];
Nota que en este segundo caso ni siquiera fue necesario crear el array $old_companies, lo que dejó nuestro código un poco más limpio.
Recordando solo que, a pesar de que esta novedad nos recuerde el concepto de spread operator de JavaScript, aún no posee todos los recursos que el ECMAScript tiene en este sentido.
Separador de valores numéricos
Una novedad en PHP 7.4 muy interesante es la separación visual de valores numéricos mediante un guion bajo (_) sin generar error de sintaxis.
¿Cómo puede ayudarnos esto?
Vamos a crear una variable llamada $number que tendrá un valor numérico:
$number = 1000000;
¡Excelente! Pero, ¿qué número es ese? Es difícil de decir sin los separadores visuales, ¿no es así? Con PHP 7.4, podemos crear la misma variable de esta forma:
$number = 1_000_000;
Ahora sí se puede entender que ese número es 1 millón. Mucho más legible, ¿no es así? Lo mejor es que este código no devolverá ningún error en tu editor de texto y si lo mostramos en la pantalla con formato numérico, usando el código echo number_format($number, 0, ".", "."), veremos el siguiente resultado:
Nota que PHP identificó el número como un entero y aún añadió los separadores en los lugares correctos. Esto también se puede hacer con variables de tipo float, hexadecimal o binario.
Las novedades de PHP 7.4 son realmente muy relevantes. Y es muy bueno poder seguir el desarrollo y madurez de este lenguaje, que está siempre evolucionando. PHP 8 puede lanzarse aún este año. ¿Qué más será que veremos de novedad? Solo el tiempo lo dirá.
Mientras tanto, podemos continuar estudiando y aprendiendo de este lenguaje de programación sensacional, que nos ayuda a crear proyectos increíbles para la Web. Hasta el próximo artículo :)