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
LogaveleSerializaveldevem existir com os métodos especificados. - A classe
Produtodeve implementar as duas interfaces. - O método
logdeve retornar a string"Produto: {nome}". - O método
toJsondeve retornar um JSON válido com as chavesnomeepreco.
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
- Definimos a interface
Logavelcom o métodolog(): string. - Definimos a interface
Serializavelcom o métodotoJson(): string. - A classe
Produtoimplementa as duas interfaces separando-as por vírgula:implements Logavel, Serializavel. - No construtor, usamos propriedades promovidas (
private string $nome,private float $preco) para armazenar os dados. - O método
logconcatena a string fixa com o nome do produto. - O método
toJsonusajson_encodecom um array associativo, gerando{"nome":"Caneta","preco":2.5}. - 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 Logavelapenas, o métodotoJsonnão é exigido, mas se outra parte do código esperaSerializavel, 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_encodesem 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}