Menu

Interface em PHP: implements, constantes e exemplos

Uma interface PHP lista os métodos que uma classe promete ter: interface Shape { public function area(): float; }, e class Circle implements Shape precisa então definir area(). Veja type hints com interfaces, implementar várias interfaces, constantes de interface, interfaces que estendem outras, interfaces nativas como Countable e interface ou classe abstrata.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Uma interface PHP declara métodos que uma classe promete fornecer, sem nenhum código: interface Shape { public function area(): float; }. Uma classe que escreve implements Shape precisa definir area(), e qualquer função com type hint Shape vai aceitar essa classe.

describe() não sabe nem se importa com qual classe recebe. Ela só confia na promessa que a interface faz, então um novo Triangle implements Shape funciona com ela sem mudar uma linha.

Programar para uma interface

O motivo comum para escrever uma interface é deixar o código depender de uma capacidade em vez de uma classe específica. Aqui um serviço de pedidos aceita qualquer Notifier, então o mesmo código pode enviar e-mail em produção e guardar mensagens num teste:

Implementar várias interfaces

Uma classe estende no máximo uma classe pai, mas pode implementar quantas interfaces precisar. Liste-as depois de implements, separadas por vírgulas, e defina os métodos de todas:

JsonSerializable é uma das interfaces nativas do PHP: implementá-la controla o que o json_encode() produz para o objeto.

Constantes de interface

Uma interface pode declarar constantes. Todas as classes que a implementam as herdam, e você pode lê-las pelo nome da interface ou pelo nome da classe:

Interfaces não podem ter propriedades no PHP 8.3, só métodos e constantes. Os métodos podem ser estáticos: public static function fromArray(array $data): static; na interface obriga cada classe a definir esse método estático. Para um conjunto fixo de valores relacionados, um enum muitas vezes serve melhor que uma lista de constantes de interface.

Uma interface pode estender outras interfaces

Interfaces também usam extends e, ao contrário das classes, podem estender várias ao mesmo tempo. Uma classe que implementa a interface filha precisa definir os métodos da cadeia inteira:

Interfaces nativas: Countable, IteratorAggregate, Stringable

O PHP traz interfaces que ligam objetos à linguagem. Countable faz count($obj) funcionar, IteratorAggregate faz o foreach funcionar, e Stringable é implementada automaticamente por qualquer classe com um método __toString():

Esquecer um método

Se uma classe diz implementar uma interface mas deixa faltar um método, o PHP para com um erro fatal que nomeia o método ausente:

Adicione um método total() e o script roda. Uma classe abstrata pode deixar métodos da interface sem definição, que é a saída que a mensagem de erro sugere.

Interface ou classe abstrata

As duas definem métodos que uma classe precisa ter, e as duas podem ser usadas como type hint. A diferença está no que mais elas podem conter e em quantas uma classe pode usar:

InterfaceClasse abstrata
Corpo dos métodosnenhum (só assinaturas)métodos abstratos e prontos
Propriedadesnãosim
Construtorpode declarar um, raramente útilsim, com código
Visibilidade dos métodossó publicpublic, protected, private
Constantessimsim
Quantas por classequantas quiser (implements A, B, C)uma (extends Base)
Uso típicouma capacidade: Exportable, Countablecódigo compartilhado de uma família: Model, Controller

Elas combinam bem: defina a interface para o type hint e ofereça uma classe base abstrata que a implementa com o código comum. Classes que precisam de outra base ainda podem implementar a interface diretamente.

Perguntas frequentes

O que é uma interface no PHP?

Uma lista de assinaturas de métodos públicos sem corpo: interface Logger { public function log(string $msg): void; }. Uma classe que diz implements Logger precisa definir todos os métodos dela, e qualquer código com type hint Logger aceita essa classe.

Uma classe PHP pode implementar várias interfaces?

Sim. Liste-as depois de implements, separadas por vírgulas: class File implements Readable, Writable, Countable. A classe precisa definir os métodos de todas elas. É assim que o PHP cobre o que a herança múltipla faz em outras linguagens.

Qual a diferença entre uma interface e uma classe abstrata no PHP?

Uma interface só declara métodos públicos (e constantes); não tem propriedades nem código de métodos, e uma classe pode implementar várias. Uma classe abstrata pode ter propriedades, construtores e métodos prontos ao lado dos abstratos, mas uma classe só pode estender uma. Use uma interface para uma capacidade ("pode ser exportado"), uma classe abstrata para código compartilhado numa família de classes.

Uma interface PHP pode ter propriedades?

Não no PHP 8.3: uma interface pode conter assinaturas de métodos e constantes (const VERSION = 2;), mas não propriedades. Declarações de propriedades em interfaces (property hooks) só chegaram no PHP 8.4.

Como verifico se um objeto implementa uma interface no PHP?

Use instanceof: $obj instanceof Countable é verdadeiro quando a classe do objeto implementa a interface, diretamente ou por uma classe pai. class_implements($obj) retorna os nomes de todas as interfaces que a classe implementa.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR