Sobes.tech
Junior

O que são interfaces em PHP?

sobes.tech IA

Resposta da IA

A interface em PHP é um contrato que descreve um conjunto de métodos (com suas assinaturas) que uma classe deve implementar. Ela define "o que" a classe faz, mas não "como".

  • Contrato: A classe que implementa a interface compromete-se a fornecer todos os métodos descritos nela, com os mesmos nomes, parâmetros e tipos de retorno.
  • Herança de tipos: As interfaces permitem definir tipos com base no comportamento, e não apenas na hierarquia de classes. Isto é útil para o polimorfismo. Pode trabalhar com objetos de diferentes classes que implementam uma mesma interface, como se fossem do mesmo tipo.
  • Herança múltipla de comportamento: PHP não suporta herança múltipla de classes, mas uma classe pode implementar múltiplas interfaces. Isto permite que uma classe tenha comportamentos de vários contratos.
  • Separação de responsabilidades: As interfaces ajudam a separar a definição do comportamento da sua implementação.
<?php

// Definição da interface
interface Logger
{
    /**
     * Regista uma mensagem de log.
     * @param string $message Mensagem a registar.
     */
    public function log(string $message): void;
}

// Classe que implementa a interface
class FileLogger implements Logger
{
    private string $filePath;

    public function __construct(string $filePath)
    {
        $this->filePath = $filePath;
    }

    public function log(string $message): void
    {
        file_put_contents($this->filePath, $message . PHP_EOL, FILE_APPEND);
    }
}

// Outra classe que implementa a mesma interface
class DatabaseLogger implements Logger
{
    private $dbConnection; // Assume um objeto de conexão à base de dados

    public function __construct($dbConnection)
    {
        $this->dbConnection = $dbConnection;
    }

    public function log(string $message): void
    {
        // Lógica para guardar na base de dados
        // ...
        echo "Registando na base de dados: " . $message . PHP_EOL;
    }
}

// Uso da interface para trabalhar com diferentes implementações
function processData(Logger $logger, string $data): void
{
    // Processamento de dados
    // ...
    $logger->log("Dados processados: " . $data);
}

$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Mock para exemplo de conexão à base de dados

processData($fileLogger, 'Exemplo de dados 1');
processData($dbLogger, 'Exemplo de dados 2');

Principais diferenças em relação às classes abstratas:

Característica Interface Classe abstrata
Tipo de membros Apenas métodos (devem ser públicos) Métodos (públicos, protegidos), propriedades
Implementação de métodos Sem implementação (apenas assinaturas) Pode conter métodos implementados
Herança Uma classe pode implementar múltiplas interfaces Uma classe pode herdar apenas de uma classe abstrata
Construtor Não possui Pode ter um construtor
Membros com visibilidade Apenas public public, protected