Promoción del 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 del constructor, una característica que reduce drásticamente el código repetitivo 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.
Este es el enfoque tradicional que has estado usando:
<?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 del 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 combinar parámetros promocionados y normales 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 constructor elimina las declaraciones y asignaciones repetitivas de propiedades, lo que hace que tus clases sean más limpias y fáciles de leer, manteniendo al mismo tiempo el 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 del constructor. Crearás una clase PHP limpia y moderna que elimina el código repetitivo y mantiene una encapsulación adecuada.
Organizarás tu código en dos archivos:
Contact.php: Crea una claseContactusando la promoción del constructor 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 predeterminado de"Not provided"
getFullDetails()que devuelva"[name] | [email] | [phone]". Añade también 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 (usando el valor de teléfono predeterminado)
- Los detalles completos del primer contacto
- El resumen del primer contacto
- Los detalles completos del segundo contacto
- El resumen del segundo contacto
Observa cómo la promoción del constructor te permite definir propiedades, establecer su visibilidad, declarar sus tipos y asignarles valores, todo en una única firma de constructor legible. El parámetro de teléfono opcional con un valor predeterminado demuestra que los parámetros promocionados funcionan perfectamente con valores predeterminados, igual que los parámetros normales.
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 (name, email, phone)
// TODO: Crear el segundo contacto solo con name y email (usar phone por defecto)
// TODO: Imprimir los detalles completos del primer contacto
// TODO: Imprimir el resumen del primer contacto
// TODO: Imprimir los detalles completos del segundo contacto
// TODO: Imprimir el 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 la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - 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 __unserializeRepaso: 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)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online