Médio PHP

Múltiplas interfaces: Logavel e Serializavel

Enunciado

Crie duas interfaces: Logavel com o método log(): string e Serializavel com o método toJson(): string. Crie a classe Produto que implementa ambas, com propriedades nome e preco. O método log retorna "Produto: {nome}" e toJson retorna um JSON com nome e preço.

Requisitos

  • As interfaces Logavel e Serializavel devem existir com os métodos especificados.
  • A classe Produto deve implementar as duas interfaces.
  • O método log deve retornar a string "Produto: {nome}".
  • O método toJson deve retornar um JSON válido com as chaves nome e preco.

Código inicial

<?php

// Defina as interfaces Logavel e Serializavel

// Defina a classe Produto

// Teste

Saída esperada

Log: Produto: Caneta
JSON: {"nome":"Caneta","preco":2.5}
Ver dica

Use json_encode(['nome' => $this->nome, 'preco' => $this->preco]) para gerar o JSON.

Mostrar solução
<?php

interface Logavel
{
    public function log(): string;
}

interface Serializavel
{
    public function toJson(): string;
}

class Produto implements Logavel, Serializavel
{
    public function __construct(
        private string $nome,
        private float $preco
    ) {}

    public function log(): string
    {
        return 'Produto: ' . $this->nome;
    }

    public function toJson(): string
    {
        return json_encode([
            'nome' => $this->nome,
            'preco' => $this->preco
        ]);
    }
}

$produto = new Produto('Caneta', 2.5);
echo 'Log: ' . $produto->log() . PHP_EOL;
echo 'JSON: ' . $produto->toJson() . PHP_EOL;

Passo a passo

  1. Definimos a interface Logavel com o método log(): string.
  2. Definimos a interface Serializavel com o método toJson(): string.
  3. A classe Produto implementa as duas interfaces separando-as por vírgula: implements Logavel, Serializavel.
  4. No construtor, usamos propriedades promovidas (private string $nome, private float $preco) para armazenar os dados.
  5. O método log concatena a string fixa com o nome do produto.
  6. O método toJson usa json_encode com um array associativo, gerando {"nome":"Caneta","preco":2.5}.
  7. Criamos um objeto e chamamos os dois métodos, exibindo os resultados.

Por que funciona

Ao implementar múltiplas interfaces, a classe assume vários contratos. Isso permite que o objeto seja usado em contextos que exigem Logavel ou Serializavel, promovendo baixo acoplamento. O polimorfismo aparece quando funções aceitam qualquer uma dessas interfaces.

Erros comuns

  • Esquecer uma interface: se escrever implements Logavel apenas, o método toJson não é exigido, mas se outra parte do código espera Serializavel, ocorrerá erro de tipo.
  • Ordem errada na declaração: a ordem não importa, mas a vírgula é obrigatória.
  • JSON inválido: usar json_encode sem array associativo pode gerar ["Caneta",2.5] em vez de objeto. Use chaves explícitas.

Outra forma de resolver

Usar uma trait para fornecer implementação padrão de toJson e implementar apenas Logavel na classe, mas isso foge do escopo de interfaces.

Saída esperada

Log: Produto: Caneta
JSON: {"nome":"Caneta","preco":2.5}