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
interfacee métodos sem corpo (apenas assinatura). implementsobriga 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.
<?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;