La versión 8.3 de PHP se hizo pública el pasado 23 de noviembre de 2023, justo un día después del 55 cumpleaños del creador de PHP, Rasmus Lerdorf (¿casualidad?). Esta nueva versión ya está disponible en algunos de los más importantes proveedores de alojamiento web y continúa en la línea de dotar a PHP de continuas mejoras en claridad, funcionalidad, seguridad y rendimiento. Vamos a dar un breve repaso a las más importantes.
json_validate
A las consabidas funciones json_decode
y json_encode
se une ahora json_validate
, cuyo único propósito es comprobar si una cadena contiene un JSON válido o no (sin necesidad de decodificarlo, lo que hace que gane mucho en velocidad). Al igual que con json_decode
y json_encode
, en caso de error podremos usar las funciones json_last_error()
y json_last_error_msg()
para averiguar qué es lo que ha ido mal:
function isValidJson(string $jsonString): bool
{
if (!function_exists('json_validate')) {
throw new RuntimeException('json_validate function not available');
}
if (json_validate($jsonString)) {
return true;
}
$errorCode = json_last_error();
$errorMessage = json_last_error_msg();
error_log("Invalid JSON: code $errorCode, message: $errorMessage");
return false;
}
Constantes de clase supervitaminadas
Ahora las constantes de clase podrán estar tipadas. De este modo aseguraremos que siempren van a contener, digamos, un entero, aunque estas sean redefinidas en clases hijas o implementadoras. Esta característica se une a otras mejoras que se han ido introduciendo en versiones anteriores, como la posibilidad de hacer que una constante de clase sea explícitamente pública o privada.
Otra mejora introducida en PHP 8.3 es la posibilidad de acceder a una constante dinámicamente sin conocer de antemano su nombre:
class Ejemplo {
public const int TIMEOUT = 1000; // Una clase hija de Ejemplo no podrá redefinir TIMEOUT como string, por ejemplo
...
}
$miConstante = 'TIMEOUT';
var_dump(Ejemplo::{$miConstante}); // 1000
Atributo #[\Override]
Este nuevo atributo permite marcar explícitamente un método para indicar que sobrescribe un método de una clase padre (o implementa un método de un interfaz). Esto facilita prevenir una sobrescritura accidental y además mejora la legibilidad y mantenibilidad del código.
final class Perro extends Animal {
#[\Override] protected function dromir() { // Se producirá un error si el método a sobrescribir era dormir()
...
}
}
Todo hay que decirlo, esta nueva característica no ha estado exenta de cierta polémica. Hay quien la ha tachado de innecesaria, ya que la función que cumple puede ser realizada mediante analizadores de código estáticos, en lugar de en tiempo de ejecución.
Nuevos métodos de Randomizer
La clase \Random\Randomizer
, introducida en PHP 8.2, tiene ahora tres nuevos métodos que pueden resultar muy útiles a la hora de generar ciertos datos aleatorios:
Randomizer::getBytesFromString()
: devuelve una cadena de caracteres seleccionados aleatoriamente entre los de una cadena específica.Randomizer::getFloat()
: devuelve un número aleatorio en punto flotante dentro de un intervalo específico.Randomizer::nextFloat()
: igual quegetFloat()
, pero escoge de un intervalo fijo [0.0, 1.0), esto es, de cero a uno, sin incluir el uno.
Y mucho más…
Y estas son algunas de las nuevas funcionalidades más importantes. Destaca también un aumento en el rendimiento. El compilador JIT (Just-In-Time) se ha beneficiado de nuevas optimizaciones, lo que se ha notado en un aumento de la velocidad de ejecución de frameworks como Laravel (38% de mejora sobre PHP 8.2).
Para más información: https://www.php.net/releases/8.3/es.php.