Promoção de Propriedades PHP 8+: o que é, como usar e por que mudar



Aprenda como promover propriedades no PHP: simplifique sua programação orientada a objetos.

Objetivo

O objetivo deste tutorial é apresentar de forma simples e prática a funcionalidade de promoção de propriedades no PHP, introduzida nas versões mais recentes da linguagem (PHP 8).

Vamos comparar o modo tradicional de definição de propriedades em classes com o novo modo simplificado, mostrando as diferenças na sintaxe, nas boas práticas e nas vantagens para quem deseja escrever códigos mais limpos, legíveis e modernos.

O artigo foi elaborado especialmente para programadores iniciantes e intermediários em PHP, que desejam compreender como essa novidade pode tornar o desenvolvimento mais produtivo e elegante

Além da explicação teórica, você encontrará exemplos completos, incluindo instanciação de objetos e exibição de resultados, para que possa aplicar o conhecimento diretamente nos seus próprios projetos.

Definições

O que é “Promoção de Propriedades do Construtor (Constructor Property Promotion)”

Na programação orientada a objetos (POO) em PHP, uma das tarefas mais repetitivas e sujeitas a erros era: declarar propriedades de classe, criar o construtor, receber argumentos e atribuir valores às propriedades.

A partir do PHP 8 foi introduzida uma funcionalidade chamada Constructor Property Promotion (Promoção de Propriedades no Construtor), que permite reduzir bastante o boilerplate (código repetitivo) e deixa as classes mais concisas e legíveis. php.net+1

Em termos simples, “promoção de propriedades” significa que você declara propriedades da classe diretamente nos parâmetros do construtor, usando modificadores de visibilidade (public, protected, private), em vez de declará-las antes e depois atribuí-las dentro do __construct(). O PHP então automaticamente:

  • declara a propriedade com visibilidade e tipo informados;

  • recebe o argumento no construtor e atribui-o à propriedade.

Essa funcionalidade foi listada nas novidades do PHP 8 como Constructor Property Promotion. (php.net+1)

Como vantagem, reduz-se linhas repetitivas, melhora-se a clareza e manutenção das classes.

Vamos entender o que essa promoção de propriedades faz, com 2 exemplos comparativos do “modo tradicional” vs. “modo novo”, e aprender boas práticas para adotar no seu código.

Comparativo: modo tradicional vs modo novo

a) Modo Tradicional (antes do PHP 8)

class Pessoa {
    private string $nome;
    private int $idade;

    public function __construct(string $nome, int $idade)    {
        $this->nome = $nome;
        $this->idade = $idade;
    }

    public function getNome(): string    {
        return $this->nome;
    }
}

Nesse modo:

  • as propriedades são declaradas separadamente (private string $nome; private int $idade;)

  • o construtor recebe os parâmetros e atribui internamente ($this->nome = $nome; ...)

  • Isso é correto, mas há duplicidade: os nomes das propriedades, os tipos, e as atribuições ficam espalhados.

b) Modo Novo – Promoção de Propriedades (PHP 8+)

class Pessoa {
    public function __construct(private string $nome,  private int $idade) {
        // corpo do construtor pode continuar vazio ou ainda executar mais lógica
    }

    public function getNome(): string    {
        return $this->nome;
    }
}

Aqui:

  • não há declaração separada de $nome e $idade fora do construtor

  • o parâmetro do construtor já declara a visibilidade e tipo

  • a atribuição automática é feita pelo PHP

  • o código fica mais limpo, conciso e fácil de entender.

  • Esse modo é equivalente ao tradicional em termos de funcionalidade. (PHP.Watch+1)

Quando e por que adotar essa nova forma?

Vantagens principais:

  • Redução de boilerplate — menos código para declarar e atribuir propriedades.

  • Aumento de legibilidade — tudo que se relaciona à inicialização da instância está em um único lugar.

  • Menor chance de erros — menos repetições significa menos pontos de falha.

Considerações:

  • Essa funcionalidade exige PHP 8 ou superior. Se seu projeto rodar em versões anteriores, não poderá usar. (PHP.Watch)

  • Nem sempre é ideal promover todas as propriedades. Se você precisa de lógica complexa para atribuição ou validação antes de definir a propriedade, pode ser melhor manter o modo tradicional.

  • Prefira declarar propriedades promovidas apenas quando o valor for diretamente atribuído sem lógica extra.

Exemplos práticos de uso da Promoção de Propriedades (PHP 8+)

