Introdução a Interfaces
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 27 de 91.
Uma interface define um contrato que as classes devem seguir. Ao contrário de classes abstratas que podem conter tanto métodos abstratos quanto concretos, uma interface apenas declara assinaturas de métodos sem qualquer implementação. Pense nisso como uma promessa: qualquer classe que implementa uma interface garante que fornecerá esses métodos específicos.
Você define uma interface usando a palavra-chave interface:
<?php
interface Printable {
public function print();
}
Esta interface declara que qualquer classe que implemente Printable deve ter um método print(). A interface não se importa com a forma como o método funciona, apenas que ele exista.
Aqui está um exemplo simples mostrando a estrutura básica:
<?php
interface Drivable {
public function start();
public function stop();
}
Observe que os métodos de interface não possuem corpo, apenas a assinatura terminando com um ponto e vírgula. Todos os métodos em uma interface são implicitamente públicos, então você não pode usar private ou protected.
Interfaces são poderosas porque permitem que classes não relacionadas compartilhem comportamentos comuns. Um Car e uma Motorcycle podem não ter nada em comum em termos de herança, mas ambos podem implementar Drivable para garantir que possuam os métodos start() e stop().
Ponto Chave: Uma interface define quais métodos uma classe deve ter, não como eles devem funcionar. Ela estabelece um contrato que as classes implementadoras devem cumprir.
Desafio
FácilVamos construir um sistema de mensagens simples que apresentará as interfaces a você. Você definirá uma interface que estabelece um contrato sobre como as mensagens devem ser tratadas, estabelecendo a base para as classes de implementação que você criará na próxima lição.
Você organizará seu código em dois arquivos:
Messageable.php— Defina uma interface chamadaMessageableque declara duas assinaturas de método:compose($content)para criar uma mensagem edeliver()para enviá-la. Lembre-se, métodos de interface não possuem corpo — apenas a assinatura terminando com um ponto e vírgula.main.php— Inclua o arquivo Messageable. Para verificar se sua interface foi definida corretamente, use a funçãointerface_exists()do PHP para checar seMessageableexiste. Em seguida, use aReflectionClasspara inspecionar sua interface e listar seus métodos. Crie uma reflexão da sua interface, obtenha seus métodos usandogetMethods()e imprima cada nome de método em sua própria linha.
Sua saída deve exibir os dois nomes de métodos que sua interface declara, cada um em uma linha separada, na ordem em que você os definiu.
Este desafio foca puramente na definição de uma interface — o contrato que as futuras classes precisarão cumprir. Você está estabelecendo quais métodos devem existir, sem se preocupar com a forma como eles funcionarão. Essa implementação virá na próxima lição!
Folha de consulta
Uma interface define um contrato que as classes devem seguir. Ela apenas declara assinaturas de métodos sem qualquer implementação.
Defina uma interface usando a palavra-chave interface:
<?php
interface Printable {
public function print();
}
Métodos de interface não possuem corpo, apenas a assinatura terminando com um ponto e vírgula. Todos os métodos em uma interface são implicitamente públicos.
<?php
interface Drivable {
public function start();
public function stop();
}
Interfaces permitem que classes não relacionadas compartilhem comportamentos comuns, garantindo que elas implementem métodos específicos.
Experimente você mesmo
<?php
// Inclui o arquivo da interface Messageable
require_once 'Messageable.php';
// TODO: Use interface_exists() para verificar se a interface Messageable existe
// TODO: Crie um objeto ReflectionClass para a interface Messageable
// TODO: Obtenha os métodos usando getMethods()
// TODO: Percorra os métodos e imprima o nome de cada método em sua própria linha
?>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
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodoA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em DetalhesGetters e SettersOcultação de InformaçãoPromoção de Construtor (8.0)Recapitulação - Sistema de Registro de Alunos10Conceitos Avançados de POO
Composição vs HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibers (PHP 8.1)Mergulho Profundo em Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA Palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto Organizado5Interfaces e Contratos
Introdução a InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataType Hinting com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos AnuláveisTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadasTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário3Propriedades de Classe
Propriedades de Instância vs EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Readonly (PHP 8.1)Recapitulação - Gerenciador de Conta Bancária6Polimorfismo
Sobrescrita de Métodos RevisitadaPolimorfismo via InterfacesType Hinting e Union TypesLate Static BindingRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos de TraitsMétodos Abstratos em TraitsTraits vs Herança12Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy