Interfaces em POO em PHP
Como você já sabe, classes abstratas representam um conjunto de métodos para seus descendentes. Parte desses métodos pode ser implementada na própria classe, e parte dos métodos pode ser declarada abstrata e exigir implementação nas classes filhas.
Vamos imaginar uma situação em que sua classe abstrata consiste apenas em um conjunto de métodos abstratos públicos, sem adicionar métodos com implementação.
Praticamente, sua classe pai descreve a interface das classes filhas, ou seja, o conjunto de seus métodos públicos, obrigatórios para implementação.
Por que precisamos disso: para cometer menos erros ao programar - descrevendo todos os métodos necessários na classe pai, podemos ter certeza de que todas as classes filhas realmente os implementarão.
Quando isso ajuda: digamos que criamos nossa classe pai e algumas classes filhas para ela. Se depois de algum tempo, por exemplo, um mês depois, decidirmos criar mais uma classe filha, certamente já teremos esquecido os detalhes do nosso código e podemos muito bem esquecer de escrever a implementação de algum método na nova classe filha. No entanto, o próprio PHP não permitirá que o método seja perdido - e simplesmente lançará um erro.
O mesmo se aplica a outro programador trabalhando em seu projeto. Digamos que o código da classe pai foi escrito por você, e então seu colega decidiu criar mais uma classe filha. Seu colega também não conseguirá "perder" alguns métodos.
No entanto, há um problema: praticamente, criamos nossa classe pai para escrever nela métodos abstratos públicos, mas nós mesmos ou nosso colega temos a possibilidade de acidentalmente adicionar a esta classe um método não público ou não abstrato.
Digamos que queremos fisicamente proibir na classe pai a criação de outros métodos além dos abstratos públicos. No PHP, para isso, em vez de classes abstratas, podemos usar interfaces.
Interfaces representam classes em que todos os métodos são públicos e não possuem implementação. O código dos métodos deve ser implementado pelas classes que implementam as interfaces.
As interfaces são declaradas da mesma forma que as
classes comuns, mas usando a palavra-chave interface
em vez da palavra class.
Para a herança de interfaces, é usada uma
terminologia um pouco diferente: diz-se que
as classes não herdam das interfaces, mas as implementam.
Consequentemente, em vez da palavra extends,
deve-se usar a palavra-chave
implements.
Não é possível criar um objeto de uma interface. Todos os métodos
da interface devem ser declarados como public
e não devem ter implementação. Uma interface
pode ter apenas métodos, não propriedades.
Também não é possível criar uma interface e uma classe com
o mesmo nome.