1.Nova Forma (PHP 8+) com Property Promotion

<?php
class Pessoa {
    public function __construct(
        private string $nome,
        private int $idade
    ) {}

    public function getNome(): string {
        return $this->nome;
    }

    public function getIdade(): int {
        return $this->idade;
    }
}

// Criando objetos
$pessoa1 = new Pessoa('Carlos', 25);
$pessoa2 = new Pessoa('Ana', 30);

// Exibindo informações
echo '<h3>Modo Novo (Property Promotion)</h3>';
echo 'Nome: ' . $pessoa1->getNome() . '<br>';
echo 'Idade: ' . $pessoa1->getIdade() . ' anos<br><br>';

echo 'Nome: ' . $pessoa2->getNome() . '<br>';
echo 'Idade: ' . $pessoa2->getIdade() . ' anos<br>';

💡 Veja o resultado do exemplo no link: Exemplo 1

⚙️ Explicação:

  • As propriedades $nome e $idade são declaradas diretamente nos parâmetros do construtor.

  • O PHP automaticamente cria essas propriedades, define seus tipos e visibilidades e faz a atribuição — tudo em uma única linha.

  • O código fica mais limpo, fácil de manter e sem redundância.

2. Classe Produto com valor padrão e saída formatada

Aqui, um exemplo mais prático, simulando o cadastro de produtos.

<?php
class Produto
{
    public function __construct(
        private string $nome,
        private float $preco,
        private string $categoria = 'Diversos'
    ) {}

    public function exibir(): void {
        echo "Produto: {$this->nome}<br>";
        echo "Preço: R$ " . number_format($this->preco, 2, ',', '.') . "<br>";
        echo "Categoria: {$this->categoria}<br><br>";
    }
}

// Criando objetos
$produto1 = new Produto('Mouse Gamer', 199.90, 'Periféricos');
$produto2 = new Produto('Cabo HDMI', 49.90); // categoria padrão "Diversos"

// Exibindo na tela
echo '<h3>Exemplo com Categoria e Valor Padrão</h3>';
$produto1->exibir();
$produto2->exibir();

💡 Veja o resultado do exemplo no link: Exemplo 2

⚙️ Explicação:

  • A propriedade $categoria tem um valor padrão, que será usado se não for informado no momento da criação do objeto.

  • O método exibir() imprime os dados de maneira formatada e elegante.

  • Demonstramos que é possível promover propriedades com valores padrão e que isso mantém total compatibilidade com o código PHP tradicional.

3. Combinação: propriedades promovidas e tradicionais

Você ainda pode misturar propriedades promovidas e não promovidas — útil quando há lógica extra no construtor.

<?php
class Pedido {
    private float $total;

    public function __construct(
        private string $produto,
        private int $quantidade,
        private float $precoUnitario
    ) {
        $this->total = $this->quantidade * $this->precoUnitario;
    }

    public function exibir(): void {
        echo "Produto: {$this->produto}<br>";
        echo "Quantidade: {$this->quantidade}<br>";
        echo "Preço Unitário: R$ " . number_format($this->precoUnitario, 2, ',', '.') . "<br>";
        echo "<b>Total: R$ " . number_format($this->total, 2, ',', '.') . "</b><br><br>";
    }
}

// Criando e exibindo pedidos
$pedido1 = new Pedido('Teclado Mecânico', 2, 350.00);
$pedido2 = new Pedido('Fone Bluetooth', 1, 499.90);

echo '<h3>Exemplo com Cálculo Interno (Combinação de Modos)</h3>';
$pedido1->exibir();
$pedido2->exibir();

💡 Veja o resultado do exemplo no link: Exemplo 3

⚙️ Explicação:

  • $produto, $quantidade e $precoUnitario foram promovidos no construtor.

  • $total foi declarado fora, porque depende de um cálculo.

  • Essa abordagem é ideal quando há processamento interno além da simples atribuição.

Conclusão

A Promoção de Propriedades introduzida no PHP 8 torna o código mais moderno, enxuto e fácil de manter, eliminando redundâncias comuns em classes simples.

Para quem está começando na Programação Orientada a Objetos (POO), essa é uma excelente oportunidade de adotar boas práticas desde cedo e se preparar para trabalhar com código mais elegante e profissional.

Resumo:
✔ Menos código repetido
✔ Mais clareza e produtividade
✔ 100% compatível com boas práticas modernas do PHP

O anúncio abaixo ajuda manter o Portal Visual Dicas

Comentários

×

Infomações do site / SEO