Menu
Coddy logo textTech

Métodos Abstratos em Traits

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 54 de 91.

Traits podem fornecer métodos prontos para uso, mas às vezes você precisa que a classe que usa o trait implemente uma funcionalidade específica. É aí que os métodos abstratos em traits se tornam úteis — eles definem um contrato que a classe que os utiliza deve cumprir.

Quando um trait declara um método abstrato, qualquer classe que use esse trait deve implementá-lo:

<?php
trait Notifiable {
    abstract public function getEmail(): string;
    
    public function sendNotification(string $message): void {
        echo "Sending to " . $this->getEmail() . ": $message";
    }
}

class User {
    use Notifiable;
    
    public function __construct(private string $email) {}
    
    public function getEmail(): string {
        return $this->email;
    }
}

$user = new User("john@example.com");
$user->sendNotification("Welcome!");

Saída:

Sending to john@example.com: Welcome!

A trait fornece o método sendNotification(), mas depende da implementação de getEmail() pela classe. Isso cria um padrão poderoso no qual a trait lida com a lógica comum enquanto delega os detalhes específicos da classe à classe que a implementa.

Se uma classe usar o trait sem implementar o método abstrato, o PHP emitirá um erro fatal. Isso garante que os traits possam depender com segurança da existência de determinados métodos, tornando seu código mais previsível e fácil de manter.

challenge icon

Desafio

Fácil

Vamos criar um sistema de preços em que diferentes tipos de produtos calculam seus preços finais de maneiras diferentes, mas todos compartilham uma lógica de desconto comum por meio de um trait com um método abstrato.

Você organizará seu código em três arquivos:

  • Discountable.php: crie um trait chamado Discountable que forneça a funcionalidade de desconto. O trait deve ter:
    • Um método abstrato getBasePrice(): float que as classes que usam esse trait devem implementar
    • Um método applyDiscount(int $percent) que calcula e retorna o preço após aplicar a porcentagem de desconto ao preço base
    • Um método getFinalPrice(int $percent) que retorna uma string formatada: "Final price: $[discounted_price]" com 2 casas decimais
    O trait lida com toda a matemática do desconto, mas depende de cada classe para informar qual é o preço base.
  • Product.php: crie uma classe Product que use o trait Discountable. Inclua o arquivo do trait. Use a promoção de construtor para definir um $name privado (string) e um $price privado (float). Implemente o método obrigatório getBasePrice() para retornar o preço do produto.
  • main.php: inclua o arquivo Product. Você receberá três entradas: um nome de produto, um preço e uma porcentagem de desconto. Crie uma instância de Product e imprima duas linhas:
    • O preço base formatado como "Base: $[price]" com 2 casas decimais
    • O resultado da chamada de getFinalPrice() com a porcentagem de desconto

Esse padrão é poderoso porque o trait Discountable pode ser usado por qualquer classe — produtos, serviços, assinaturas — desde que implementem getBasePrice(). O trait fornece a lógica de desconto compartilhada, enquanto cada classe define de onde vem seu preço base.

Experimente você mesmo

<?php

require_once 'Product.php';

// Ler entradas
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$discountPercent = intval(trim(fgets(STDIN)));

// TODO: Crie uma instância de Product com o nome e o preço

// TODO: Imprima o preço base formatado como "Base: $[price]" com 2 casas decimais

// TODO: Imprima o resultado de chamar getFinalPrice() com a porcentagem de desconto

?>
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de PHP online