Menu
Coddy logo textTech

Implementando Interfaces

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 28 de 91.

Agora que você entende o que são interfaces, vamos ver como implementá-las de fato. Uma classe implementa uma interface usando a palavra-chave implements e deve fornecer implementações concretas para todos os métodos declarados nessa interface.

<?php
interface Printable {
    public function print();
}

class Document implements Printable {
    private $content;
    
    public function __construct($content) {
        $this->content = $content;
    }
    
    public function print() {
        return "Printing: " . $this->content;
    }
}

$doc = new Document("Hello World");
echo $doc->print();

Saída:

Printing: Hello World

A classe Document implementa Printable fornecendo sua própria versão do método print(). Se você esquecer de implementar um método obrigatório, o PHP lançará um erro fatal.

Diferentes classes podem implementar a mesma interface à sua própria maneira:

<?php
class Invoice implements Printable {
    private $amount;
    
    public function __construct($amount) {
        $this->amount = $amount;
    }
    
    public function print() {
        return "Invoice Total: $" . $this->amount;
    }
}

$invoice = new Invoice(150);
echo $invoice->print();

Saída:

Invoice Total: $150

Tanto Document quanto Invoice cumprem o contrato Printable, mas cada um lida com a impressão de maneira diferente, com base em sua finalidade.

Ponto-chave: Use implements para conectar uma classe a uma interface e, em seguida, defina todos os métodos obrigatórios. Cada classe que implementa fornece sua própria lógica, garantindo ao mesmo tempo que as mesmas assinaturas de método existam.

challenge icon

Desafio

Fácil

Vamos criar um sistema de mensagens que demonstra como diferentes classes podem implementar a mesma interface de suas próprias maneiras únicas.

Você criará três arquivos que trabalham juntos para lidar com diferentes tipos de mensagens:

  • Messageable.php: Defina a interface Messageable com duas assinaturas de método: compose($content) e deliver(). Essa interface estabelece o contrato que todos os tipos de mensagem devem seguir.
  • Email.php: Crie uma classe Email que implemente Messageable. Inclua o arquivo da interface no início. A classe deve ter uma propriedade privada $recipient e uma propriedade privada $body. O construtor aceita o endereço do destinatário. Implemente compose($content) para armazenar o conteúdo em $body e retornar "Email composed". Implemente deliver() para retornar "Email to [recipient]: [body]".
  • SMS.php: Crie uma classe SMS que também implemente Messageable. Inclua o arquivo da interface no início. A classe deve ter uma propriedade privada $phoneNumber e uma propriedade privada $text. O construtor aceita o número de telefone. Implemente compose($content) para armazenar o conteúdo em $text e retornar "SMS composed". Implemente deliver() para retornar "SMS to [phoneNumber]: [text]".

Em main.php, inclua os arquivos Email e SMS. Você receberá três entradas: um endereço de e-mail, um número de telefone e o conteúdo de uma mensagem. Crie um objeto Email com o endereço de e-mail e um objeto SMS com o número de telefone. Chame compose() com o conteúdo da mensagem em ambos os objetos, imprimindo cada resultado em sua própria linha. Em seguida, chame deliver() em ambos os objetos, imprimindo cada resultado em sua própria linha. A ordem deve ser: composição do e-mail, composição do SMS, entrega do e-mail, entrega do SMS.

Ambas as classes cumprem o mesmo contrato Messageable, mas cada uma lida com a composição e a entrega de mensagens de acordo com sua própria finalidade: os e-mails exibem o endereço do destinatário, enquanto as mensagens SMS exibem o número de telefone.

Experimente você mesmo

<?php
require_once 'Email.php';
require_once 'SMS.php';

// Ler entradas
$emailAddress = trim(fgets(STDIN));
$phoneNumber = trim(fgets(STDIN));
$messageContent = trim(fgets(STDIN));

// TODO: Crie um objeto Email com o endereço de email

// TODO: Crie um objeto SMS com o número de telefone

// TODO: Chame compose() em ambos os objetos e imprima os resultados
// Order: email compose, then SMS compose

// TODO: Chame deliver() em ambos os objetos e imprima os resultados
// Ordem: deliver do email, depois deliver do SMS
?>
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de PHP online