Novedades en PHP 8
En esta entrada te explico todas las novedades en PHP 8 para que no te quedes atrás.
PHP 8 fue liberado el 26 de noviembre de 2020 y trae una serie de mejoras que todos los desarrolladores vamos a agradecer, union types, named arguments, mixed y nullsafe entre otros. En esta entrada te los voy a tratar de explicar para que veas los grandes beneficios que añaden a PHP.
Novedades en PHP 8
JIT (Just In Time Compilation)
PHP es un lenguaje interpretado, no compilado como por ejemplo C o Java. Es el intérprete de PHP el que hace que nuestro código funcione.
En PHP 8 aparece por primera vez JIT, y es una gran noticia, la idea es ofrecernos la posibilidad de ejecutar código PHP en tiempo de ejecución, pero ahora mismo, por lo menos para el desarrollo de aplicaciones web, su rendimiento no es nada excepcional en comparación con el uso del intérprete.
Tendremos que ver si en un futuro no muy lejano JIT puede ser una poderosa herramienta para procesos que requieran usos de CPU elevados, ya que de momento las benchmarks no aportan nada valioso al desarrollo web.
Union Types
En PHP 8 ya podemos utilizar Union Types, una característica muy poderosa de otros lenguajes de programación. La idea es poder utilizar múltiples tipos de datos para argumentos, datos de retorno y propiedades en lugar de poder utilizar únicamente un tipo de dato, veamos un ejemplo.
Como puedes ver, ahora en los argumentos del constructor de la clase FooBar aceptamos un dato que puede ser de tipo Foo o de tipo Bar, además, el retorno de datos puede ser de tipo string o int.
Promotion Construct Properties
Sin dudarlo esta es una gran característica, ya que nos va a permitir definir el ámbito de una propiedad a través de los argumentos del constructor para que automáticamente queden inicializadas en la clase, con el consiguiente ahorro de código.
En lugar de hacer lo siguiente:
En PHP 8 podremos hacer esto:
Named Arguments
Esta es otra poderosa característica de PHP 8 muy similar a la que Python nos ofrece a través de los keyword arguments. En PHP 8 ya podemos utilizar argumentos a través de sus nombres, incluso de forma desordenada y con valores nulos.
Atributos en lugar de PHPDoc
En PHP 7 y sus versiones anteriores para documentar cualquier tipo de dato utilizamos bloques de documentación PHP, los conocidos como PHPDoc. En PHP 8 aparecen atributos o metadatos estructurados con la sintaxis nativa de PHP. Aquí tienes un paquete para Laravel de Spatie que justamente trata este tema aplicándolo al sistema de rutas.
Lo mejor para entender un caso de uso que puede aplicarse a la vida real es ver lo que hace Spatie con esta nueva característica de PHP 8.
El código anterior habrá registrado la siguiente ruta en nuestro proyecto Laravel.
Expresiones match
, ¿mejora del switch
?
El bloque switch en PHP lo solemos utilizar de vez en cuando para comprobar un valor a través de una serie de casuísticas. En PHP aparece la expresión match, las cuales no requieren de un break, pueden ser almacenadas en variables y utilizan la comparación de datos estricta, veamos un ejemplo.
Otro dato importante, PHP 8 también soporta una coma al final de una lista de parámetros y lista de use en closures.
Operador Nullsafe
Gracias al operador Nullsafe en PHP 8 no tendremos que andar comprobando condiciones nulas, simplemente deberemos utilizar este nuevo operador. Primero veamos un ejemplo con PHP 7.
En PHP 8 y gracias al operador Nullsafe podemos hacer simplemente lo siguiente.
Gracias al paso del ? en cada comprobación que necesitemos realizar PHP hará ese trabajo por nosotros, con el consiguiente ahorro de código.
Nuevo tipo mixed
Mixed es un nuevo tipo de dato en PHP 8 algo peligroso, digo peligroso porque si se le da mal uso puede convertirse en algo malo. El problema de mixed es que nos permite definir un tipo de dato que puede contener cualquiera de los siguientes tipos: array, bool, callable, int, float, null, object, resource, string.
Si tienes experiencia programando sabrás que si a eso se le da mal uso el resultado será una aplicación que no conoce el tipo de dato que recibe con los consiguientes inconvenientes, veamos un ejemplo rápido de uso.
Novedades en PHP 8.1
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:
A partir de PHP 8.1 podemos hacer lo siguiente:
Además, también podemos definir el tipo de dato de un enum de la siguiente forma:
Propiedades readonly
Antes de PHP 8.1, para definir propiedades de sólo lectura, debíamos hacer lo siguiente:
En PHP 8.1 podemos hacer uso de readonly en las propiedades de una clase de la siguiente forma:
Sintaxis First-class Callable
En PHP 8.1 es posible obtener una referencia a cualquier función; esto se llama sintaxis First-class Callable.
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:
A partir de PHP 8.1 podemos hacer uso de new directamente de la siguiente forma:
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.
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.
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.
Novedades en PHP 8.2
PHP 8.2 fue liberado el 8 de diciembre de 2022, vamos a ver algunas de las nuevas características que nos ofrecerá esta nueva versión de PHP.
readonly
en clases
A partir de PHP 8.2 podemos hacer lo siguiente.
De esta forma, las propiedades de nuestra clase no podrán ser modificadas una vez instanciada la clase.
Propiedades dinámicas deprecadas
Las propiedades dinámicas en PHP nos permiten hacer lo siguiente.
En PHP 8.2 esta característica ha sido deprecada y en PHP 9 su uso provocará una excepción.
Para poder seguir haciendo uso de propiedades dinámicas en PHP a partir de la versión 8.2 deberemos hacer uso del atributo #[AllowDynamicProperties] de la siguiente forma.
#[SensitiveParameter]
A partir de PHP 8.2 tenemos a nuestra disposición un nuevo atributo que nos permite proteger datos sensibles en las excepciones que se puedan producir en nuestro código.
Constantes en Traits
PHP 8.2 nos permite hacer uso de constantes en Traits, algo que antes no era posible.
Nuevos tipos null
, true
y false
A partir de PHP 8.2 podemos utilizar los nuevos tipos null, true y false de la siguiente forma.
Nueva clase Randomizer
PHP 8.2 nos ofrece una nueva clase llamada Randomizer la cual acepta un tipo \Random\Engine, su uso es el siguiente.
Novedades en PHP 8.3
PHP 8.3 fue liberado el 23 de noviembre de 2023, vamos a ver algunas de las nuevas características que nos ofrecerá esta nueva versión de PHP.
Constantes de clase tipificadas
Las constantes de clase tipificadas son una nueva característica en PHP 8.3. Esta característica permite a los desarrolladores declarar el tipo de las constantes de clase, lo que puede ayudar a prevenir errores al garantizar que las constantes siempre sean del tipo esperado.
En este ejemplo, la constante CONSTANTE está tipificada como int, lo que significa que siempre debe ser un entero. Si intentas asignar un valor que no sea un entero a CONSTANTE, PHP lanzará un error. Esto en versiones anteriores se permitía.
Búsqueda dinámica de constantes de clase
En PHP 8.3, se introdujo una nueva característica que permite la búsqueda dinámica de constantes de clase utilizando una sintaxis más limpia y directa sin hacer uso de la función nativa constant.
Nuevo atributo #[\Override]
Al agregar el atributo #[\Override]
a un método, PHP asegurará que un método con el mismo nombre exista en una clase padre o en una interfaz implementada. Agregar el atributo aclara que la sobreescritura de un método padre es intencional y simplifica la refactorización, porque la eliminación de un método padre sobreescrito será detectada. En caso de que el método padre no exista, ocurrirá un error fatal.
Clonación profunda de propiedades de solo lectura
Las propiedades readonly
ahora pueden ser modificadas dentro del método mágico __clone
para permitir la clonación profunda de propiedades de solo lectura.
Nueva función json_validate()
La nueva función json_validate()
permite verificar si una cadena es JSON sintácticamente válido, siendo más eficiente que json_decode()
. Retornará true si el JSON es válido y false si no lo es.
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.