Novedades de PHP 8
PHP es un lenguaje de programación muy popular dada su penetración en el mundo de los servidores y la enorme cantidad de herramientas que se basan en él. Comenzó pecando quizás de sencillez, pero durante los últimos años ha conseguido equipararse a los lenguajes informáticos más potentes y robustos del mercado. PHP 8, que ya está disponible en el hosting de Arsys, da un pasito más en esa dirección, implementando un nuevo sistema de interpretación y compilación, junto con diversas novedades en lo que respecta al lenguaje, sintaxis y estructuras. En este artículo veremos cuáles son sus novedades más representativas, que debes conocer como desarrollador.
Pero antes de ponernos a desentrañar lo nuevo de PHP 8, queremos invitarte al webinar que celebraremos el próximo 6 de mayo sobre este asunto. Explicaremos cómo ha conseguido mejorar su rendimiento y veremos diversos ejemplos de código con nuevas características de PHP que debemos entender para actualizarnos en el uso del lenguaje.
JIT en PHP 8
Vamos a comenzar hablando un poco sobre una de las novedades más importantes de PHP, aunque en este caso solamente afecta a nivel operacional. Se trata de JIT (compilación «Just-In-Time»), que implementa un nuevo procedimiento para interpretar y compilar el código de PHP antes de su ejecución. En resumen, JIT usa una tecnología que permite generar código nativo, mucho más cercano a la máquina, directamente desde código PHP. De este modo la ejecución de PHP puede llegar a ser mucho más rápida, algo que se observará principalmente cuando el código requiera cálculos matemáticos pesados, con una carga elevada de CPU. En PHP 8 JIT se ha introducido en dos sabores.
- Tracing JIT
- Function JIT
Siendo Tracing JIT mucho más prometedora. Los benchmarks publicados por PHP en el anuncio de la release 8.0 para estas nuevas tecnologías ofrecen información muy relevante.
Como podrás observar, el rendimiento de PHP con JIT puede ser mucho mayor que el que se tenía anteriormente sin JIT. Pero ¿Por qué la velocidad que se consigue en una aplicación como WordPress o una aplicación elemental de Symfony no llega a mostrar ese aumento de rendimiento? Debemos tener en cuenta que cada request en una aplicación web involucra a muchos actores. Por ejemplo, implica la ejecución del código del servidor web, la base de datos, etc. Por lo tanto, la velocidad del propio lenguaje a día de hoy no afecta de manera tan relevante en el proceso de ejecución de una aplicación PHP común.
Sin embargo, JIT sí que mejorará sensiblemente las aplicaciones que requieran uso intensivo de CPU, para realizar por ejemplo cálculos matemáticos o realizar el procesamiento de grandes cantidades de datos. Por este motivo, a partir de ahora PHP podrá ser usado con mayores garantías de éxito en áreas donde anteriormente no era tan recomendado. Al mismo tiempo, los propios creadores de PHP han anunciado que están realizando esfuerzos para conseguir que las mejoras proporcionadas por JIT tengan un impacto representativo también sobre aplicaciones del día a día de PHP como WordPress.
Novedades de PHP 8.0 para los desarrolladores
En lo que respecta al lenguaje, PHP 8 ha traído diversas novedades muy interesantes, sobre todo a la hora de trabajar con tipos de datos y por supuesto diversas mejoras de lo que llamamos «azúcar sintáctico».
Como nota al margen, es muy interesante el paso que PHP viene realizando, ya desde la versión 7, para incorporar más comprobaciones de tipos a lo largo del código. Sabemos que PHP es un lenguaje de tipo dinámico pero, aún sin apartarse de esa filosofía, se han introducido diversas utilidades para que el intérprete nos pueda alertar de situaciones en las que no se están manejando los tipos esperados, por ejemplo, al declarar parámetros en las funciones. Por ello, muchas de las mejoras que encontrarás en PHP 8.0 vienen a dar un mayor soporte a la gestión de tipos. De nuevo, vamos a ver las mejoras más representativas que encontramos en el lenguaje en su última versión.
Argumentos con nombre
Esta utilidad nos permite especificar nombres en los parámetros que pasamos a las funciones, de modo que ahora podemos entregar argumentos en orden arbitrario. Al mismo tiempo, gracias a esta mejora no será necesario definir todos los parámetros opcionales que enviamos a las funciones. En esta invocación de la función htmlspecialchars() podemos encontrar un buen ejemplo.
htmlspecialchars($string, double_encode: false);
En PHP 7 habríamos tenido que escribir algo así:
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
Propiedades promocionadas en constructores
Ahora en PHP es posible resumir sensiblemente el código de los constructores, mediante la declaración de atributos directamente en la firma del método del constructor. Esto nos ahorra varias líneas de código:
- La declaración de los parámetros a nivel de clase
- La asignación de los valores a los parámetros dentro del código del constructor
De esta manera tan compacta somos capaces de definir una clase con dos atributos y un constructor donde se reciben y asignan los valores a dichos atributos.
class Coordinate2D { public function __construct( public float $x = 0.0, public float $y = 0.0, ) {} }
Tipos de unión
A la hora de definir qué tipo de parámetro acepta una función no había un modo de mencionar que se podría aceptar dos tipos diferentes, por ejemplo un float y un entero. Esta información se podía documentar, pero ahora con los «Union types» somos capaces también de expresarlo en el código.
class Number { public function __construct( private int|float $number ) {} }
Se está indicando que el atributo $number podría ser de tipo entero o float, facilitando aún más que PHP nos informe de manera prematura de posibles errores que existan en nuestro código, aumentando también de manera relevante la versatilidad.
Match expression
Esta nueva estructura del lenguaje nos permite hacer match de expresiones de una manera estricta, permitiendo diversas salidas o ejecuciones dependiendo del valor de una expresión. Esta nueva estructura de código vendría a ser como un switch pero extremadamente resumido.
$statement = match ($this->lexer->lookahead['type']) { Lexer::T_SELECT => $this->SelectStatement(), Lexer::T_UPDATE => $this->UpdateStatement(), Lexer::T_DELETE => $this->DeleteStatement(), default => $this->syntaxError('SELECT, UPDATE or DELETE'), };
Operador Nullsafe
Este nuevo operador permite ser mucho más conciso a la hora de trabajar con valores que podrían ser nulos, evitando comprobaciones repetitivas para verificar que no es nula cierta variable o propiedad antes de usarla.
$country = $session?->user?->getAddress()?->country;
De esta manera nos podemos ahorrar código muy habitual en PHP, con feos bloques de condicionales anidados.
if ($session !== null) { $user = $session->user; if ($user !== null) { // … } }
Verificación de las comparaciones entre cadenas y números
Ahora PHP hace una comprobación distinta cuando se evalúa si una cadena es igual que un número. Primero convierte el número a una cadena y luego usa una comparación entre strings.
0 == 'cadena'
Esto en PHP 7 devolvería true mientras que en PHP 8 sería false.
Errores de tipos al invocar funciones ahora arrojan una excepción
En PHP 7 algunas comprobaciones de tipos al invocar las funciones arrojaban un «warning» en tiempo de ejecución, permitiendo continuar con el procesamiento del resto del código. Sin embargo, en PHP esto produce una excepción que si no es tratada correctamente, abortará la ejecución del código siguiente.
strlen([]);
Este código con PHP 8 lanzaría una excepción «TypeError», por lo que podemos detectar de una manera temprana los errores que se producen en las comprobaciones de tipos.
Conclusiónes
Todas las novedades de PHP 8 vienen encaminadas a ofrecer mayor robustez en el lenguaje y a la par permiten a los desarrolladores escribir código más conciso y limpio. También se han presentado mejoras muy prometedoras en el modo en el que PHP funciona, que si bien no impactan todavía en las aplicaciones comunes de PHP, sin duda aumentará el ámbito de aplicación del lenguaje.
La parte negativa es que algunas de las diferencias introducidas han provocado cambios relevantes que pueden provocar que las aplicaciones actuales arrojen fallos, o se produzcan resultados distintos en su ejecución. Sin embargo, estas mejoras permiten una mayor consistencia del lenguaje y que resultan sin duda acertadas.