Interfaces de objetos permitem a criação de códigos que especificam quais métodos uma classe deve implementar, sem definir como esses métodos serão tratados.
Interfaces são definidas da mesma forma que classes, mas com a palavra-chave interface substituindo class e com nenhum dos métodos tendo seu conteúdo definido.
Todos os métodos declarados em uma interface devem ser públicos, essa é a natureza de uma interface.
Para implementar uma interface, o operador implements é utilizado. Todos os métodos na interface devem ser implementados na classe; não fazê-lo resultará em um erro fatal. Classes podem implementar mais de uma interface se assim for desejado, separando cada interface com uma vírgula.
Nota:
Em versões anteriores ao PHP 5.3.9, uma classe não poderia implementar duas interfaces que especificassem um método com o mesmo nome, pois causaria ambiguidade. Versões mais recentes do PHP, isso é permitido, desde que os métodos duplicados tenham a mesma assinatura.
Nota:
Interfaces podem ser estendidas como as classes, usando o operador extends.
Nota:
A classe que implementa a interface precisa ter as mesmas assinaturas de método como definidas na interface. Não fazê-lo resultará em um erro fatal
É possível ter constantes em interfaces. Constantes de interfaces funcionam exatamente como constantes de classes, com exceção de não poderem ser sobrescritas por uma classe/interface herdeira.
Exemplo #1 Exemplo de Interface
<?php
// Declara a interface 'iTemplate'
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// Implementa a interface
// Isso funcionará
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
// Isso NÃO funcionará
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
}
?>
Exemplo #2 Interfaces estendíveis
<?php
interface a
{
public function foo();
}
interface b extends a
{
public function baz(Baz $baz);
}
// Isto irá funcionar
class c implements b
{
public function foo()
{
}
public function baz(Baz $baz)
{
}
}
// Isto não irá funcionar e resultará em um erro fatal
class d implements b
{
public function foo()
{
}
public function baz(Foo $foo)
{
}
}
?>
Exemplo #3 Interface com herança múltipla
<?php
interface a
{
public function foo();
}
interface b
{
public function bar();
}
interface c extends a, b
{
public function baz();
}
class d implements c
{
public function foo()
{
}
public function bar()
{
}
public function baz()
{
}
}
?>
Exemplo #4 Interfaces com constantes
<?php
interface a
{
const b = 'Interface constant';
}
// Imprime: Interface constant
echo a::b;
// Isto não funcionará porque não é permitido
// sobreescrever constantes.
class b implements a
{
const b = 'Class constant';
}
?>
Uma interface, juntamente com a declaração de tipo, fornecem uma boa maneira de garantir que um objeto em particular possua determinados métodos. Veja o operador instanceof e declaração de tipo.