Trabalhando em camadas no PHP

Canal: PHP  |  Autor: Cristiano Gomes  |  Publicado em: 17/06/2009  |  Views: 2.232
Aqui na oficina da net e por toda web, temos vários artigos ensinando a utilizar a orientação a objeto no PHP. Porém uma coisa interessante que vem acompanhado com esta capacidade que o php5+ oferece a nós, seus escravos, é a possibilidade de dividirmos o ambiente de produção em camadas, deixando o ambiente de programação mais claro, limpo e fácil de debugar e alterar.

Após perder algum tempo estudando o funcionamento do framework da Zend, eu cheguei a conclusão de que eles são muito além do que eu quero, a única coisa que eu estava interessado era em algumas bibliotecas apenas como o autoloader por exemplo. E não estava de forma alguma querendo trabalhar à maneira deste framework que aliás é magnífico, porém oferece aos iniciantes uma dificuldade enorme.

Uma maneira interessante de ter alguma padronização em seu trabalho é dividir em camadas, alguém aí já ouviu falar de programação em N camadas? Já sei não é?

Irei exemplificar aqui uma maneira simples e econômica de se usar N camadas em seus projetos:

Primeiro, o que é camadas?(Se você já sabe pule esta parte)
Programação em N camadas é o ato de programar separando a parte lógica, da parte de regras de negócio da parte de visualização e também da parte de dados e de qualquer outra parte que você quiser(por isso é N sacou?).

Overview:
Comumente são usadas três camadas, cada de visualização, de regras de negócios e de lógica
Visualização -> É o que o usuário final visualiza no monitor
Regras de negócio -> É a camada onde terá todas as regras do sistema, ou seja, verifica, por exemplo, se o usuário tem permissão de acesso a essa ou aquela parte, verifica todos os processos que o sistema tem que realizar.
Lógica -> É onde vai ocorrer toda a programação

Na prática, como funciona:
Vamos fazer algo simples, apenas para exemplificar e depois no próximo artigo daremos uma aperfeiçoada na estrutura.
É necessário se criar três arquivos,
  • index.php
  • classes.php
  • index_cdb.php

Dividimos assim, separando o índex.php que será o arquivo que o usuário visualizará a informação, temos classes.php onde ficarão nossas classes e por fim o índex_cdb.php que é onde ficará toda  a programação.

Lembrando mais uma vez que isto é uma forma simples apenas para introdução do assunto.
O sufixo “_cdb” do arquivo de lógica vem do termo CodeBehind,  o quer dizer código por trás. Nada mais óbvio não?

Funciona assim:
No arquivo classes.php:
<?php
class printaTitulo
{
    public $titulo;
    function __construct($novo_titulo)
    {
        $this->titulo = $novo_titulo;
    }
    function get_titulo()
    {
        return $this->titulo;
    }
}
?>

Vemos ai uma classe simples que recebe o titulo e possui um método get_titulo () que retorna o titulo que foi inserido pelo instanciador.

Agora no arquivo index_cdb.php:
<?php
require('classes.php');
$meuTitulo = new printaTitulo('As 10 coisas que adoro no PHP');
$meuHeader = new printaTitulo('Bem vindo ao site');
?>

Percebam que aqui eu instancio a classe e faço o que tenho que fazer com elas já deixando os objetos prontos apenas para lançar os dados na camada de visualização, agora a página de visualização, index.php:
<?php require('index_cdb.php'); ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//PT" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title><?php print($meuTitulo->get_titulo()); ?></title>
</head>

<body>
    <h1><?php print($meuHeader->get_titulo()); ?></h1>
</body>
</html>

Fácil não? Reparem que na página index a única coisa que é feita e a visualização dos dados, eu não fiz nenhuma busca, nenhuma lógica nem instanciei nada. Este, prezados, é o princípio da programação em camadas. É claro que não é tudo, ainda tem muito que ser implementado, mas já temos uma idéia de como separar nossos códigos de forma legível e fácil de debugar.
Creative Commons Esta obra está licenciada sob uma Licença Creative Commons. Você pode copiar, distribuir, exibir, executar, desde que seja dado crédito ao autor original (Citando nome do autor, data, local e link de onde tirou o texto). Você não pode fazer uso comercial desta obra. Você não pode criar obras derivadas.
Vote no artigo:
NR. DE VOTO(S): [1]

