Promoção de Construtor (8.0)
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 42 de 91.
O PHP 8.0 introduziu a promoção de construtor, um recurso que reduz drasticamente o código repetitivo ao definir classes. Em vez de declarar as propriedades separadamente e depois atribuir valores a elas no construtor, você pode fazer as duas coisas em uma única etapa.
Aqui está a abordagem tradicional que você tem usado:
<?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;
}
}
Com a promoção de construtor, você adiciona o modificador de acesso diretamente aos parâmetros do construtor:
<?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();
Saída:
Laptop: $999.99Ao adicionar private, protected ou public antes de um parâmetro do construtor, o PHP cria automaticamente a propriedade e atribui o valor. Você pode misturar parâmetros promovidos e regulares no mesmo construtor e ainda pode adicionar lógica dentro do corpo do construtor, se necessário.
Ponto principal: A promoção de constructor elimina declarações e atribuições repetitivas de propriedades, tornando suas classes mais limpas e fáceis de ler, enquanto mantém controle total sobre o encapsulamento.
Desafio
FácilVamos criar um sistema de gerenciamento de contatos que demonstra a elegância da promoção de construtor. Você criará uma classe PHP limpa e moderna que elimina código repetitivo, mantendo o encapsulamento adequado.
Você organizará seu código em dois arquivos:
Contact.php: crie uma classeContactusando a promoção de construtor para definir todas as propriedades diretamente na assinatura do construtor. Seu contato deve ter:- Uma propriedade privada
$name(string) - Uma propriedade privada
$email(string) - Uma propriedade privada
$phone(string) com um valor padrão de"Not provided"
getFullDetails()que retorne"[name] | [email] | [phone]". Adicione também um métodogetSummary()que retorne"Contact: [name]".- Uma propriedade privada
main.php: inclua o arquivo Contact. Você receberá três entradas: um nome, um e-mail e um número de telefone. Crie duas instâncias deContact:- O primeiro contato deve usar os três valores (nome, e-mail e telefone)
- O segundo contato deve usar apenas o nome e o e-mail (dependendo do valor padrão do telefone)
- Os detalhes completos do primeiro contato
- O resumo do primeiro contato
- Os detalhes completos do segundo contato
- O resumo do segundo contato
Observe como a promoção de construtor permite definir propriedades, configurar sua visibilidade, declarar seus tipos e atribuir valores: tudo em uma única assinatura de construtor legível. O parâmetro opcional de telefone com um valor padrão demonstra que os parâmetros promovidos funcionam perfeitamente com valores padrão, assim como os parâmetros comuns.
Experimente você mesmo
<?php
require_once 'Contact.php';
// Ler entrada
$name = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$phone = trim(fgets(STDIN));
// TODO: Criar o primeiro contato com todos os três valores (name, email, phone)
// TODO: Criar o segundo contato apenas com name e email (usar phone padrão)
// TODO: Imprimir os detalhes completos do primeiro contato
// TODO: Imprimir o resumo do primeiro contato
// TODO: Imprimir os detalhes completos do segundo contato
// TODO: Imprimir o resumo do segundo contato
?>Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos externosIntrodução à OOPClasses vs. objetosA palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodosA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em ProfundidadeGetters e SettersOcultação de InformaçõesPromoção de Construtor (8.0)Recapitulação - Sistema de Registros de Alunos10Conceitos Avançados de OOP
Composição vs. HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibras (PHP 8.1)Análise Profunda da Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto organizado5Interfaces e Contratos
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataTipagem com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos NulosTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadaTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários3Propriedades de Classes
Propriedades de Instância vs. EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Somente para Leitura (PHP 8.1)Recapitulação - Gerenciador de Contas Bancárias6Polimorfismo
Revisão da Sobrescrita de MétodosPolimorfismo via InterfacesIndicação de Tipos e Tipos UnionVinculação Estática TardiaRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos entre TraitsMétodos Abstratos em TraitsTraits vs. Herança12Padrões de Projeto – Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de PHP online