En PHP 8.4, se ha mejorado la implementación de objetos inmutables mediante el uso de la palabra clave readonly
en clases completas. Esto permite que todas las propiedades de la clase sean de solo lectura, asegurando que los valores no puedan modificarse después de la inicialización.
Un objeto inmutable es aquel cuyos valores no pueden cambiar después de su creación. Esto es útil en escenarios donde la consistencia de datos es crucial, como en DTOs (Data Transfer Objects), configuraciones o valores constantes.
readonly
en PHP 8.4
En PHP 8.1, podíamos marcar propiedades individuales como readonly
:
class Usuario {
public readonly string $nombre;
public function __construct(string $nombre) {
$this->nombre = $nombre;
}
}
Pero en PHP 8.4, podemos marcar toda la clase como readonly
, lo que hace que todas sus propiedades sean inmutables automáticamente:
readonly class Usuario {
public string $nombre;
public string $email;
public function __construct(string $nombre, string $email) {
$this->nombre = $nombre;
$this->email = $email;
}
}
readonly class
1. Código más limpio: No es necesario marcar cada propiedad como readonly
individualmente.
2. Mayor seguridad: PHP evitará modificaciones accidentales después de la inicialización.
3. Mejor rendimiento: Se eliminan verificaciones innecesarias en tiempo de ejecución.
readonly class Usuario {
public string $nombre;
public string $email;
public function __construct(string $nombre, string $email) {
$this->nombre = $nombre;
$this->email = $email;
}
}
$usuario = new Usuario("Juan Pérez", "juan@example.com");
echo $usuario->nombre; // Funciona correctamente
$usuario->nombre = "Pedro"; // Error: No se puede modificar una propiedad readonly
readonly class Configuracion {
public string $db_host;
public int $db_puerto;
public function __construct(string $db_host, int $db_puerto) {
$this->db_host = $db_host;
$this->db_puerto = $db_puerto;
}
}
$config = new Configuracion("localhost", 3306);
// No se puede modificar la configuración después de la creación
$config->db_host = "127.0.0.1"; // Error en PHP 8.4
readonly
no pueden contener propiedades estáticas.
readonly
deben inicializarse en el constructor.
Jorge García
Fullstack developer