Desafio PHP
Polimorfismo com interfaces e cálculo de áreas
Enunciado
Crie a interface Forma com os métodos area(): float e nome(): string. Crie as classes Circulo (raio) e Quadrado (lado) que a implementam. Crie uma função relatorio(array $formas): void que exibe o nome e a área de cada forma, formatada com duas casas decimais. No final, exiba a soma total das áreas.
Requisitos
- A interface
Formadeve ter os métodosareaenome. - As classes
CirculoeQuadradodevem implementarForma. - A função
relatoriodeve receber um array deFormae imprimir nome e área com duas casas decimais. - O programa deve exibir a soma total das áreas.
Código inicial
<?php
// Defina a interface Forma
// Defina as classes Circulo e Quadrado
// Defina a função relatorio
// Teste
Saída esperada
Círculo: 12.57
Quadrado: 9.00
Total: 21.57
Ver dica
Use number_format($forma->area(), 2) para formatar. Para a soma, percorra o array novamente ou acumule durante o relatório.
Mostrar solução
<?php
interface Forma
{
public function area(): float;
public function nome(): string;
}
class Circulo implements Forma
{
public function __construct(private float $raio) {}
public function area(): float
{
return M_PI * $this->raio ** 2;
}
public function nome(): string
{
return 'Círculo';
}
}
class Quadrado implements Forma
{
public function __construct(private float $lado) {}
public function area(): float
{
return $this->lado ** 2;
}
public function nome(): string
{
return 'Quadrado';
}
}
function relatorio(array $formas): void
{
$total = 0.0;
foreach ($formas as $forma) {
$area = $forma->area();
$total += $area;
echo $forma->nome() . ': ' . number_format($area, 2) . PHP_EOL;
}
echo 'Total: ' . number_format($total, 2) . PHP_EOL;
}
$formas = [
new Circulo(2),
new Quadrado(3),
];
relatorio($formas);
Passo a passo
- A interface
Formadeclara os métodosareaenome, sem implementação. CirculoimplementaForma: o construtor promove$raio;areausaM_PI(constante nativa do PHP) e** 2para o quadrado;nomeretorna'Círculo'.Quadradotambém implementaForma:arearetorna$this->lado ** 2.- A função
relatorioaceita um array deForma(polimorfismo). Inicializa$total = 0.0e percorre cada forma. - Para cada forma, chama
area()enome(), acumula em$totale imprime comnumber_format($area, 2). - Após o loop, imprime o total formatado.
- No código principal, criamos um array com instâncias de
CirculoeQuadradoe chamamosrelatorio.
Por que funciona
A função relatorio não conhece as classes concretas, apenas a interface Forma. Isso é polimorfismo: qualquer objeto que implemente Forma pode ser passado. O array $formas contém tipos diferentes, mas todos respondem aos mesmos métodos. A soma é feita de forma genérica.
Erros comuns
- Não implementar todos os métodos: se
Quadradoesquecernome(), o PHP lança erro fatal. - Passar objeto que não implementa a interface:
relatorio([new stdClass()])geraTypeError. - Esquecer de formatar: sem
number_format, a saída teria muitas casas decimais, como12.566370614359. Usenumber_formatpara duas casas. - Usar
pi()em vez deM_PI: ambos funcionam, masM_PIé constante e mais idiomático.
Outra forma de resolver
Usar array_reduce para calcular o total e array_map para exibir, mas o loop foreach é mais claro para iniciantes.
Saída esperada
Círculo: 12.57
Quadrado: 9.00
Total: 21.57