Volver a la página principal
martes 11 febrero 2025
8

Cómo implementar objetos inmutables en PHP 8.4 con readonly

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.

¿Qué es un objeto inmutable?

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.

Implementación de 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;
    }
}

Ventajas de usar 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.

Ejemplo de Uso

Clase inmutable con datos de usuario

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

DTO (Data Transfer Object) inmutable

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

Consideraciones Importantes

  • Las clases readonly no pueden contener propiedades estáticas.
  • Las propiedades readonly deben inicializarse en el constructor.
  • No se pueden modificar después de la asignación inicial.
Etiquetas:
php
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer