+4

Entendendo o conceito de Interfaces no PHP

criado por Arthur Nogueira Bertozzi em 24/10/2010 6:40pm
Bem aqui mostrarei para que serve uma Interface e como usar uma Interface.

Primeiro vamos a teoria e depois a pratica.

Uma Interface é como se fosse um contrato, caso a classe não siga aquele contrato ela é inválida.

Digamos que você queira criar 3 classes para 3 formulários diferentes onde cada classe vai ser um formulário.
Por padrão , todas as suas classes formularios tem que conter o mesmo método , por exemplo , o método gravar.

Para garantir que todas elas tenham esse método você usa uma interface.
Vamos implementar esse exemplo.

Interface usa a palavra interface no lugar da class.
interface InterfaceForm{
    public function gravar();
}

Agora as Classes.
Para incluir uma interface se usa a palavra implements.

// Sucesso
class Formulario1 implements InterfaceForm{
    public function gravar(){
        echo 'gravou';
    }
}

// Sucesso
class Formulario2 implements InterfaceForm{
    public function gravar(){
        echo 'gravou';
    }

    public function retornar(){
        echo 'retornar';
    }
}

// Erro , pois classe não contem método gravar()
class Formulario3 implements InterfaceForm{
    public function retornar(){
        echo 'retornar';
    }
}

Como pode ver no código acima , o Formulario1 e Formulario2 está ok pois contem o método, porem , o Formulario3 não contem , o que ocorreria um erro, ou seja, o Formulario3 quebraria o contrato em que todos os formularios tem que conter um método public gravar.

Vamos destacar caracteristicas importantes:

1. Um método na interface não pode conter conteudo
interface InterfaceForm{
    // Erro , método não pode conter conteudo
    public function gravar(){ 
        echo 'aqui'; 
    }

    // Erro , mesmo só colocando {} , o espaço em branco é declarado como conteudo
    public function gravar(){}

    //Sucesso
    public function gravar();
}

2. Caso aja variaveis , estas devem ser exatas na interface e na classe que a implementa.
interface InterfaceForm{
    public function gravar($mensagem);
}

class Formulario1 implements InterfaceForm{
    public function gravar($mensagem){
        echo $mensagem;
    }
}

3. O método da interface tem que ser mais restrito ou igual a da classe
interface InterfaceForm{
    public function gravar();
}

// Erro , método protected é mais restrito que método public na interface
class Formulario1 implements InterfaceForm{
    protected function gravar(){
        echo $mensagem;
    }
}

4. Constantes numa interface não podem ser mudadas na classe , pois , constantes são constantes ora! .
interface InterfaceForm{
    const a = 'Oi';
}

// Erro , impossivel mudar valor de constante
class Formulario1 implements InterfaceForm{
    const a = 'Tchau';
}

5. É possivel uma classe implementar mais de 1 interface ao mesmo tempo , sendo assim , a classe tem que estar nos padrões de todas as interfaces que ela implementa.
interface A{
    public functiom metodoA();
}

interface B{
    public functiom metodoB();
}

class Formulario1 implements A,B{
    public function metodoA(){}
    public function metodoB(){}
}

6. Uma interface pode herdar de várias outras Interfaces, sendo assim , a classe que implementa esta interface tem que estar nos padrões de todas as interfaces herdadas tambem.
Interface A{}
Interface B{}

Interface C extends A,B{}

Acho que é basicamente isso.

Para mim só existe vantagem em usar interfaces caso você tenha um projeto grande onde queira garantir que um grupo de classes siga um padrão de métodos ou algo do tipo.

No site oficial do php vocês encontraram mais exemplos de usos de interfaces.

Comentários:

Mostrando 1 - 3 de 3 comentários
Ótimo post.
31/01/2018 12:02am (~6 anos atrás)

Ótimo post! Deu para compreender, valeu a pena ler!
10/12/2015 6:10pm (~8 anos atrás)

No caso de interfaces em php não precisa colocar a notação @Override? Ou não existe isso em php?
30/07/2015 1:38pm (~8 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)