La nueva versión de PHP 8.4 acaba de lanzarse este 21 de noviembre y ya ha llegado a todos nuestros hostings. Te contamos las principales novedades que incluye para que seas el primero en aprovecharlas.
Antes de ponernos con las novedades, échale un ojo a las razones de por qué debes actualizar a la última versión tu PHP.
Índice de contenidos
- 1 ¿Por qué es importante actualizar la versión de PHP en tu hosting?
- 2 Novedades PHP 8.4
- 2.1 Property Hooks (hooks de propiedad)
- 2.2 Visibilidad asimétrica
- 2.3 Lazy Objects
- 2.4 Nuevo atributo [\Deprecated]
- 2.5 Solicitudes de parsing en HTTP no-POST
- 2.6 Encadenado de expresiones new sin paréntesis
- 2.7 Nuevas opciones para cURL
- 2.8 Nuevo espacio de nombres DOM
- 2.9 Subclases específicas para el controlador PDO
- 2.10 Mejoras de seguridad en OpenSSL
¿Por qué es importante actualizar la versión de PHP en tu hosting?
Instalar la nueva versión te permitirá beneficiarte en tu hosting de todas las mejoras de rendimiento y seguridad.
La última versión de PHP, o de cualquier lenguaje, suele corregir errores y solucionar posibles brechas de seguridad que pueden aprovechar los hackers. También se incluyen nuevas funcionalidades que te permitirán ser más ágil a la hora de trabajar con PHP, o que permiten una mayor velocidad en los tiempos de ejecución.
Además, como ya te contamos en varias ocasiones, PHP es uno de los lenguajes de programación más utilizados, y parece que seguirá siendo durante muchos años, pero también es la base del principal gestor de contenidos para web: WordPress.
Si usas este CMS en tus webs, es vital que cuentes una versión de PHP compatible y actualizada en tu servidor para evitar posibles errores.
¿Cómo actualizo la versión de PHP en dinahosting?
Simplemente, accede en tu Panel de Control al apartado Hosting > Servidor > PHP > Versión PHP y elige el nuevo PHP 8.4 o cualquier otra opción de las disponibles, si lo prefieres.
Y ahora sí, vamos con las principales novedades que trae la nueva versión de PHP:
Novedades PHP 8.4
Property Hooks (hooks de propiedad)
Los Property Hooks son la principal innovación del nuevo PHP 8.4. Permiten obtener un mayor control sobre las propiedades de clases y simplificarlas, evitando métodos repetitivos. A continuación, te ponemos un ejemplo básico de uso.
Supongamos que tenemos una clase Usuario
que combina el nombre y apellido en una propiedad virtual nombreCompleto
:
phpCopiar códigoclass Usuario {
private bool $modificado = false;
public function __construct(private string $nombre, private string $apellido) {}
public string $nombreCompleto {
// Lógica personalizada para leer el valor
get => $this->nombre . ' ' . $this->apellido;
// Lógica personalizada para escribir el valor
set {
[$this->nombre, $this->apellido] = explode(' ', $value, 2);
$this->modificado = true;
}
}
}
$usuario = new Usuario('Juan', 'Pérez');
// Leer propiedad virtual
echo $usuario->nombreCompleto; // Output: Juan Pérez
// Escribir propiedad virtual
$usuario->nombreCompleto = 'Carlos García';
echo $usuario->nombreCompleto; // Output: Carlos García
Ten en cuenta que:
get
: define la lógica de lectura de la propiedad.set
: define la lógica de escritura de la propiedad.
En este ejemplo, la propiedad nombreCompleto
no almacena un valor directamente. En cambio, calcula el valor al leer (get
) y descompone el valor al escribir (set
).
Ejemplo de uso en interfaces:
Puedes definir property hooks en interfaces para estandarizar la lógica en todas las implementaciones:
phpCopiar códigointerface ConNombre {
public string $nombreCompleto { get; }
}
class Persona implements ConNombre {
private string $nombre = 'Jane';
private string $apellido = 'Doe';
public string $nombreCompleto {
get => $this->nombre . ' ' . $this->apellido;
}
}
En este caso, cualquier clase que implemente ConNombre
debe proporcionar un método get
para la propiedad nombreCompleto
.
Visibilidad asimétrica
Ahora también podemos establecer el nivel de visibilidad que queramos para las propiedades de nuestros objetos, pudiendo dejarlas públicas o cambiarlas a privadas, e incluso variar esta opción en función de cómo se acceda a la propiedad.
Ejemplo:
En este ejemplo mostramos como una propiedad puede ser pública para lectura, pero privada para escritura:
phpCopiar códigoclass Usuario {
public function __construct(private string $nombre, private string $apellido) {}
public string $nombreCompleto {
public get => $this->nombre . ' ' . $this->apellido; // Lectura pública
private set { // Escritura privada
[$this->nombre, $this->apellido] = explode(' ', $value, 2);
}
}
}
$usuario = new Usuario('Juan', 'Pérez');
// Acceso público a la lectura
echo $usuario->nombreCompleto; // Output: Juan Pérez
// Intento de modificar (fallará porque es privado)
// $usuario->nombreCompleto = 'Carlos García'; // Error: Cannot access private property
Aplicamos get y set con visibilidad diferente.
public get
permite que cualquiera lea el valorprivate set
restringe la escritura solo dentro de la clase
Si no especificamos la visibilidad, se aplica la predeterminada de la propiedad.
Lazy Objects
En PHP 8.4 también se incluyen Lazy Objects (objetos perezosos), que se ejecutan de forma diferida solo cuando se accede a ellos.
Se pueden usar para posponer la obtención de datos y hacer un uso de la memoria más eficiente.
Ejemplo donde hacemos una conexión a la base de datos:
use \LazyObject\LazyObject;
class Usuario {
public function __construct(private string $id) {}
public function cargarDatos(): string {
// Simula una carga costosa de datos
sleep(2); // Simula un retraso
return "Datos del usuario con ID: {$this->id}";
}
}
// Crear un LazyObject
$usuario = LazyObject::create(fn() => new Usuario('12345'));
// El objeto no se inicializa aún
echo "Objeto creado, pero no inicializado.\n";
// Acceso al método inicializa el objeto
echo $usuario->cargarDatos(); // Aquí el objeto se inicializa y se ejecuta el método
Nuevo atributo [\Deprecated]
Con este atributo puedes marcar como deprecadas u obsoletas funciones, métodos o contantes de clase.
Su comportamiento es el mismo que el que aplica el mecanismo de deprecación ya incluido en PHP.
Solicitudes de parsing en HTTP no-POST
Se añade la función request_parse_body() que permite el parsing en RFC1867 (multiparte) en solicitudes HTTP non-POST.
Encadenado de expresiones new sin paréntesis
Cuando se encadenan diferentes métodos, ya no es necesario poner la llamada entre paréntesis.
Ejemplo:
Lo que antes escribiríamos así:
$usuario = (new Usuario('Juan', 'Pérez'));
Ahora puede escribirse omitiendo los primeros paréntesis:
$usuario = new Usuario('Juan', 'Pérez');
Nuevas opciones para cURL
Ahora la curl_version() devuelve el valor inicial feature_list, que lista todas las funciones cURL, tanto sean compatibles como no.
Además, se suman otras opciones como:
- CURL_HTTP_VERSION_3 y CURL_HTTP_VERSION_3ONLY para CURLOPT_HTTP_VERSION.
- CURLOPT_PREREQFUNCTION
- CURLOPT_SERVER_RESPONSE_TIMEOUT
- CURLOPT_DEBUGFUNCTION
Nuevo espacio de nombres DOM
Se añaden nuevas clases de espacios de nombres DOM compatibles con HTML5, comopor ejemplo Dom\Node, que es la nueva DOMNode.
Por otro lado, la nueva clase \Dom\HTMLDocument
permite analizar documentos HTML5 de manera nativa, mejorando las limitaciones del antiguo \DOMDocument
.
Subclases específicas para el controlador PDO
Para facilitar un mejor soporte a las funcionalidades específicas de bases de datos se han añadido sublacases para PDO que se pueden llamar utilizando PDO::connect ().
También se agregó nueva compatibilidad con analizadores SQL: PDO_MYSQL, PDO_PSGSQL y PDO_SQLITE.
Mejoras de seguridad en OpenSSL
- Añadida compatibilidad con claves basadas en Curve25519 y Curve448.
- Para OpenSSL 3.2 y compilación NTS, se implementa el algoritmo hash de contraseña PASSWORD_ARGON2.
Estas son las principales novedades, pásate por la nota de la actualización para ver el listado completo con todas las características añadidas en PHP 8.4.
Hasta aquí nuestro repaso, ¿a qué esperas para probar el nuevo PHP 8.4? ¡Pásate a esta versión y conoce de primera mano todas estas actualizaciones!
Y si ya lo has puesto a prueba, no te olvides de contarnos tus impresiones en los comentarios 😉
Deja una respuesta