Dicas de estilo de programação
PHP embutido em HTML
Conforme adiantado, uma das características que mais atrapalham a legibilidade de um código PHP é o fato de ele poder ser embutido em um HTML de forma desordenada. Esta característica da linguagem tem uma finalidade útil, já que permite manter uma equipe focada no HTML + CSS (layout) e outra equipe focada no PHP (lógica de negócio). Mas, para isso ocorrer, o "PHP embutido em HTML" deve ser mínimo possível. Isso significa que, o ideal, é que se utilize os delimitadores de código PHP apenas em pontos específicos do HTML e não para embutir gigantescos blocos de código PHP.
Em geral, o HTML deve ter pontos específicos onde imprimem valores armazenados em variáveis ou que invocam funções ou métodos. Nestas funções/métodos, podem existir lógicas mais complexas, mas que ficam em arquivos externos e totalmente PHP. Desta forma, o objetivo do HTML é apresentar, de maneira clara, como será a estrutura da página ou de uma parte da página gerada dinamicamente.
Um exemplo de código HTML com PHP embutido e que serve exclusivamente para servir de base para uma fácil visualização da estrutura do layout segue abaixo:
Para utilizar este arquivo, o cliente acessaria um script totalmente PHP. Este script montaria os dados do objeto $pagina e faria um "include" no arquivo apresentado acima. Desta forma, os "pontos-chave" do layout seriam carregados com informações específicas da página desejada.
Em geral, deve-se evitar a utilização de loops ou estruturas de controle dentro de códigos PHP embutidos em HTML. Mas, caso isso seja essencial, o ideal é utilizar a sintaxe alternativa destas estruturas (http://www.php.net/manual/en/control-structures.alternative-syntax.php). Ao invés de utilizar "abre chaves" e "fecha chaves" para delimitar um bloco de comandos, utilizar "dois pontos" para indicar início do bloco e uma palavra-chave para indicar o final. Veja um exemplo:
Note que usando esta notação, o final do foreach fica explícito, aumentando a legibilidade.
Conforme adiantado, uma das características que mais atrapalham a legibilidade de um código PHP é o fato de ele poder ser embutido em um HTML de forma desordenada. Esta característica da linguagem tem uma finalidade útil, já que permite manter uma equipe focada no HTML + CSS (layout) e outra equipe focada no PHP (lógica de negócio). Mas, para isso ocorrer, o "PHP embutido em HTML" deve ser mínimo possível. Isso significa que, o ideal, é que se utilize os delimitadores de código PHP apenas em pontos específicos do HTML e não para embutir gigantescos blocos de código PHP.
Em geral, o HTML deve ter pontos específicos onde imprimem valores armazenados em variáveis ou que invocam funções ou métodos. Nestas funções/métodos, podem existir lógicas mais complexas, mas que ficam em arquivos externos e totalmente PHP. Desta forma, o objetivo do HTML é apresentar, de maneira clara, como será a estrutura da página ou de uma parte da página gerada dinamicamente.
Um exemplo de código HTML com PHP embutido e que serve exclusivamente para servir de base para uma fácil visualização da estrutura do layout segue abaixo:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title><?php echo $pagina->title ?></title> <?php echo $pagina->metadata ?> <?php echo $pagina->style ?> <?php echo $pagina->script ?> </head> <body> <div id="pagina"> <div id="titulo"> <h1><?php echo $pagina->titulo ?></h1> </div> <div id="navegacao"> <?php echo $pagina->navegacao ?> </div> <div id="conteudo"> <?php echo $pagina->executar() ?> </div> <div id="rodape"> <p><?php echo $pagina->creditos ?></p> </div> </div> </body> </html>
Para utilizar este arquivo, o cliente acessaria um script totalmente PHP. Este script montaria os dados do objeto $pagina e faria um "include" no arquivo apresentado acima. Desta forma, os "pontos-chave" do layout seriam carregados com informações específicas da página desejada.
Em geral, deve-se evitar a utilização de loops ou estruturas de controle dentro de códigos PHP embutidos em HTML. Mas, caso isso seja essencial, o ideal é utilizar a sintaxe alternativa destas estruturas (http://www.php.net/manual/en/control-structures.alternative-syntax.php). Ao invés de utilizar "abre chaves" e "fecha chaves" para delimitar um bloco de comandos, utilizar "dois pontos" para indicar início do bloco e uma palavra-chave para indicar o final. Veja um exemplo:
... < ul> <?php foreach ($menu as $item): ?> < li><a href="<?php echo $item->link ?>"><?php echo $item->nome ?>< /li> <?php endforeach ?> < /ul> ...
Note que usando esta notação, o final do foreach fica explícito, aumentando a legibilidade.
Cara... Muito bom! Aprendi, e muito, com este artigo!
10/05/2012 12:00pm
(~12 anos atrás)
Parabéns pelo artigo! :-)
Por isso eu acho importante o uso de frameworks, pois eles seguem certos padrões de desenvolvimento e não vira bagunça.
Por isso eu acho importante o uso de frameworks, pois eles seguem certos padrões de desenvolvimento e não vira bagunça.
31/03/2011 2:15am
(~13 anos atrás)
Josué, a quantidade de memória usada pelo PHP em uma execução é limitada pela diretiva memory_limit, do php.ini. Você consegue alterar o valor dela em tempo de execução chamando a função ini_set:
Se não me engano, o padrão é 128M, que já é uma quantidade considerável. O conteúdo gerado por uma página normalmente tem de 50Kb a 300Kb. Em casos extremos, pode chegar a 1Mb, mas é muito abaixo de 128M.
Um detalhe que ajuda a usar menos memória é encapsular bem os métodos. Assim, as variáveis (não estáticas) criadas exclusivamente para os métodos são desalocadas assim que o método termina a execução. Ou, caso alguma variável gigante não precisa mais ser usada em determinado ponto do código, usa-se unset para desalocá-la.
ini_set('memory_limit', '128M');
Se não me engano, o padrão é 128M, que já é uma quantidade considerável. O conteúdo gerado por uma página normalmente tem de 50Kb a 300Kb. Em casos extremos, pode chegar a 1Mb, mas é muito abaixo de 128M.
Um detalhe que ajuda a usar menos memória é encapsular bem os métodos. Assim, as variáveis (não estáticas) criadas exclusivamente para os métodos são desalocadas assim que o método termina a execução. Ou, caso alguma variável gigante não precisa mais ser usada em determinado ponto do código, usa-se unset para desalocá-la.
18/01/2011 2:35pm
(~14 anos atrás)
Há tempos venho ensaiando criar um script com o layout html como o exemplo da página 2 do artigo em questão.
Depois, eu utilizaria uma variável única pra concatenar o conteúdo gerado por uma página em específico e, ao termino de todo o processamento, imprimí-la no local adequado conforme a abordagem do Carlos Eduardo Gomes Monteiro (segundo post de baixo pra cima).
Entretanto, ainda não me sinti confortável em somar essas duas abordagens em especial pelo fato de não ter tando controle da quantidade de dados armazenado na variável que daria o output do conteúdo. Esse desconforto de seve em eu não saber exatamente o tamanho/memória consumida que o PHP/servidor suportaria.
Alguém tem idéia qual o limite máximo de tamanho de uma variável e no que isso pode impactar para o servidor?
Depois, eu utilizaria uma variável única pra concatenar o conteúdo gerado por uma página em específico e, ao termino de todo o processamento, imprimí-la no local adequado conforme a abordagem do Carlos Eduardo Gomes Monteiro (segundo post de baixo pra cima).
Entretanto, ainda não me sinti confortável em somar essas duas abordagens em especial pelo fato de não ter tando controle da quantidade de dados armazenado na variável que daria o output do conteúdo. Esse desconforto de seve em eu não saber exatamente o tamanho/memória consumida que o PHP/servidor suportaria.
Alguém tem idéia qual o limite máximo de tamanho de uma variável e no que isso pode impactar para o servidor?
18/01/2011 12:20pm
(~14 anos atrás)
Cara, estou impressionado, cada dia que passa, descubro que conheço menos de PHP hehehe Parabéns !!!
30/09/2010 9:57am
(~14 anos atrás)
Sou novo no site phpbrail, quero dar os parabéns pelo artigo, achei sensacional.
Abraço.
Anderson de Oliveira Morais.
Abraço.
Anderson de Oliveira Morais.
28/09/2010 12:09pm
(~14 anos atrás)
Acho interessante a forma de usar os arquivos .tpl com as variáveis, as vezes vejo coisa como %%TPL_RODAPE%% e Olá você tem %s créditos e %s de débitos.
Alguem pode me explicar o uso dessa tecnologia?
Eu realmente ainda não entendi.
Alguem pode me explicar o uso dessa tecnologia?
Eu realmente ainda não entendi.
15/06/2010 5:06am
(~14 anos atrás)
Muito bom!
Principalmente a parte sobre as notações "heredoc" e "nowdoc" (que eu desconhecia até então).
[]'s
Mario
Principalmente a parte sobre as notações "heredoc" e "nowdoc" (que eu desconhecia até então).
[]'s
Mario
08/06/2010 1:45pm
(~14 anos atrás)
Ótimo artigo!!!
Duas coisas que gostaria de comentar.
Esta parte
Eu prefiro ao invés de imprimir, eu gosto sempre de atribuir a variaveis e fazer a impressão apenas no final.
Que inclusive, algo que você citou no começo de forma sutil mas não detalhada.
Eu sempre atribuo tudo à variaveis.
Deixando as impressões apenas para o final.
Pois assim, toda a execução do PHP seria feita, e apenas após concluir é que viria o HTML.
Isso ajuda muito em relação do uso de funções como header(), session_start() e etc...
Outro ponto importante que você comentou foi os parametros nas funções.
Isso realmente é um problema quando se cria muitos parametros.
Eu também faço como você as vezes, utilizando arrays para parametros opcionais.
Mas uma outra forma de faze-lo.
É em caso de métodos de uma classe, utilizar métodos GET e SET para determinar os parametros opcionais.
Ou seja, dentro da classe, já seta os atributos com valores padrões, e utilizando o SET apenas para o caso de setar um valor diferente do padrão.
Isto também dá mais clareza ao código, pois fica mais fácil de ser entendido, sendo que utilizando array, o programador vai ter que ler o código para entender como ele deve escrever o array com os valores opcionais...
Mas estes dois pontos é claro, é tudo uma questão de estilo né...
Só estou deixando o meu ponto de vista, quem sabe agrade alguem né...
Abraço a todos!!!
Duas coisas que gostaria de comentar.
Esta parte
$time = time(); foreach ($itens as $item) { if ($item->tamanho > $tamanho_minimo) { foreach ($item->elementos as $elemento) { if ($elemento->visivel) { echo '<p>'; if ($data > $time) { echo 'teste'; } echo $elemento->nome; echo '</p>'; } } } }
Eu prefiro ao invés de imprimir, eu gosto sempre de atribuir a variaveis e fazer a impressão apenas no final.
Que inclusive, algo que você citou no começo de forma sutil mas não detalhada.
Eu sempre atribuo tudo à variaveis.
Deixando as impressões apenas para o final.
Pois assim, toda a execução do PHP seria feita, e apenas após concluir é que viria o HTML.
Isso ajuda muito em relação do uso de funções como header(), session_start() e etc...
Outro ponto importante que você comentou foi os parametros nas funções.
Isso realmente é um problema quando se cria muitos parametros.
Eu também faço como você as vezes, utilizando arrays para parametros opcionais.
Mas uma outra forma de faze-lo.
É em caso de métodos de uma classe, utilizar métodos GET e SET para determinar os parametros opcionais.
Ou seja, dentro da classe, já seta os atributos com valores padrões, e utilizando o SET apenas para o caso de setar um valor diferente do padrão.
Isto também dá mais clareza ao código, pois fica mais fácil de ser entendido, sendo que utilizando array, o programador vai ter que ler o código para entender como ele deve escrever o array com os valores opcionais...
Mas estes dois pontos é claro, é tudo uma questão de estilo né...
Só estou deixando o meu ponto de vista, quem sabe agrade alguem né...
Abraço a todos!!!
07/06/2010 12:07pm
(~14 anos atrás)