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.
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.

