Um exemplo da lógica de utilizar Interface com PHP

Quando você começa a estudar Orientação a Objeto, chega um momento que você se depara com as interfaces. E no primeiro momento você pensa : “Mas porquê raios vou usar um tipo de classe, que não faz nada, e ainda por cima me obriga a criar métodos. Que utilidade tem isso “.

Eu tentei fazer um exemplo que exemplificasse a utilização da Interface da uma maneira mais fácil de entender, não sei se consegui 😀 . A ideia era mostrar o conceito de uma maneira mais “visível”, para o porquê utilizar uma interface.  Veja o código:

<?php
/*
   Interface responsável por definir a vida
   Implementação é responsabilidade de cada participante
   @author  Deus ou Acaso, depende do que você acredita
*/
interface Vida{
	public function nascer();
	public function crescer();
	public function morrer();
	}
?>

Agora vamos a explicação do código :

Existe algo chamado vida, que tem suas obrigatoriedade de existência, a forma que você vai usá-la vai depender de cada um.

Como poderíamos traduzir isso para programação orientada a objeto.

Definimos uma interface, assim definimos comportamentos, e quem for usar a interface, terá que ter esses comportamentos, mas pode fazê-los da maneira que quiser.

Espero que tenha ajudado a compreender melhor sobre interface. Até a próxima.

22 thoughts on “Um exemplo da lógica de utilizar Interface com PHP

  1. Olá David, daria para usar esse método ai que vc falou para especificar áreas de usuários dentro de um site? ( é só um exemplo, na verdade uma dúvida, hehe!)

    1. Natanael, a interface não seria para isso. Pense que você precisa trabalhar com várias opções, sendo que da mesma forma. Um exemplo, banco de dados. Vc está fazendo um projeto usando mysql, mas depois de algum vc descobre q precisa trabalhar com oracle, como vc fará para ter essa compatibilidade, se cada um faz de uma maneira ? Vc defini uma interface comum, onde terão os metodos com ações do banco de dados, e seus participantes q irão implementar poderá fazer de qualquer forma. Vou postar um código de exemplo:

      <?php 
      interface DataBase{			
      	public function connect();
      	public function insert($data);
      	public function update($data, $where);
              public function select($colums='*', array $filters=null);
      	public function delete($where);
      	public function close();
      	public function setTableName($name);
      }
      		
      ?>
      

      Primeiro criamos uma interface onde definimos as operações comuns com banco de dados, que é conectar, inserir, alterar, selecionar, excluir, fechar, e também definição do nome da tabela. Que for implementar essa interface precisará implementar esses métodos, mas a forma q eles irão implementar, vai depender de cada classe que irá utilizar.

      Vamos criar duas classes que vão utilizar essa interface, que será para trabalhar com mysql e oracle :

      class MySQLDataBase implements DataBase{
          
          public function __construct($host, $user, $pass){
      			
         }
      
          public function connect(){}
      				
      	public function insert($data){
      		//Implementação do Insert usando MySQL
      	}
      				
      	public function update($data, $where){
      	//Implementação do update usando MySQL
      	}
      				
      	public function select($colums='*', array $filters=null){
      	//Implementação do SELECT usando MySQL
      	}
      	public function delete($where){
      	//Implementação do DELETE usando MySQL
      	}
      			
      	public function close(){
      			
      	}
      
      	public function setTableName($name){
      	//define nome da tabela
      	}
      }
      

      Essa foi do mysql, veja todas os métodos foram utilizados da interface, só como a classe vai implementar isso, vai depender de cada banco de dados. Vamos fazer outro exemplo:

      class OracleDataBase implements DataBase{
       public function __construct($host, $user, $pass){
      			
         }
      public function connect(){}
      				
      	public function insert($data){
      		//Implementação do Insert usando Oracle
      	}
      				
      	public function update($data, $where){
      	//Implementação do update usando Oracle
      	}
      				
      	public function select($colums='*', array $filters=null){
      	//Implementação do SELECT usando Oracle
      	}
      	public function delete($where){
      	//Implementação do DELETE usando Oracle
      	}
      			
      	public function close(){
      			
      	}
      
      	public function setTableName($name){
      	//define nome da tabela
      	}
      }
      

      Veja que fiz a mesma coisa, forma de implementar a instruções de conectar, inserir, etc, vai depender da classe, q seria para oracle, mas a única que coisa q sei mesmo q eles terão q ter esses métodos.

      Agora vão criar uma classe para pode utilizar essas classes

      class DataAccessObject implements DataBase{
            protected $adapter;
            
           public function __construct(DataBase $object){
      	 $this->adapter = $object;
      	 $this->connect();
          }
      	
          public function setTableName($name){
      		$this->adapter->setTableName($name);
          }
      				
          public function connect(){
      	$this->adapter->connect(); 
          }
      	
           public function insert($data){
      		$this->adapter->insert($data); 
           }
      	
           public function update($data, $where){
      	 $this->adapter->update($data, $where); 
      	}
           
           public function delete($where){
      	$this->adapter->delete($where);
            }
            
             public function close(){
      	$this->adapter->close();
      	}
           }
      

      Veja que criei uma classe que também implementar a interface DataBase. Só que agora ela tem uma atributo chamado adapter, q vai ser responsável por guardar a instancia da class do banco de dados q irei utilizar. Veja que no construtor Informado q objeto passado tem q ter implementado a interface DataBase, isso me garante q saberei q métodos irei utilizar. Mas veja q não falei se será MySQL ,Oracle, etc, pq não precisa, o q preciso saber q ele tem as interface implementado, pra pode utilizar nessa classe.

      Exemplo de utilização da classe DataAccessObject :

      //Digo q será o MySQL q irei utilizar
      $mysql = new MySQLDataBase($host, $user, $pass);
      
      //Instancio a classe Que fará as operação, dizendo q banco de dados irei utilizar
      $dao = new DataAccessObject($mysql);
      
      //Definir o nome da tabela
      $dao->setTableName('produtos');
      
      //faço uma operação
      $dao->delete('idProduto = 1');
      

      Agora vamos dizer q precisamos usar o oracle. Simples, apenas instanciamos a classe do oracle, e passamos para classe DataAccessObject

      //Digo q será o Oracle irei utilizar
      $oracle = new OracleDataBase($host, $user, $pass);
      
      //Instancio a classe Que fará as operação, dizendo q banco de dados irei utilizar
      $dao = new DataAccessObject($oracle );
      
      //Definir o nome da tabela
      $dao->setTableName('produtos');
      
      //faço uma operação
      $dao->delete('idProduto = 1');
      

      Veja q operação no banco de dados, continua a mesma, a lógica da aplicação não vai mudar, pq sei esses q as classes que vão trabalhar com banco de dados, terá q ter a interface com as operações q fora definidas.

      Então a ideia da interface é definir uma forma de trabalhar, mas como vc vai trabalhar, vai depender de cada classe. Definimos q iremos trabalhar com as operações no banco de dados, todas as classes vão trabalhar da mesma forma, caso precise mudar de banco de dados, não terei perda no sistema, pq sei q irão trabalhar da mesma forma, só implementações dos banco de dados respectivos, q seriam mysql e oracle.

      Sei é complicado entender, mas aos poucos fica mais claro, não se preocupe.

      1. Esta tua resposta (admin 1 de novembro de 2012 at 11:44) está muito mais completa e explicativa que o seu texto!
        Por isso, parabens pela explicação na resposta.

        1. Adriano, o texto basicamente é um exemplo de entendimento de lógica pra tentar ver o que seria uma interface, e o comentário q fiz depois, já exemplo prático. abrs

    1. Sabe q isso é uma boa ideia, me indica a professora q te ensinou, vc tem jeito de “tricoteira” mesmo. E agradeço, que sua opinião é muito importante pra mim.:D. E uma dica pra vc, que vai mudar sua vida, leia o título do post.

    1. Danilo, tô meio calejado com camaradas q nem esse, nem ligo mais, por isso liberei comentário e dei uma conselho a ele, vai fazer muito bem se ele seguir 😀

  2. Explicação simples e direta, assim como o título! Alguns pelo jeito “sabem tudo” sobre POO, mas ainda não tem o costume de leitura e interpretação de texto. (:

    Uma dúvida em relação a Interface em si meu caro:
    Eu estou trabalhando com DI (Dependency Injecion), então eu poderia utilizar a Interface para tratar esse valor? Ex:

    <?php
    
    // Interface para os Bancos de Dados.
    interface InterfaceDb
    {
    	
    	public function create(Array $data);
    	
    	public function read();
    	
    	public function update(Array $data, $id = 0);
    	
    	public function delete($id = 0);
    	
    	public function deleteWhere(Array $options, $id = null);
    
    }
    
    class MySql implements InterfaceDb
    {
    	// Métodos da InterfaceDb
    }
    
    
    class Oracle implements InterfaceDb
    {
    	// Métodos da InterfaceDb
    }
    
    
    // Aqui a classe que vai trabalhar com o Banco.
    class Crud
    {
    	protected $db = null;
    	
    	// Recebendo a classe do Banco com a interface.
    	public function __construct(InterfaceDb $db)
    	{
    		$this->db = $db;
    	}
    }
    

    Caso não tenha ficado claro me fale por favor rs.
    Vlw!

    1. Luiz, ali seria os filtros do SQL, como where, join, order, group, limit, exemplo como poderia ser feito o SQL:

       /* 
           Exemplo do Filter
           $filter = array(
                           "where" =>  "status = '1'",
                           "order"  => "idProduto DESC",
                           "limit"  => "10" 
      	 	  );
          */
      
       public function select($colums='*', array $filters=null){
          	$strSQL = "SELECT {$colums} FROM {$this->tableName} ";
          	if(is_array($filter)){
          		if(isset($filters['join'])){
          			$strSQL .= " INNER JOIN ".$filters['join'];
          		}
          		if(isset($filters['where'])){
          			$strSQL .= " WHERE ".$filters['where'];
          		}
          		if(isset($filters['group'])){
          			$strSQL .= " GROUP BY ".$filters['group'];
          		}
          		if(isset($filters['order'])){
          			$strSQL .= " ORDER BY ".$filters['order'];
          		}
          		if(isset($filters['limit'])){
          			$strSQL .= " LIMIT ".$filters['limit'];
          		}
          	}    	
      
          	
      
  3. Ainda não vi necessidade de usar interface no php. Eu conheço a importância dela no Java, mas no php sinceramente não entendi, pois são os métodos que tem na classe que são chamados, e não o que foi especificado no “regulamento” da interface.

    A unica coisa que sei que funciona é pra dar Erro Fatal se tiver método não invocado na classe pai, mais nada =/

    1. Pra entender a utilização de interface, é importante saber q isso trata de confiança. Na Orientação a objetos vc tem troca de mensagens, um objeto se comunica com outro. Vc utiliza uma interface pra garantir que essa troca de mensagem ocorra da forma q vc quer.

      Imagina vc desenvolve um loja virtual, onde vc tem formas de pagamento. Hoje vc usa o pagseguro, mas amanhã seu cliente diz q vc tem q usar paypal, moip, ou outros. Como vc garantir essa comunicação?

      Imagine a interface como vc tivesse definindo um tipo. Vamos definir uma interface de pagamento, onde tem um método chamado pagar. Toda classe for um pagamento, vai implementá-la:

         interface Pagamento{
      	 public function pagar();
      }
      

      Vamos uma classe finalizarcompra, onde informamos o pagamento, e o que ela tem q fazer:

      
      	class FinalizarCompra{
      		 private $pagamento;
      
      		 public function adicionarPagamento(Pagamento $pag){
      		 	$this-&gt;pagamento = $pagamento;
      		 }
      
      		 public function finalizar(){
      
      		 	$this-&gt;pagamento-&gt;pagar();
      		 }
      	}
      

      Minha classe FinalizarCompra, tem um atributo pagamento. Eu tenho tbm um método onde adiciona o pagamento, dizendo que seria do “tipo” Pagamento. E tenho um método de finalizar , onde faria a ação de finalizar a compra. E dentro de tela, chama método pagar. Mas quem me garante q terá um método pagar? Será a minha interface.

      Vamos criar um pagamento com pagseguro:

      class PagSeguro implements Pagamento{
      
        public function pagar(){
             //implementação
         }
      }
      

      Tenho a classe PagSeguro, q implementa o pagamento, e tenho método pagar

      Vamos usar a classe FinalizarCompra

      $finalizar = new FinalizarCompra();
      $pagamento = new PagSeguro();
      
      $finalizar-&gt;adicionarPagamento($pagamento);
      $finalizar-&gt;finalizar();
      

      Vamos dizer agora, vc terá usar um MOIP

      	class Moip implements Pagamento{
      
      
      		  public function pagar(){
      
      
      		  }
      	}
      

      Defini a classe do Moip, q implementa o pagamento. Vamos finalizar:

      $finalizar = new FinalizarCompra();
      $pagamento = new Moip();
      
      $finalizar-&gt;adicionarPagamento($pagamento);
      $finalizar-&gt;finalizar();
      

      Viu, om interface garanto uma confiança. Não importa como seja feita implementação do pagamento, mas sim q terá um pagamento.

      Lembre sempre q Orientação a Objetos vc terá comunicação entre objetos, e para tentar garantir uma confiança dessa comunicação, utilizamos as interface’s.

      Espero q tenho ajudado.

    2. Eu pesquisei um pouco e ví que usando indução por tipo que o php oferece desde a versão 5, usar interface pode ser extremamente interessante! desculpa qualquer coisa, é q eu não conhecia muito interface em php.

      1. Sem problema, sei q é dificil ver primeiramente a utilização de interfaces, mas depois com tempo, vc consegue ver sua utilização com mais clareza.

  4. David, tudo bem? Tem algum script de comparação de produtos? Eu preciso de um script em PHP para comparar os itens do carrinho de compras, por exemplo. Obrigado!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *