Da trilha de PHP Este conceito ainda não saiu como card do dia. ir para o card de hoje

PHP POO Intermediário

Interfaces

Interfaces em PHP definem um contrato que as classes devem seguir: apenas a assinatura dos métodos, sem implementação. Uma classe que implementa uma interface é obrigada a fornecer o corpo de todos os métodos declarados nela, garantindo que diferentes classes tenham um comportamento comum. Interfaces também podem ter constantes, que são acessadas via NomeDaInterface::CONSTANTE.

Uma classe pode implementar múltiplas interfaces, separando responsabilidades (ex.: Logavel e Serializavel). Isso é diferente de herança simples, pois permite combinar vários contratos na mesma classe. O polimorfismo surge naturalmente: um método que recebe uma interface pode operar sobre qualquer objeto que a implemente, sem conhecer sua classe concreta.

Pontos-chave

  • Interfaces usam interface e métodos sem corpo (apenas assinatura).
  • implements obriga a classe a implementar todos os métodos da interface.
  • Constantes em interfaces são acessadas com NomeInterface::CONSTANTE.
  • Uma classe pode implementar várias interfaces separando responsabilidades.
  • Polimorfismo: código que usa a interface funciona com qualquer implementação.
interfaces.php
<?php

// Interface que define o contrato para formas geométricas
interface Forma
{
    // Constante da interface
    public const PI = 3.14159;

    // Métodos que toda forma deve implementar
    public function area(): float;
    public function nome(): string;
}

// Interface para formas que podem ser desenhadas
interface Desenhavel
{
    public function desenhar(): string;
}

// Classe que implementa as duas interfaces
class Circulo implements Forma, Desenhavel
{
    public function __construct(private float $raio) {}

    public function area(): float
    {
        return self::PI * $this->raio ** 2;
    }

    public function nome(): string
    {
        return 'Círculo';
    }

    public function desenhar(): string
    {
        return "Desenhando um círculo de raio {$this->raio}";
    }
}

class Retangulo implements Forma
{
    public function __construct(
        private float $largura,
        private float $altura
    ) {}

    public function area(): float
    {
        return $this->largura * $this->altura;
    }

    public function nome(): string
    {
        return 'Retângulo';
    }
}

// Função que aceita qualquer Forma (polimorfismo)
function exibirArea(Forma $forma): void
{
    echo $forma->nome() . ': área = ' . number_format($forma->area(), 2) . PHP_EOL;
}

// Testando
exibirArea(new Circulo(2));
exibirArea(new Retangulo(3, 4));

$c = new Circulo(1);
echo $c->desenhar() . PHP_EOL;
echo 'PI = ' . Forma::PI . PHP_EOL;

Exercícios

  1. 1
    Fácil

    Interface Animal

    Crie uma interface Animal com o método emitirSom(): string e uma constante REINO = 'Animalia'. Depois crie a classe Cachorro que a implementa, retornando 'Latido' no método. Exiba o som e a constante.

    Resolver
  2. 2
    Médio

    Múltiplas interfaces: Logavel e Serializavel

    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.

    Resolver
  3. 3
    Desafio

    Polimorfismo com interfaces e cálculo de áreas

    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.

    Resolver

Continue estudando