php-constructores-en-php

Constructores en PHP

  • 3 min

Un constructor es el método que inicializa un objeto en el momento de crearlo.

Hasta ahora, hemos creado objetos vacíos y luego hemos rellenado sus datos línea a línea.

$dron = new Dron();
$dron->modelo = "Mavic"; // Rellenado manual... aburrido y peligroso.
Copied!

¿El problema? Podrías olvidarte de poner el modelo y tener un Dron “incompleto” volando por ahí.

Para evitar esto, usamos el Constructor. Es un Método Mágico (empieza por doble guion bajo __) que se ejecuta automáticamente en el momento exacto en que haces new.

La forma clásica (el “boilerplate”)

Antes de PHP 8, escribir constructores era un ejercicio de mecanografía repetitiva. Tenías que escribir el nombre de la variable cuatro veces.

Mira este ejemplo de un Usuario. Tienes que definir la propiedad, pasarla como argumento y luego asignarla.

// CÓDIGO ANTIGUO (Verboso)
class Usuario {
    // 1. Declaración
    public string $nombre;
    public string $email;

    // 2. Argumentos
    public function __construct(string $nombre, string $email) {
        // 3. y 4. Asignación
        $this->nombre = $nombre;
        $this->email = $email;
    }
}
Copied!

Si tienes una clase con 10 propiedades, esto se convierte en una sábana de código que no aporta valor.

Constructor property promotion (la revolución de PHP 8)

Desde PHP 8 podemos evitar esa repetición mediante la promoción de propiedades.

PHP nos permite definir la visibilidad (public, private, protected) directamente en los argumentos del constructor.

Al hacer esto, PHP entiende: “Ah, quieres que cree una propiedad con este nombre y le asigne automáticamente el valor que recibo”.

Mira qué limpieza:

// CÓDIGO MODERNO (Limpio)
class Usuario {
    // ¡No hace falta declarar nada arriba!

    public function __construct(
        public string $nombre,
        public string $email,
    ) {} 
    // El cuerpo {} suele quedar vacío, PHP hace la asignación solo.
}
Copied!

El resultado es idéntico al código anterior, pero hemos ahorrado 10 líneas de “ruido”.

Combinando con readonly

La promoción de propiedades brilla especialmente cuando usamos Objetos de Valor (Value Objects) o DTOs, donde los datos no deben cambiar.

Podemos combinar public + readonly en el constructor para crear clases inmutables en tiempo récord.

class Producto {
    public function __construct(
        public readonly string $sku,
        public readonly string $nombre,
        public float $precio, // El precio sí puede cambiar, no es readonly
    ) {}
}

$monitor = new Producto("MON-001", "Monitor 4K", 299.99);

echo $monitor->nombre; // "Monitor 4K"
// $monitor->sku = "OTRO"; // Error Fatal (Es readonly)
Copied!

Instanciación con argumentos nombrados

Ahora que nuestros constructores tienen parámetros obligatorios, usar Named Arguments (que vimos en el Módulo 3) al hacer el new es una práctica excelente. Aporta una claridad brutal.

// Sin saber el orden, el código es legible
$usuario = new Usuario(
    email: "[email protected]",
    nombre: "Luis"
);
Copied!

Validaciones en el constructor

El constructor no solo sirve para asignar datos, también para validarlos. Es el portero de la discoteca: si los datos no son válidos, el objeto no entra (se lanza una excepción).

class Usuario {
    public function __construct(
        public string $email
    ) {
        // Validación: El objeto no se crea si el email está mal
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new InvalidArgumentException("Email inválido: $email");
        }
    }
}
Copied!

Con este enfoque, si el objeto existe, ha superado la validación del constructor. Otras reglas externas, como la unicidad del correo en la base de datos, deben comprobarse por separado.