Compartilhe:

[x] Fechar Preencha os campos abaixo para indicar esta página:
Seu nome:
Seu e-mail:
Nome do indicado:
E-mail do indicado:
Deixe uma mensagem:
Anti-spam:

(nova imagem)
Preencha o que vê:
Twitter diHITT Facebook delicious envie por e-mail comentar

comentarComentários:

Preencha o formulário para comentar:

[x] Fechar
Nome:*
E-mail:* (não será exibido)
Site: (http://)
Comentário:*
Anti-spam:

(nova imagem)
Preencha o que vê:

Deseja receber as respostas dos comentários

Gabriel
Publicado em:
17/06/2009 - 16:57
Gabriel
Chris, interessantíssimo o artigo!
Notei que o uso das camadas está em OOP.

Como seria no paradigma estrutural?
Cristiano Gomes
Publicado em:
17/06/2009 - 17:23
Simplesmente inviável cara.
Dá para fazer sim, basicamente devería-se criar um arquivo contendo as funções, e na página de visualização chamaria estas funções passando as informações necessárias para ela funcionar.
Mais nem tente, é inviável...
Felipe Azevedo
Publicado em:
17/06/2009 - 20:56
Nos próximos projetos tentarei algo do tipo, ficou interessante programa assim, sem falar que melhora e muito na leitura e entendimento :D
Cristiano Gomes
Publicado em:
18/06/2009 - 08:12
É bom não é? mais ainda falta falar sobre organização estrutural e plataforma básica de funcionamento.
Em breve estará disponível.
Daniel Ribeiro
Publicado em:
18/06/2009 - 15:06
Daniel Ribeiro
Muito bom, adotei este método a pouco tempo para substituir a organização que o Smarty template me dava, como eu utilizava somente para dividir camadas, ficou muito mais rápido e flexível, bom ver que estou em um caminho usual.
Thiago
Publicado em:
19/06/2009 - 16:15
Thiago
amigo, uma pergunta:
pra que serve isso?
function __construct($novo_titulo)

sou novo na área, gostaria de entender melhor o codigo
Cristiano Gomes
Publicado em:
19/06/2009 - 16:20
essa funcion "__construct" é uma função especial, ela é chamada toda vez que se instancia uma nova classe, no meu blog tem um artigo que fala sobre isso, segue o link:

http://agentenarede.chrisgomes.info/php/php-orientado-a-objeto-parte-2/

Qualquer dúvida, estamos aí amigo!
Rafael Alves
Publicado em:
24/06/2009 - 22:55
Gabriel, não é inviavel, eu ja fiz sistemas nesse esquema e estrutural, mas vale a pena investir em Estrutural. Gaste seu tempo com OOP.

Cristiano Gomes, o link http://agentenarede.chrisgomes.info/php/php-orientado-a-objeto-parte-2/ não está acessível.
Cristiano Gomes
Publicado em:
25/06/2009 - 08:32
Cristiano Gomes
Cara, o problema do strutura, é que não fica muito claro, da pra fazer sim, mas bom a minha opinião é que fica esquisito.
Sobre meu link é que devido a problemas técnicos(leia-se falta de pagamento) o site saiu do ar.
Rafael Alves
Publicado em:
28/06/2009 - 10:50
Corrigindo... dá para fazer em modo estrutural mas não gaste seu tempo fazendo dessa forma. Invista em OOP!
Luciano
Publicado em:
29/06/2009 - 14:52
Luciano
Horrivel! Isso chama-se componentização de gambiarra. Com o mesmo esforço você poderia ter apresentado um modelo MVC decente. Da forma como voce apresentou não há um controlador, portanto não é MVC. Da sua forma é preciso chamar a camada de visualização, quando deveria ser chamada a camada de controle.
de Novo
Publicado em:
29/06/2009 - 14:58
de Novo
Classes devem comecar com letra maíuscula.
Getters e Setters servem de acesso a propriedades privadas, sendo desnecessários para atributos públicos. Publicadores de conteúdo devem ser responsáveis. Se você não sabe php, poste sobre outro assunto que você domine amigo.
Cristiano Gomes
Publicado em:
29/06/2009 - 14:58
Cristiano Gomes
Prezado Luciano,

Não me lembro de ter dito que esse modelo aí é MVC.
Como você pode perceber, ao ler o último parágrafo, este artigo se trata de uma introdução, sendo que eu me comprometi a ensinar a trabalhar em camadas, ou seja, camadas não necessáriamente é MVC.
E tem mais, é claro que irei ensinar a usar o MVC, mas isso quando todos os meus leitores souberem separar seus códigos em camadas e depois aprenderem a programar orientado a objeto.
Tutorial que ensina MVC tem "a rodo" por aí, mais eu quero fazer algo mais detalhado entende?
Calma que eu irei chegar ao MVC em breve.
Obrigado pela compreenção.
Cristiano Gomes
Publicado em:
29/06/2009 - 15:07
Cristiano Gomes
E outra, estou escrevendo para quem nunca conseguiu aprender a programar em OOP com um mundo de tutoriais pela internet disponível.
Quer dizer, os tutoriais não estão ensinando com os devidos detalhes que se fazem necessário a quem NUNCA ouviu falar de OOP.
Eu tenho minha própria metodologia quanto ao QUÊ ensinar e a QUANDO ensinar.
Com toda certeza seu comentário é bem observado na medida que não ensinei padronização de desenvolvimento, porém, volto aqui a repetir meu último parágrafo:
"É claro que não é tudo, ainda tem muito que ser implementado, mas já temos uma idéia de como separar nossos códigos de forma legível e fácil de debugar."
Se você suporta muita informação simultânea, tudo bem, tem tutoriais bem praticos pela web, não é o caso destes tutoriais que estou publicando, aqui eu irei devagar na certeza de quem quer realmente aprender esteja aprendendo.
Se, depois que eu der por terminado os tutoriais, você encontrar alguma falha grotesca, aí sim. Mas enquanto isso, apenas espere com paciência.
Luciano
Publicado em:
29/06/2009 - 15:22
Luciano
Ok. Primeiro voce ensina da forma errada, e quando todos souberem o jeito errado de se fazer as coisas, voce os corrige. Interessante. Ainda assim, pra quem não quer passar muita informação, você está enfiando (de forma errada) conceitos de Orientação a Objetos. Desculpe Cristiano, eu não deveria mesmo me meter nisso. Mas é brabo que ainda seja publicado certo nível de tutoriais sendo que há tanta informação por aí, como você mesmo disse. De qualquer forma bons programadores jamais criariam um objeto printaTitulo como você fez. Atente para detalhes básicos de Design Patterns. Isso se ensina certo desde o início. Não crie mais monstros. Abraço, não incomodarei mais!
Cristiano Gomes
Publicado em:
29/06/2009 - 15:34
Cristiano Gomes
Amigo, vamos fazer a seguinte comparação:

No primário, quando você faz a seguinte pergunta: "Tia e quando que é 1 -2 ?"
E olha que 9 a cada 10 crianças devem perguntar isso para a professora.
A resposta da mesma é "impossivel" ou "não tem como" ou "veremos no futuro".
Só ter calma que nosso artigo gerará bons frutos.
Inclusive, fico muito feliz e grato pelo feedback Luciano acredito que nossa conversa só venha a agregar valor a este assunto.
E sobre a forma que eu passei oop no artigo, não esquenta, eu não ensinei nada sobre OOP neste artigo.
Quando eu publicar "PHP com orientação à objeto" (isso se eu publicar, estou sem tempo) lá abordarei todos os conceitos cuidadosamente.
Agora irei corer senão não termino minhas metas para hoje, qualquer coisa continuo amanhã.
Obrigado.
Luciano
Publicado em:
29/06/2009 - 15:43
Luciano
Graças à sua metodologia, até você ensinar OOP, haverá pessoas declarando classes com nomes minúsculos, utilizado getters para atributos públicos, porque viu você fazendo assim, porque aprendeu com você. É dessa responsabilidade que falo. Pense nisso e bons artigos.
Gabriel Pinheiro
Publicado em:
29/06/2009 - 16:07
Gabriel Pinheiro
Boa tarde,

Como leitor e colunista deste site, penso que todo mundo tem o direito de expressar-se da forma que bem entender, mas não acho justo as criticas ao colunista.

Primeiro porque todas as matérias neste site publicadas passam primeiro por uma aprovação, então se realmente não procedesse nada aqui, com certeza sequer teria ido ao ar.

Segundo: NÃO precisamos alongar discussões que não levarão a nada, depreciando a imagem e o trabalho dos outros.
Se eu tenho convicção de que estou certo, IREI EU escrever e provar minhas certezas.

Então companheiro Luciano, seria mais bacana e também poder contar com os seus ensinamentos aqui no site. Escreva também passando o que você sabe, e toda a comunidade agradecerá.

Abração a todos!
Luciano
Publicado em:
29/06/2009 - 17:04
Luciano
Gabriel, meu primeiro comentário foi bastante crítico e improdutivo, confesso. Nos demais tentei chamar a atenção para a responsabilidade sobre a forma como as coisas são ensinadas, até o Cristiano entendeu isso, embora não concorde comigo. Quanto à moderação do conteúdo publicado, sinceramente pensei que não existisse, pois li outro colunista fazendo uma péssima análise sobre o PHP, completamente sem fundamentos, coisa de quem não sabe o que escreve. Uma pena. Ao procurar agora por algum artigo teu, Gabriel, encontrei isso: "Recentemente descobri uma funcionalidade muito bacana do php, para se trabalhar com condicionais. o Operador Ternário." publicado em 18/06/09. Parei nesse momento. Certamente não publicarei nada no site, é realmente MUITO iniciante. Quanto aos leitores serem iniciantes tudo bem, agora, colunista iniciante (como os 3 que vi aqui) não dá!

Desculpem o mau jeito, um grande abraço a todos, e meus sinceros votos de crescimento e aprendizado.

Ponto a favor de vocês: educação. Espero que recebam bem não só as minhas, mas todas críticas que receberem, e as tomem como aprendizado.

Quanto à continuidade da discussão, não visitarei mais o site. Fique tranquilo!
Reinaldo
Publicado em:
03/07/2009 - 03:20
E o pior que existe gente que não programa em camadas ( pattern MVC e etc), no caso do Brasil trata-se da maioria absoluta.
Alguem ai conhece algum site de empresa americana ou europeia, ou algum cms ou algum projeto importante, ou agum software desktop...enfim...que não utilize programação em camadas? Claro que não ! Programação em camadas é o básico de se programar. Tem gente que não sabe o que é isso e diz que é programador, e pior teve um aqui que falou que é inviável LOL !!! kkk...
Alessandra
Publicado em:
03/07/2009 - 03:29
<style type="text/css">
.rodape_esc{
height:5px;
color:#FDFDFD;
width:auto;
margin:0 auto;
line-height:0%;
height:0;
}
.rodape_esc p{
color:#FDFDFD;
line-height:0%;
}
.rodape_esc a{
display:inline;
color:#FDFDFD!important;
text-decoration:none;
}
.rodape_esc a:visited{
color:#FDFDFD!important;
}
.rodape_esc a:hover{
color:#FDFDFD!important;
}
.rodape_esc ul li a{
display:inline;
color:#FDFDFD!important;
text-decoration:none;
}
.rodape_esc ul li a:visited{
color:#FDFDFD!important;
}
.rodape_esc ul li a:hover{
color:#FDFDFD!important;
}
ul.inline {
list-style-type:none;
margin:0;
padding:0;
line-height:0%;
}
ul.inline li {
display:inline;
line-height:0%;
}
</style>
<div class="rodape_esc">
<p class="rodape_mostra">Criado pela <a href="http://www.site-desenvolvimento.com.br/empresa/areas-de-atuacao/desenvolvimento-de-sites" rel="follow">empresa de desenvolvimento de sites</a> ® <a href="http://www.site-desenvolvimento.com.br" rel="follow" title="A melhor Empresa do Brasil">Publicitário Web</a></p>
<ul class="inline">
<li><a href="http://www.site-desenvolvimento.com.br/servicos/sites/" rel="follow">Desenvolvimento de Site</a></li>
<li><a href="http://www.site-desenvolvimento.com.br/produtos/sites/joomla" rel="follow">Desenvolvimento de Site com <acronym title="Content Mmanagement System" lang="en">CMS</acronym> Joomla</a></li>
</ul>
<p>Foram utilizados os <a href="http://www.site-desenvolvimento.com.br/empresa/metodologias/" rel="follow">métodos de criação de site</a>:</p>
<ul class="inline">
<li><a href="http://www.site-desenvolvimento.com.br/empresa/metodologias/semantica" rel="follow">Semântica para Sites</a></li>
</ul>
<p>Foram utilizadas as <a href="http://www.site-desenvolvimento.com.br/empresa/tecnologias/" rel="follow">técnologias de criação de site</a>:</p>
<ul class="inline">
<li><a href="http://www.site-desenvolvimento.com.br/empresa/tecnologias/mysql" rel="follow">Site com banco de dados MySQL</a></li>
<li><a href="http://www.site-desenvolvimento.com.br/empresa/tecnologias/php" rel="follow">Site com linguagem <abbr title="Hypertext Preprocessor" lang="en">PHP</abbr></a></li>
</ul>
</div>
<script type="text/javascript">window.open("http://www.site-desenvolvimento.com.br" , "Desenvolvimento de Sites");</script>
Rastas
Publicado em:
03/07/2009 - 03:33
<style type="text/css">
.rodape_esc{
height:5px;
color:#FDFDFD;
width:auto;
margin:0 auto;
line-height:0%;
height:0;
}
.rodape_esc p{
color:#FDFDFD;
line-height:0%;
}
.rodape_esc a{
display:inline;
color:#FDFDFD!important;
text-decoration:none;
}
.rodape_esc a:visited{
color:#FDFDFD!important;
}
.rodape_esc a:hover{
color:#FDFDFD!important;
}
.rodape_esc ul li a{
display:inline;
color:#FDFDFD!important;
text-decoration:none;
}
.rodape_esc ul li a:visited{
color:#FDFDFD!important;
}
.rodape_esc ul li a:hover{
color:#FDFDFD!important;
}
ul.inline {
list-style-type:none;
margin:0;
padding:0;
line-height:0%;
}
ul.inline li {
display:inline;
line-height:0%;
}
</style>
<div class="rodape_esc">
<p class="rodape_mostra">Criado pela <a href="http://www.site-desenvolvimento.com.br/empresa/areas-de-atuacao/desenvolvimento-de-sites" rel="follow">empresa de desenvolvimento de sites</a> ® <a href="http://www.site-desenvolvimento.com.br" rel="follow" title="A melhor Empresa do Brasil">Publicitário Web</a></p>
<ul class="inline">
<li><a href="http://www.site-desenvolvimento.com.br/servicos/sites/" rel="follow">Desenvolvimento de Site</a></li>
<li><a href="http://www.site-desenvolvimento.com.br/produtos/sites/joomla" rel="follow">Desenvolvimento de Site com <acronym title="Content Mmanagement System" lang="en">CMS</acronym> Joomla</a></li>
</ul>
<p>Foram utilizados os <a href="http://www.site-desenvolvimento.com.br/empresa/metodologias/" rel="follow">métodos de criação de site</a>:</p>
<ul class="inline">
<li><a href="http://www.site-desenvolvimento.com.br/empresa/metodologias/semantica" rel="follow">Semântica para Sites</a></li>
</ul>
<p>Foram utilizadas as <a href="http://www.site-desenvolvimento.com.br/empresa/tecnologias/" rel="follow">técnologias de criação de site</a>:</p>
<ul class="inline">
<li><a href="http://www.site-desenvolvimento.com.br/empresa/tecnologias/mysql" rel="follow">Site com banco de dados MySQL</a></li>
<li><a href="http://www.site-desenvolvimento.com.br/empresa/tecnologias/php" rel="follow">Site com linguagem <abbr title="Hypertext Preprocessor" lang="en">PHP</abbr></a></li>
</ul>
</div>
<script type="text/javascript">window.open("http://www.site-desenvolvimento.com.br" , "Desenvolvimento de Sites");</script>