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.99Al 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.
Desafío
FácilConstruyamos 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 claseContactutilizando 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"
getFullDetails()que devuelva"[name] | [email] | [phone]". También añade un métodogetSummary()que devuelva"Contact: [name]".- Una propiedad privada
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 deContact:- 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)
- 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
?>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
1Fundamentos de OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - Calculadora de Formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeResumen - Colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy