Interface especifica os métodos que as classes, que usam a interface, deve implementar. Eles são definidos com a palavra-chave da interface seguido por um nome e um bloco de código. Sua nomenclatura deve começar com um pequeno “i” e, em seguida, fazer com que cada palavra a primeira letra maiúscula.
<?php interface iMyInterface {} ?>
Assinaturas das Interface
O bloco de código de uma interface pode conter assinaturas para métodos de instância. Estes métodos não pode ter implementações. Em vez disso, seus corpos são substituídos por ponto e vírgula. Métodos de interface devem sempre ser públicos.
<?php interface iMyInterface { public function myMethod(); } ?>
Além disso, as interfaces podem definir constantes. Essas constantes de interface se comportam exatamente como constantes de classe, exceto que eles não podem ser substituídos.
<?php interface iMyInterface { const PI = 3.14; } ?>
Uma interface não pode herdar de uma classe, mas pode herdar de outra interface, que combina de forma eficaz as interfaces em um.
<?php interface i1 {} interface i2 extends i1 {} ?>
Exemplo de interface
O exemplo a seguir mostra uma interface chamada iComparable, que tem um único método chamado comparar. Note que este método faz uso da indicação de tipo para se certificar de que o método é chamado com o tipo correto. Esta funcionalidade será abordado em um artigo posterior.
<?php interface iComparable { public function compare(iComparable $o); } ?>
A classe Circle implementa essa interface, usando a palavra-chave “implements” após o nome da classe, seguido do nome da interface. Se a classe também tem uma cláusula extends, a cláusula de implements precisa ser colocado depois. Tenha em mente que, apesar de uma classe só pode herdar de uma classe pai, é possível implementar qualquer número de interfaces, especificando-os em uma lista separada por vírgulas.
<?php class Circle implements iComparable { public $r; } ?>
Devido Circle implementar iComparable deve-se definir o método compare(). Para esta classe o método irá retornar a diferença entre os raios de círculo. O método deve ser implementado público, além de ter a mesma assinatura como o método definido na interface. Também pode ter mais parâmetros, enquanto eles são opcionais.
<?php class Circle implements iComparable { public $r; public function compare(iComparable $o) { return $this->r - $o->r; } } ?>
Usos da interface
Interfaces permitem herança múltipla no design de classe, sem as complicações associadas, permitindo herança múltipla funcional. A principal vantagem de exigir um projeto de classe específico pode ser visto com a interface iComparable, que define uma funcionalidade específica que as classes podem compartilhar. Ele permite aos desenvolvedores usar membros de interface sem ter que saber o tipo real de uma classe. Para ilustrar, o exemplo a seguir mostra um método simples que leva dois objetos iComparable e retorna o maior.
function largest(iComparable $a, iComparable $b) { return ($a->compare($b) > 0) ? $a : $b; }
Este método irá funcionar para quaisquer dois objetos do mesmo tipo que implementam a interface iComparable. Ele vai trabalhar, independentemente do tipo dos objetos são já que o método utiliza apenas a funcionalidade exposta através dessa interface.
Diretriz da interface
Uma interface fornece um projeto para uma classe sem qualquer implementação. É um contrato pelo qual as classes que implementam ele concorda em fornecer determinadas funcionalidades. Isto tem duas vantagens. Primeiro, ele fornece uma maneira de se certificar de que os desenvolvedores irão implementar certos métodos. Em segundo lugar, porque essas classes são a garantia de ter certos métodos, eles podem ser usados mesmo sem saber tipo real da classe, o que permite um código mais flexível.