Menu
Coddy logo textTech

Promoción de constructor (8.0)

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 42 de 91.

PHP 8.0 introdujo la promoción de constructor, una característica que reduce drásticamente el código repetitivo (boilerplate) al definir clases. En lugar de declarar las propiedades por separado y luego asignarlas en el constructor, puedes hacer ambas cosas en un solo paso.

Aquí está el enfoque tradicional que has estado utilizando:

<?php
class Product {
    private string $name;
    private float $price;
    
    public function __construct(string $name, float $price) {
        $this->name = $name;
        $this->price = $price;
    }
    
    public function getInfo(): string {
        return $this->name . ": $" . $this->price;
    }
}

Con la promoción de propiedades en el constructor, añades el modificador de acceso directamente a los parámetros del constructor:

<?php
class Product {
    public function __construct(
        private string $name,
        private float $price
    ) {}
    
    public function getInfo(): string {
        return $this->name . ": $" . $this->price;
    }
}

$product = new Product("Laptop", 999.99);
echo $product->getInfo();

Salida:

Laptop: $999.99

Al añadir private, protected o public antes de un parámetro del constructor, PHP crea automáticamente la propiedad y asigna el valor. Puedes mezclar parámetros promocionados y regulares en el mismo constructor, y aún puedes añadir lógica dentro del cuerpo del constructor si es necesario.

Punto clave: La promoción de propiedades en el constructor elimina las declaraciones y asignaciones de propiedades repetitivas, haciendo que tus clases sean más limpias y fáciles de leer mientras se mantiene un control total de la encapsulación.

challenge icon

Desafío

Fácil

Construyamos un sistema de gestión de contactos que muestre la elegancia de la promoción de constructores (constructor promotion). Crearás una clase PHP limpia y moderna que elimina el código repetitivo manteniendo una encapsulación adecuada.

Organizarás tu código en dos archivos:

  • Contact.php — Crea una clase Contact utilizando la promoción de constructores para definir todas las propiedades directamente en la firma del constructor. Tu contacto debe tener:
    • Una propiedad privada $name (string)
    • Una propiedad privada $email (string)
    • Una propiedad privada $phone (string) con un valor por defecto de "Not provided"
    Utiliza la sintaxis de promoción de constructores — ¡no se necesitan declaraciones de propiedades por separado! Añade un método público getFullDetails() que devuelva "[name] | [email] | [phone]". También añade un método getSummary() que devuelva "Contact: [name]".
  • main.php — Incluye el archivo Contact. Recibirás tres entradas: un nombre, un correo electrónico y un número de teléfono. Crea dos instancias de Contact:
    • El primer contacto debe usar los tres valores (nombre, correo electrónico y teléfono)
    • El segundo contacto debe usar solo el nombre y el correo electrónico (confiando en el valor por defecto del teléfono)
    Imprime cuatro líneas:
    • Los detalles completos (full details) del primer contacto
    • El resumen (summary) del primer contacto
    • Los detalles completos (full details) del segundo contacto
    • El resumen (summary) del segundo contacto

Observa cómo la promoción de constructores te permite definir propiedades, establecer su visibilidad, declarar sus tipos y asignar valores — todo en una única firma de constructor legible. El parámetro opcional del teléfono con un valor por defecto demuestra que los parámetros promocionados funcionan perfectamente con valores por defecto, al igual que los parámetros regulares.

Hoja de referencia

PHP 8.0 introdujo la promoción de propiedades en el constructor, que permite declarar e inicializar propiedades de clase directamente en los parámetros del constructor añadiendo un modificador de acceso.

Enfoque tradicional:

<?php
class Product {
    private string $name;
    private float $price;
    
    public function __construct(string $name, float $price) {
        $this->name = $name;
        $this->price = $price;
    }
}

Con la promoción de propiedades en el constructor:

<?php
class Product {
    public function __construct(
        private string $name,
        private float $price
    ) {}
}

$product = new Product("Laptop", 999.99);

Al añadir private, protected o public antes de un parámetro del constructor, PHP crea automáticamente la propiedad y asigna el valor.

Puedes usar valores por defecto con parámetros promocionados:

<?php
class Contact {
    public function __construct(
        private string $name,
        private string $email,
        private string $phone = "Not provided"
    ) {}
}

La promoción de propiedades en el constructor se puede mezclar con parámetros regulares, y aún puedes añadir lógica dentro del cuerpo del constructor si es necesario.

Pruébalo tú mismo

<?php

require_once 'Contact.php';

// Leer entrada
$name = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$phone = trim(fgets(STDIN));

// TODO: Crear el primer contacto con los tres valores (nombre, correo electrónico, teléfono)

// TODO: Crear el segundo contacto solo con nombre y correo electrónico (usar teléfono por defecto)

// TODO: Imprimir detalles completos del primer contacto

// TODO: Imprimir resumen del primer contacto

// TODO: Imprimir detalles completos del segundo contacto

// TODO: Imprimir resumen del segundo contacto

?>
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos