Blog do MX Cursos

Utilizando interface no PHP

Utilizando interface no PHP
Avaliar post

Ao trabalhar com Orientação a Objeto, algo que se espera é a confiabilidade de seus participantes. E uma das formas de garantir essa confiabilidade é a utilização de Interface.

A Interface permite definir um “contrato” na qual as classes que vão implementá-las terão que ter os métodos definidos pela interface.

Vamos ver algo mais prático para melhorar esta compreensão.

Você precisará desenvolver um projeto no qual o gerenciador do banco de dados será o MySQL e no decorrer do projeto você é informado que terá que usar o PostgreSQL.

E a agora? Como garantir que o projeto trabalhará com PostgreSQL sem precisar ir em todos os arquivos e efetuar contínuas mudanças?

Definiremos uma Interface que terão os métodos que irão trabalhar com as operações do banco de dados.

DataBase.php

<?php

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

Criamos uma interface onde definimos as operações comuns com banco de dados, que é conectar, inserir, alterar, selecionar, excluir, fechar e também a definição do nome da tabela.

Dica do redator: Quer se especializar ou potencializar suas habilidades em PHP, Laravel, CakePHP, Lógica de Programação, Java, entre outros? Conheça todos nossos Cursos Online de Programação em Vídeo Aulas.

Quem for utilizar essa interface precisará ter esses métodos, mas a forma que eles irão implementar dependerá de cada classe que irá utilizar.

Agora podemos criar nossas classes que irão implementar.

Vamos criar para o MySQL:

MySQLDataBase.php

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

Repare que todos os métodos que definimos na Interface foram implementados, só que como a classe vai implementar isso, vai depender de cada banco de dados.

Vamos fazer outro exemplo:

PostgreSQLDataBase.php

<?php
 
class PostgreSQLDataBase implements DataBase{
 
	public function __construct($host, $user, $pass, $dbname){
	 
	}
	 
	public function connect(){
	//Implementa a conexão
	}
	 
	public function insert($data){
	//Implementação do Insert usando Postgre
	}
	 
	public function update($data, $where){
	//Implementação do update usando Postgre
	}
	 
	public function select($columns='*', array $filters=null){
	//Implementação do SELECT usando Postgre
	}
	public function delete($where){
	//Implementação do DELETE usando Postgre
	}
	 
	public function close(){
	//Fecha a conexão
	}
	 
	public function setTableName($name){
	//define nome da tabela
	}
}

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

Agora criaremos uma nova classe a qual trabalhará com essas classes que vão abstrair.

DataAccessObject.php

<?php
 
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 implementa a Interface DataBase. Só que agora ela tem um atributo chamado adapter, que vai ser responsável por guardar a instância da classe do banco de dados que irei utilizar.

Veja que no construtor é informado que objeto passado tem que ter implementado a interface DataBase. Isso me garante que saberei quais métodos irei utilizar. Mas veja que não falei se será MySQL, PostgreSQL etc, pois não precisa.

O que preciso saber é se ele tem a Interface implementada pra pode utilizar nesta classe.

//Inclui as classes
require_once "Db/DataBase.php";
require_once "Db/MySQLDataBase.php";
require_once "Db/DataAccessObject.php";
 
//Instancia classe que abstrairá as ações do MySQL
$database = new MySQLDataBase($host, $user, $pass, $dbname);
 
//Instancio a classe que fará as operações, dizendo que banco de dados irei utilizar
$dao = new DataAccessObject($database);
 
//Definir o nome da tabela
$dao->setTableName('produtos');
 
//faço uma operação
$dao->delete('idProduto = 1');

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

//Inclui as classes
require_once "Db/DataBase.php";
require_once "Db/PostgreSQLDataBase.php";
require_once "Db/DataAccessObject.php";
 
//Instancia classe que abstrairá as ações do PostgreSQL
$database = new PostgreSQLDataBase($host, $user, $pass, $dbname);
 
//Instancio a classe que fará as operações, dizendo que banco de dados irei utilizar
$dao = new DataAccessObject($database);
 
//Definir o nome da tabela
$dao->setTableName('produtos');
 
//faço uma operação
$dao->delete('idProduto = 1');

Veja que a operação no banco de dados continuará a mesma e a lógica da aplicação não vai mudar, pois sei que as classes que vão trabalhar com banco de dados terão a Interface com as operações que foram definidas.

Então a ideia da Interface é definir uma forma de trabalhar, mas a forma que você trabalhará vai depender de cada classe.

Definimos que  trabalharemos com as operações no banco de dados. Todas as classes que implementarem a Interface DataBase terão que ter esses métodos caso precise mudar de banco de dados, não terei perda no sistema, porque sei que irão trabalhar da mesma forma, mas só a implementação que será diferente.

Gostaram do artigo?

Deixe seu comentário e compartilhe com seus amifos.

David CHC

David CHC

Trabalha com desenvolvimento web há 10 anos, atuou como programador líder do MX Cursos por mais de 8 anos e hoje dedica-se exclusivamente à criação de cursos para a plataforma. Possui vasto conhecimento em PHP, Javascript, HTML5, CSS3, Gulp.js, GIT, MySQL

Clube de Cursos

Conheça nosso Clube de Cursos e potencialize suas habilidades em Produção e Edição de Vídeos, Design, Marketing Digital, Programaço, WordPress, 3D e Modelagem, Motion Graphics e muito mais!

CONHEÇA O CLUBE

Your Header Sidebar area is currently empty. Hurry up and add some widgets.