{"id":4380,"date":"2016-08-22T00:00:00","date_gmt":"2016-08-22T03:00:00","guid":{"rendered":"https:\/\/www.mxcursos.com\/blog\/?p=4380"},"modified":"2019-03-16T20:29:15","modified_gmt":"2019-03-16T23:29:15","slug":"utilizando-interface-no-php","status":"publish","type":"post","link":"https:\/\/www.mxcursos.com\/blog\/utilizando-interface-no-php\/","title":{"rendered":"Utilizando interface no PHP"},"content":{"rendered":"<p>Ao trabalhar com Orienta\u00e7\u00e3o a Objeto,\u00a0algo que se espera \u00e9 a confiabilidade de seus participantes. E uma das formas de garantir essa confiabilidade \u00e9 a utiliza\u00e7\u00e3o de Interface.<\/p>\n<p>A Interface permite definir um \u201ccontrato\u201d na qual as classes que v\u00e3o implement\u00e1-las ter\u00e3o que ter os m\u00e9todos definidos pela interface.<\/p>\n<p>Vamos ver\u00a0algo mais pr\u00e1tico para melhorar esta compreens\u00e3o.<\/p>\n<p>Voc\u00ea precisar\u00e1 desenvolver um projeto no qual o gerenciador do banco de dados ser\u00e1 o MySQL e no decorrer do projeto voc\u00ea \u00e9 informado que ter\u00e1 que usar o PostgreSQL.<\/p>\n<p>E a agora? Como garantir que o projeto trabalhar\u00e1 com PostgreSQL sem precisar ir em todos os arquivos e efetuar cont\u00ednuas mudan\u00e7as?<\/p>\n<p>Definiremos uma Interface que ter\u00e3o os m\u00e9todos que ir\u00e3o trabalhar com as opera\u00e7\u00f5es do banco de dados.<\/p>\n<p><strong>DataBase.php<\/strong><\/p>\n<pre class=\"lang:php decode:true \">&lt;?php\r\n\r\ninterface DataBase{\r\n\tpublic function connect();\r\n\tpublic function insert($data);\r\n\tpublic function update($data, $where);\r\n\tpublic function select($columns='*', array $filters=null);\r\n\tpublic function delete($where);\r\n\tpublic function close();\r\n\tpublic function setTableName($name);\r\n}<\/pre>\n<p>Criamos uma interface onde definimos as opera\u00e7\u00f5es comuns com banco de dados, que \u00e9 conectar, inserir, alterar, selecionar, excluir, fechar e tamb\u00e9m a defini\u00e7\u00e3o do nome da tabela.<\/p>\n<p>Quem for utilizar essa interface precisar\u00e1 ter esses m\u00e9todos, mas a forma que eles ir\u00e3o implementar depender\u00e1 de cada classe que ir\u00e1 utilizar.<\/p>\n<p>Agora podemos criar nossas classes que ir\u00e3o implementar.<\/p>\n<p>Vamos criar para o MySQL:<\/p>\n<p><strong>MySQLDataBase.php<\/strong><\/p>\n<pre class=\"lang:php decode:true \">&lt;?php\r\n \r\nclass MySQLDataBase implements DataBase{\r\n \r\n\tpublic function __construct($host, $user, $pass, $dbname){\r\n\t \r\n\t}\r\n\t \r\n\tpublic function connect(){\r\n\t\/\/Implementa a conex\u00e3o\r\n\t}\r\n\t \r\n\tpublic function insert($data){\r\n\t\/\/Implementa\u00e7\u00e3o do Insert usando MySQL\r\n\t}\r\n\t \r\n\tpublic function update($data, $where){\r\n\t\/\/Implementa\u00e7\u00e3o do update usando MySQL\r\n\t}\r\n\t \r\n\tpublic function select($columns='*', array $filters=null){\r\n\t\/\/Implementa\u00e7\u00e3o do SELECT usando MySQL\r\n\t}\r\n\tpublic function delete($where){\r\n\t\/\/Implementa\u00e7\u00e3o do DELETE usando MySQL\r\n\t}\r\n\t \r\n\tpublic function close(){\r\n\t\/\/Fecha a conex\u00e3o\r\n\t}\r\n\t \r\n\tpublic function setTableName($name){\r\n\t\/\/define nome da tabela\r\n\t}\r\n}<\/pre>\n<p>Repare que todos os m\u00e9todos que definimos na Interface foram implementados, s\u00f3 que como a classe vai implementar isso, vai depender de cada banco de dados.<\/p>\n<p>Vamos fazer outro exemplo:<\/p>\n<p><strong>PostgreSQLDataBase.php<\/strong><\/p>\n<div>\n<pre class=\"lang:default decode:true\">&lt;?php\r\n \r\nclass PostgreSQLDataBase implements DataBase{\r\n \r\n\tpublic function __construct($host, $user, $pass, $dbname){\r\n\t \r\n\t}\r\n\t \r\n\tpublic function connect(){\r\n\t\/\/Implementa a conex\u00e3o\r\n\t}\r\n\t \r\n\tpublic function insert($data){\r\n\t\/\/Implementa\u00e7\u00e3o do Insert usando Postgre\r\n\t}\r\n\t \r\n\tpublic function update($data, $where){\r\n\t\/\/Implementa\u00e7\u00e3o do update usando Postgre\r\n\t}\r\n\t \r\n\tpublic function select($columns='*', array $filters=null){\r\n\t\/\/Implementa\u00e7\u00e3o do SELECT usando Postgre\r\n\t}\r\n\tpublic function delete($where){\r\n\t\/\/Implementa\u00e7\u00e3o do DELETE usando Postgre\r\n\t}\r\n\t \r\n\tpublic function close(){\r\n\t\/\/Fecha a conex\u00e3o\r\n\t}\r\n\t \r\n\tpublic function setTableName($name){\r\n\t\/\/define nome da tabela\r\n\t}\r\n}<\/pre>\n<\/div>\n<p>Veja que fiz a mesma coisa, mas a forma de implementar a instru\u00e7\u00f5es de conectar, inserir, etc, vai depender da classe, mas a \u00fanica coisa que sei mesmo \u00e9 que eles ter\u00e3o que ter esses m\u00e9todos.<\/p>\n<p>Agora criaremos uma nova classe a qual trabalhar\u00e1 com essas classes que v\u00e3o abstrair.<\/p>\n<p><strong>DataAccessObject.php<\/strong><\/p>\n<pre class=\"lang:php decode:true\">&lt;?php\r\n \r\nclass DataAccessObject implements DataBase{\r\n\tprotected $adapter;\r\n\t \r\n\tpublic function __construct(DataBase $object){\r\n\t\t$this-&gt;adapter = $object;\r\n\t\t$this-&gt;connect();\r\n\t}\r\n\t \r\n\tpublic function setTableName($name){\r\n\t\t$this-&gt;adapter-&gt;setTableName($name);\r\n\t}\r\n\t \r\n\tpublic function connect(){\r\n\t\t$this-&gt;adapter-&gt;connect();\r\n\t}\r\n\t \r\n\tpublic function insert($data){\r\n\t\t$this-&gt;adapter-&gt;insert($data);\r\n\t}\r\n\t \r\n\tpublic function update($data, $where){\r\n\t\t$this-&gt;adapter-&gt;update($data, $where);\r\n\t}\r\n\t \r\n\tpublic function delete($where){\r\n\t\t$this-&gt;adapter-&gt;delete($where);\r\n\t}\r\n\t \r\n\tpublic function close(){\r\n\t\t$this-&gt;adapter-&gt;close();\r\n\t}\r\n}<\/pre>\n<p>Veja que criei uma classe que tamb\u00e9m implementa a Interface <em>DataBase<\/em>. S\u00f3 que agora ela tem um atributo chamado <em>adapter<\/em>, que vai ser respons\u00e1vel por guardar a inst\u00e2ncia da classe do banco de dados que irei utilizar.<\/p>\n<p>Veja que no construtor \u00e9 informado que\u00a0objeto passado tem que ter implementado a interface <em>DataBase.\u00a0I<\/em>sso me garante que saberei quais\u00a0m\u00e9todos irei utilizar. Mas veja que n\u00e3o falei se ser\u00e1 MySQL, PostgreSQL etc,\u00a0pois\u00a0n\u00e3o precisa.<\/p>\n<p>O\u00a0que preciso saber \u00e9 se\u00a0ele tem a Interface implementada pra pode utilizar nesta classe.<\/p>\n<pre class=\"lang:php decode:true \">\/\/Inclui as classes\r\nrequire_once \"Db\/DataBase.php\";\r\nrequire_once \"Db\/MySQLDataBase.php\";\r\nrequire_once \"Db\/DataAccessObject.php\";\r\n \r\n\/\/Instancia classe que abstrair\u00e1 as a\u00e7\u00f5es do MySQL\r\n$database = new MySQLDataBase($host, $user, $pass, $dbname);\r\n \r\n\/\/Instancio a classe que far\u00e1 as opera\u00e7\u00f5es, dizendo que banco de dados irei utilizar\r\n$dao = new DataAccessObject($database);\r\n \r\n\/\/Definir o nome da tabela\r\n$dao-&gt;setTableName('produtos');\r\n \r\n\/\/fa\u00e7o uma opera\u00e7\u00e3o\r\n$dao-&gt;delete('idProduto = 1');<\/pre>\n<p>Agora vamos dizer que precisamos usar o PostgreSQL. Simples, apenas instanciamos a classe do PostgreSQL e passamos para classe <em>DataAccessObject.<\/em><\/p>\n<div>\n<pre class=\"lang:php decode:true \">\/\/Inclui as classes\r\nrequire_once \"Db\/DataBase.php\";\r\nrequire_once \"Db\/PostgreSQLDataBase.php\";\r\nrequire_once \"Db\/DataAccessObject.php\";\r\n \r\n\/\/Instancia classe que abstrair\u00e1 as a\u00e7\u00f5es do PostgreSQL\r\n$database = new PostgreSQLDataBase($host, $user, $pass, $dbname);\r\n \r\n\/\/Instancio a classe que far\u00e1 as opera\u00e7\u00f5es, dizendo que banco de dados irei utilizar\r\n$dao = new DataAccessObject($database);\r\n \r\n\/\/Definir o nome da tabela\r\n$dao-&gt;setTableName('produtos');\r\n \r\n\/\/fa\u00e7o uma opera\u00e7\u00e3o\r\n$dao-&gt;delete('idProduto = 1');<\/pre>\n<p>Veja que a opera\u00e7\u00e3o no banco de dados continuar\u00e1 a mesma e a l\u00f3gica da aplica\u00e7\u00e3o n\u00e3o vai mudar, pois\u00a0sei que as classes que v\u00e3o trabalhar com banco de dados ter\u00e3o a Interface com as opera\u00e7\u00f5es que foram definidas.<\/p>\n<p>Ent\u00e3o a ideia da Interface \u00e9 definir uma forma de trabalhar, mas a forma que voc\u00ea\u00a0trabalhar\u00e1 vai depender de cada classe.<\/p>\n<p>Definimos que \u00a0trabalharemos com as opera\u00e7\u00f5es no banco de dados. Todas as classes que implementarem a Interface <em>DataBase<\/em>\u00a0ter\u00e3o que ter esses m\u00e9todos caso precise mudar de banco de dados, n\u00e3o terei perda no sistema, porque sei que ir\u00e3o trabalhar da mesma forma, mas s\u00f3 a implementa\u00e7\u00e3o que ser\u00e1 diferente.<\/p>\n<p>Gostaram do artigo?<\/p>\n<p>Deixe seu coment\u00e1rio e compartilhe com seus amifos.<\/p>\n<\/div>\n<div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ao trabalhar com Orienta\u00e7\u00e3o a Objeto,\u00a0algo que se espera \u00e9 a confiabilidade de seus participantes. E uma das formas de garantir essa confiabilidade \u00e9 a utiliza\u00e7\u00e3o de Interface. A Interface permite definir um \u201ccontrato\u201d na qual as classes que v\u00e3o implement\u00e1-las ter\u00e3o que ter os m\u00e9todos definidos pela interface. Vamos ver\u00a0algo mais pr\u00e1tico para melhorar [&hellip;]<\/p>\n","protected":false},"author":67,"featured_media":4598,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1178],"tags":[],"class_list":["post-4380","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacao"],"_links":{"self":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts\/4380","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/users\/67"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/comments?post=4380"}],"version-history":[{"count":0,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts\/4380\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/media\/4598"}],"wp:attachment":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/media?parent=4380"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/categories?post=4380"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/tags?post=4380"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}