Trabalhando em camadas no PHP
Canal: PHP | Autor: Cristiano Gomes | Publicado em: 17/06/2009 | Views: 2.232Aqui 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,
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:
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:
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:
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.
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.
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]
Artigo anterior
Economizando código com o Oper.
Recentemente descobri uma funcionalida. Próximo artigo
SQL Server + PHP: Conexão ao b.
O SQL Server pode ser utilizado com PH.
Economizando código com o Oper.
Recentemente descobri uma funcionalida. Próximo artigo
SQL Server + PHP: Conexão ao b.
O SQL Server pode ser utilizado com PH.









Notei que o uso das camadas está em OOP.
Como seria no paradigma estrutural?
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...
Em breve estará disponível.
pra que serve isso?
function __construct($novo_titulo)
sou novo na área, gostaria de entender melhor o codigo
http://agentenarede.chrisgomes.info/php/php-orientado-a-objeto-parte-2/
Qualquer dúvida, estamos aí amigo!
Cristiano Gomes, o link http://agentenarede.chrisgomes.info/php/php-orientado-a-objeto-parte-2/ não está acessível.
Sobre meu link é que devido a problemas técnicos(leia-se falta de pagamento) o site saiu do ar.
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.
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.
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.
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.
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!
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!
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...
.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>
.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>