<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog do Beraldo &#187; Boas Práticas</title>
	<atom:link href="http://www.rberaldo.com.br/blog/tag/boas-praticas/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rberaldo.com.br/blog</link>
	<description>Programação, Música, Entretenimento e o que mais me vier à mente</description>
	<lastBuildDate>Mon, 06 Feb 2012 14:30:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Tratamento de Erros</title>
		<link>http://www.rberaldo.com.br/blog/tratamento-de-erros-2/</link>
		<comments>http://www.rberaldo.com.br/blog/tratamento-de-erros-2/#comments</comments>
		<pubDate>Wed, 06 May 2009 02:10:00 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Boas Práticas]]></category>
		<category><![CDATA[erros]]></category>
		<category><![CDATA[tratamento de erros]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/2009/05/05/tratamento-de-erros-2/</guid>
		<description><![CDATA[Artigo sobre tratamento de erros. O artigo usa a linguagem PHP, mas as técnicas podem ser adaptadas para qualquer outra linguagem.]]></description>
			<content:encoded><![CDATA[<p>Este tutorial também foi postado originalmente no Fórum iMasters, e foi criado por mim juntamente com outros membros do fórum.</p>
<p>Fonte: <a href="http://forum.imasters.uol.com.br/index.php?showtopic=229485" target="_blank" onclick="urchinTracker('/outgoing/forum.imasters.uol.com.br/index.php?showtopic=229485&amp;referer=');">http://forum.imasters.uol.com.br/index.php?showtopic=229485</a></p>
<p><span id="more-13"></span></p>
<h3>Sumário</h3>
<p><a href="#o_que"">1. O que é tratamento de erros</a><br />
<a href="#boas">2. Boas maneiras para programar sem erros</a><br />
<a href="#errada">2.1 Programar de maneira errada</a><br />
<a href="#esconder">2.2 Esconder Erros</a><br />
<a href="#falta">2.3 Falta de uma lógica mais apurada e desenvolvida</a><br />
<a href="#usuarios">2.4 Não pensar nos usuários</a><br />
<a href="#linguagem">2.5 Falta de conhecimento da linguagem com a qual se está programando</a><br />
<a href="#hardware">2.6 Falha no Hardware</a><br />
<a href="#debug">3. Como debugar um script</a><br />
<a href="#validacao">4 &#8211; Validações para evitar erros</a><br />
<a href="#excecao">5. Tratando erros com Exceções</a></p>
<h3><a name="o_que"">1. O que é tratamento de erros</a></h3>
<p>   Tratar um erro nada mais é do que preparar para rodar em qualquer situação ou, se não for possível, avisar por que não pôde ser executado. Tratando um erro você pode esperar uma situação e contorná-la ou, se não tiver jeito, finalizar a execução de uma forma segura e que não deixe o usuário sem saber o que está acontecendo. Ao fazer um tratamento de erros adequado, você pode preparar mensagens personalizadas para avisar os usuários que o sistema não pôde ser executado e notificar o erro ao administrador do site, para ele saber exatamente o que aconteceu e como proceder para corrigir o problema. Além disso, é útil para criação de estatísticas de erros.</p>
<h3><a name="boas">2. Boas maneiras para programar sem erros</a></h3>
<p>   Além de fazer um tratamento de erros adequado, você precisa programar de uma maneira que evite erros. Existem vários meios de gerar erros no seu sistema e, sabendo como evitá-los, você deixar seu sistema mais profissional e à prova de falhas. Possíveis causas de erros no sistema:</p>
<p> Programar de maneira errada<br />
 Esconder erros<br />
 Falta de uma lógica mais apurada e desenvolvida<br />
 Não pensar nos usuários<br />
 Falta de conhecimento na linguagem com a qual se está programando<br />
 Falha por parte de <em>hardware</em></p>
<p>   Explicarei um pouco sobre cada um.</p>
<h3><a name="errada">2.1 Programar de maneira errada</a></h3>
<p>   Esta tem suas principais causas: <em>preguiça</em>, <em>pressa</em>, <em>falta de planejamento</em> e/ou <em>falta de conhecimento</em>. A <em>preguiça</em> é porque na maioria das vezes o programador não quer saber como faz, mas, sim, entregar o sistema o mais rápido possível. Ele procura scripts prontos na Internet, só edita algumas coisas fáceis e acaba fazendo uma salada mista de vários sistemas prontos, tudo mal feito. O resultado é um sistema cheio de erros. Quanto mais o programador estudar e procurar entender para fazer seus sistemas, mais eles ficarão enxutos e livres de erros.</p>
<p>   A <em>pressa</em> é outra vilã. O programador acaba fazendo um monte de gambiarras e pensa assim: &#8220;Ah, depois de entregar o sistema eu arrumo os erros com calma. O mais importante é entregar no prazo!&#8221;, e acaba nunca arrumando. <em>Falta de planejamento</em> também é muito ruim e acontece quando o programador mal pegou o serviço e já quer fazer tudo de uma vez, sem pensar em como o desenvolverá. Como resultado, acaba fazendo o sistema, depois o banco de dados, e depois sai costurando as falhas até deixar tudo funcionando. Tenha calma e não se apresse em fazer. Em um sistema bem feito, 70% dele é planejamento e o restante, escrever os códigos, modelar um banco de dados de forma correta, etc.</p>
<p>   Já a pior das causas é a <em>falta de conhecimento</em>, pois é comum pessoas mal saberem o que é um HTML e já querem programar em PHP. Em alguns casos, conseguem até clientes e sempre aparecem desesperadamente nos fóruns pedindo ajuda para fazer um sistema para eles. Consequentemente nunca farão um sistema bem feito, até aprenderem a fazê-los por conta própria. Outros programadores têm até certo conhecimento, mas não o usa, enquanto outros chegam a um limite e param, acreditando que não precisam aprender mais nada. Aí surgem com aquela frase: &#8220;Em time que está ganhando não se mexe!&#8221;. Já vi programadores com 40 anos nas costas que usam o mesmo sistema que aprenderam a fazer no passado. Não querem evoluir ou aprender coisas novas, e aí acabam escondendo erros em vez de tratá-los.</p>
<p>   Existem várias maneiras de se esconder erros no PHP e muitos têm abusado desses recursos. <strong>Não se devem esconder erros!</strong>. Claro que num site já publicado você não pode deixar que usuários vejam erros do seu sistema, mas nem por isso se deve escondê-los. Se o sistema tem falhas deixe uma mensagem avisando que logo ele estará funcionando, em vez disso, por exemplo, mostrando um erro grotesco e que não significa nada ao usuário leigo, além de expor informações internas do seu sistema, como por exemplo <em>Warning: mysql_connect() [function.mysql-connect]: Access denied for user &#8216;root&#8217;@'localhost&#8217; (using password: NO) in&#8230;</em></p>
<p>   Muitas vezes eu falo que esconder erros é a mesma coisa que varrer a sujeira para debaixo do tapete. Não vou entrar em detalhes na parte de boas maneiras ao programar, porque já publicamos um artigo sobre isso (<a href="http://forum.imasters.com.br/index.php?showtopic=214963" target="_blank" onclick="urchinTracker('/outgoing/forum.imasters.com.br/index.php?showtopic=214963&amp;referer=');">leia-o aqui</a>).</p>
<h3><a name="esconder">2.2 Esconder Erros</a></h3>
<p>   Agora vou explicar como esconder um erro do PHP e como fazer para mostrar mensagens personalizadas. Os erros têm que ser escondidos em certos casos porque senão o PHP acaba mostrando mensagens de erros para o usuário, por exemplo:</p>
<p><strong>Exemplo 2.2.1 Operadores de controle de erro (retirado do <a href="http://www.php.net" target="_blank" onclick="urchinTracker('/outgoing/www.php.net?referer=');">Manual do PHP</a>)</strong><br />
   O PHP suporta um operador de controle de erro: o sinal &#8216;arroba&#8217; (@). Quando ele precede uma expressão em PHP, qualquer mensagem de erro que possa ser gerada por ela será ignorada.<br />
Se o recurso <em>track_errors</em> estiver habilitado, qualquer mensagem de erro gerada pela expressão será gravada na variável global <strong>$php_errormsg</strong>. Esta variável será sobrescrita em cada erro, assim verifique-a constantemente se você quiser usá-la.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">/* Erro intencional de arquivo */</span>
<span style="color: #000088;">$my_file</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #990000;">file</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'arquivo_nao_existente'</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Falha abrindo arquivo: '<span style="color: #006699; font-weight: bold;">$php_errormsg</span>'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Isto funciona para qualquer expressão, não apenas para funções:</span>
<span style="color: #000088;">$valor</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #000088;">$carrinho</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$produto</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// você não receberá nenhum aviso se a chave $produto não existir.</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p><strong>Nota:</strong> o operador @ funciona somente em expressões. Uma regra simples para lembrar disso: se você pode pegar o valor de alguma coisa, você pode prefixar isso com o @. Assim, você pode prefixar chamadas de variáveis, funções e include()&#8217;s, constantes e afins. Você não pode prefixar definições de funções ou classe, estruturas condicionais como o if, foreach e assim por diante.</p>
<p><strong>Exemplo 2.2.2 Ocultar erro em conexões com banco de dados</strong><br />
Usando o @ você pode ocultar erros de conexões com o banco de dados:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #339933;">@</span><span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;root&quot;</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Mensagem de erro&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>   Usando o <strong>@</strong> podemos ocultar a mensagem de erro do PHP, mas devemos, ainda, informar o usuário e exibir uma mensagem de erro personalizado, podendo usar CSS, imagens etc. O mesmo vale para erros na abertura de arquivos ou envio de e-mails.</p>
<p>   Outra maneira de ocultar erros é editando o PHP.INI na linha &#8220;display_errors = off&#8221;. Muitos programadores, por não saberem configurar corretamente o PHP.INI, deixam-no no padrão de instalação e, dependendo da versão do PHP, o display_errors está em &#8220;off&#8221;. O que recomendo é deixar em &#8220;on&#8221;, caso contrário, o PHP não irá mostrar os erros, caso ocorram. Eu vejo erros comuns pelos fóruns, tipo esse:</p>
<p><strong>Exemplo 2.2.3 Índice não encontrado</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$val</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span>val<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// erro não delimitou uma string com aspas ou apóstrofos</span></pre></td></tr></table></div>

<p>   Daí eu falo para o usuário que ele precisa delimitar as strings com aspas, por exemplo, $_POST["val"]. Mas o usuário acaba comentando: &#8220;Mas assim também funciona e não tem erro!&#8221;. Isso acontece porque o display_errors dele esta em &#8220;off&#8221; e por isso não consegue perceber o erro. O PHP entende, conforme o exemplo acima, que <strong>val</strong> é uma constante. Não a encontrando, assume como uma string e exibe um erro do tipo <strong>E_NOTICE</strong>.</p>
<p><strong>Exemplo 2.2.4 Ocultar erros com error_reporting() (retirado do <a href=""http://www.php.net"" target="_blank">Manual do PHP</a>)</strong>   A função error_reporting() define a diretiva error_reporting em tempo de execução. O PHP tem vários níveis de erros, usando essa função você pode definir o nível durante a execução do seu script. error_reporting() define o nível de erros que o PHP irá reportar, e retorna o nível antigo. O parâmetro nível pode usar um bitmask, ou constantes. É fortemente recomendado que você use constantes para assegurar compatibilidade com futuras versões. Como níveis de erros podem ser adicionados, o intervalo das constantes pode crescer, então os níveis de erros indicados anteriormente por inteiros podem não funcionar como esperado.<br />
Exemplo 1. Exemplos error_reporting()</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">// Desativa o relatório de todos os erros</span>
<span style="color: #990000;">error_reporting</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Reporta erros simples</span>
<span style="color: #990000;">error_reporting</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">E_ERROR</span> <span style="color: #339933;">|</span> <span style="color: #009900; font-weight: bold;">E_WARNING</span> <span style="color: #339933;">|</span> <span style="color: #009900; font-weight: bold;">E_PARSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Reportar E_NOTICE pode ser bom também (para reportar variáveis não iniciadas</span>
<span style="color: #666666; font-style: italic;">// ou erros de digitação em nomes de variáveis ...)</span>
<span style="color: #990000;">error_reporting</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">E_ERROR</span> <span style="color: #339933;">|</span> <span style="color: #009900; font-weight: bold;">E_WARNING</span> <span style="color: #339933;">|</span> <span style="color: #009900; font-weight: bold;">E_PARSE</span> <span style="color: #339933;">|</span> <span style="color: #009900; font-weight: bold;">E_NOTICE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Reportar todos os erros exceto E_NOTICE</span>
<span style="color: #666666; font-style: italic;">// Este é o valor padrão no php.ini</span>
<span style="color: #990000;">error_reporting</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">E_ALL</span> ^ <span style="color: #009900; font-weight: bold;">E_NOTICE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Reporta todos os erros (bitwise 63 deve ser usado no PHP 3)</span>
<span style="color: #990000;">error_reporting</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">E_ALL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// O mesmo que error_reporting(E_ALL);</span>
<span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'error_reporting'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">E_ALL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>    Os níveis de erros disponíveis estão listados abaixo. A descrição deles está em constantes predefinidas. </p>
<p> 1 E_ERROR<br />
 2 E_WARNING<br />
 4 E_PARSE<br />
 8 E_NOTICE<br />
 16 E_CORE_ERROR<br />
 32 E_CORE_WARNING<br />
 64 E_COMPILE_ERROR<br />
 128 E_COMPILE_WARNING<br />
 256 E_USER_ERROR<br />
 512 E_USER_WARNING<br />
 1024 E_USER_NOTICE<br />
 2047 E_ALL<br />
 2048 E_STRICT</p>
<p><strong>Atenção</strong><br />
A partir do PHP 5.0.0, E_STRICT com o valor 2048 está disponível. E_ALL NÃO mostra erros do nível E_STRICT.</p>
<p><strong>Recomendo deixar error_reporting(E_ALL), para mostrar todos os tipos de erros.</strong></p>
<h3><a name="falta">2.3 Falta de uma lógica mais apurada e desenvolvida</a></h3>
<p>   Agora falando sobre lógica! Muitos erros acontecem também por falta de uma lógica correta, ou seja, programam de maneira errada, fazem gambiarra <strong>(famosa POG &#8211; Programação Orientada à Gambiarras)</strong>) ou complicam demais algo que poderia ser mais simples. Já vi muitos usuários não saberem manipular datas, como somar, subtrair, etc. Acabam fazendo cada loucura com uma coisa simples. Falta de lógica pode fazer com que o sistema fique com erros e, por azar, o programador não percebe até que o erro aconteça.</p>
<h3><a name="usuarios">2.4 Não pensar nos usuários</a></h3>
<p>  Não pensar nos usuários também pode fazer com que o sistema tenha erros. Um exemplo disso é o programador ter um micro de último tipo, e configurar o PHP.INI a seu gosto, com programas atualizados e acaba desenvolvendo pensando só nele. Esquece que outros usuários que irão usar o sistema não têm o mesmo recurso. Por exemplo: o programador faz um sistema usando PHP 5.2, Apache 2.2.4, Mysql 5 e disponibiliza o sistema para outros usuários e o coitado do usuário baixa o sistema e vai rodar num servidor com PHP 4 e Mysql 3 (a grande maioria dos servidores de hospedagem demoram para se atualizarem). Aí o sistema não funciona e aparecerá um monte de mensagens de erros e o usuário nem sabe o porquê. Não estou falando que não se deve programar usando as últimas versões, mas tem que ver pra qual situação será usado o sistema e verificar se o sistema está apto a rodar na plataforma em que foi instalado.</p>
<h3><a name="linguagem">2.5 Falta de conhecimento da linguagem com a qual se está programando</a></h3>
<p>   Falta de conhecimento na linguagem PHP também faz o sistema ter muitos erros. Muitas vezes o usuário é até esforçado, mas por falta de conhecimento não sabe identificar um erro ou um problema e muito menos fazer de um jeito melhor. Acaba pegando scripts prontos para aprender, mas estes também estão sujeitos a erros e o usuário vai querer editar, deixando-o cada vez pior. Por falta de conhecimento na linguagem também acontecem muitos erros de concatenação de strings, tags PHP, ou juntar HTML + PHP, banco de dados, entre outras coisas. Nesse tipo de coisa é muito fácil de cometer erros, principalmente se o usuário for inexperiente.<br />
   É importante estudar muito, acompanhar os novos recursos e buscar conhecimento em fontes sérias. Só assim evita-se dor de cabeça ou mesmo a perda de espaço no mercado de trabalho.</p>
<h3><a name="hardware">2.6 Falha no Hardware</a></h3>
<p>   E por último, erros também acontecem independente do sistema estar perfeito ou não. Pode ser que o servidor esteja em manutenção, ou outros problemas relacionados a hardware etc. Por esse motivo que, mesmo você fazendo um ótimo tratamento de erros, o sistema não conseguirá ser executado. Falarei de exceções logo mais à frente.</p>
<h3><a name="debug">3. Como debugar um script</a></h3>
<p>   Para testar um script e ver se ele está funcionando corretamente, há várias maneiras. A primeira delas é testar num servidor local. Para desenvolver, sempre deixe essas opções configuradas no php.ini:</p>
<p> display_errors = On<br />
 display_startup_errors = On<br />
 error_reporting  =  E_ALL<br />
 log_errors = On<br />
 track_errors = On<br />
 register_globals = Off</p>
<p>   Via script você pode fazer assim:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #339933;">@</span><span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;display_errors&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">@</span><span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;log_errors&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">@</span><span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;error_reporting&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">E_ALL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>   Em versões do PHP igual ou anterior à 4.2.3 era possível setar a diretiva register_globals via script, mas agora só via PHP.INI ou .htaccess. Via .htaccess é assim:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">php_flag register_globals off</pre></td></tr></table></div>

<p>   Agora, com tudo preparado, só resta testar o sistema. Existem vários editores com recursos para debugar um script, como por exemplo o <a href="http://www.waterproof.fr/" target="_blank" onclick="urchinTracker('/outgoing/www.waterproof.fr/?referer=');">PHPEdit da WaterProof</a>, o editor da <a href="http://www.zend.com" target="_blank" onclick="urchinTracker('/outgoing/www.zend.com?referer=');">Zend</a> ou o da <a href="http://www.maguma.com/" target="_blank" onclick="urchinTracker('/outgoing/www.maguma.com/?referer=');">Maguma</a>.</p>
<h3><a name="validacao">4 &#8211; Validações para evitar erros</a></h3>
<p>   Um bom tratamento de erros precisa prever vários tipos de erros e, pra isso, existem funções específicas, como por exemplo:</p>
<p> <a href="http://www.php.net/file_exists" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/file_exists?referer=');">file_exists</a> &#8211; serve para verificar se um arquivo existe<br />
 <a href="http://www.php.net/defined" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/defined?referer=');">defined</a> &#8211; serve para verificar se uma constante foi definida.<br />
 <a href="http://www.php.net/isset" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/isset?referer=');">isset</a> &#8211; verifica se uma variável existe.<br />
 <a href="http://www.php.net/is_array" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_array?referer=');">is_array</a> &#8211; verifica se a variável é um array<br />
 <a href="http://www.php.net/is_resource" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_resource?referer=');">is_resource</a> &#8211;  verifica se a variável é um resource<br />
 <a href="http://www.php.net/is_numeric" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_numeric?referer=');">is_numeric</a>  &#8211;  verifica se a variável é um número ou uma string numérica.<br />
 <a href="http://www.php.net/is_uploaded_file" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_uploaded_file?referer=');">is_uploaded_file</a> &#8211; verifica se o arquivo foi uploaded via HTTP POST.<br />
<a href="http://www.php.net/is_writable" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_writable?referer=');">is_writable</a> &#8211; verifica se pode escrever para o arquivo (writable).<br />
 <a href="http://www.php.net/version_compare" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/version_compare?referer=');">version_compare</a> &#8211; Compara a versão do php.<br />
 <a href="http://www.php.net/extension_loaded" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/extension_loaded?referer=');">extension_loaded</a> &#8211; verifica se a extensão foi habilitada.</p>
<p>   Com essas funções você pode testar, por exemplo, se um arquivo existe, antes de incluí-lo. Caso não exista, você pára o script e dá um aviso para o usuário. Outro exemplo: antes de gravar um arquivo texto, você verifica se ele pode ser escrito, ou antes de usar uma variável teste, se ela existe com isset()<br />   Outra validação muito importante é validar se o formulário foi enviado, assim evitando erro, por exemplo:</p>
<p><strong>Exemplo 4.1 Verificando se um formulário foi enviado</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">getenv</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;REQUEST_METHOD&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">&quot;POST&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//...faça tal coisa</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>   Se for get só mudar para GET, assim você testa se o formulário foi enviado.<br />
   Outra dica importante é testar se a variável existe caso venha de algum formulário:</p>
<p><strong>Exemplo 4.2 Verificando se uma variável foi inicializada</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$campo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;campo&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;campo&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><strong>Exemplo 4.2 Incluindo um arquivo sem verificação</strong><br />
De tratamento de erros:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">require</span> <span style="color: #0000ff;">&quot;arquivo.php&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>   Mas e se o arquivo nao existir? Iria dar erro, então o mais correto é:</p>
<p><strong>Exemplo 4.3 Incluindo um arquivo com verificação</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;arquivo.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">require</span> <span style="color: #0000ff;">&quot;arquivo.php&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p><strong>Exemplo 4.4 Desabilitando magic_quotes</strong><br />
   Programar dependente de magic_quotes não é recomendando, visto que o site ou sistema poderá não funcionar corretamente caso seja hospedado em um servidor com configuração divergente da que foi adotada para os testes locais. Os erros mais comuns são na inserção de valores em um banco de dados. Além disso, a partir do PHP 6, a diretiva magic_quotes_gpc não existirá mais e, por isso, é recomendado programar desabilitando este recurso. Esta diretiva não pode ser alterada através da função ini_set, devendo ser configurada diretamente no PHP.INI ou, se também possível, através do .htaccess, da seguinte forma:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">php_flag magic_quotes_gpc Off</pre></td></tr></table></div>

<p>   Como alternativa, você pode utilizar a função abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> remove_magic_quotes<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">get_magic_quotes_gpc</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$_GET</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_map</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;remove_mq&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$_POST</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_map</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;remove_mq&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$_REQUEST</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_map</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;remove_mq&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$_COOKIE</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_map</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;remove_mq&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> remove_magic_quotes<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">return</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span> ? <span style="color: #990000;">array_map</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;remove_magic_quotes&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>   Basicamente, a função verifica se a diretiva magic_quotes está habilitada e, então, varre pelos dados dos arrays globais inicializados (enviados por um formulário, por exemplo), eliminando os escapes dos caracteres. Preferencialmente, esta função deve ser chamada num arquivo de inicialização do sistema ou site.</p>
<h3><a name="excecao">5. Tratando erros com Exceções</a></h3>
<p>   A partir da versão 5 do PHP, pode-se tratar erros usando <a href="http://www.php.net/manual/pt_BR/language.exceptions.php" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/manual/pt_BR/language.exceptions.php?referer=');">Exceções</a>. Com o uso desse recurso, podemos manipular os erros com mais precisão, facilitando, por exemplo, a criação de um log de erros contendo o nome do arquivo e a linha em que o erro ocorreu.<br />
   A classe <strong>Exception</strong> pode ser extendida a uma outra, viabilizando a personalização de mensagens de erro e a criação de uma classe para cada tipo de exceção. Por exemplo: é possível termos uma classe para manipular erros relacionados a banco de dados, outra para o manuseio de arquivos, de imagens, etc.<br />
   Uma exceção deve ser disparada (<em>thrown</em>) dentro de um bloco <strong>try{}</strong>. Em seguida, deve ser pega (<em>catched</em>) usando o bloco <strong>catch{}</strong>.</p>
<p><strong>Exemplo 5.1: Usando exceções para capturar um possível erro na conexão com um banco de dados MySQL</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">try <span style="color: #009900;">&#123;</span>
   <span style="color: #666666; font-style: italic;">//usamos o arroba para ocultar o possível erro retornado pelo PHP</span>
   <span style="color: #339933;">@</span><span style="color: #000088;">$MySQLi</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MySQLi<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;user&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;pass&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;db_name&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$MySQLi</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//se conexão falhar</span>
      <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Erro ao realizar a conexão com o banco de dados&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
catch <span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$e</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>   Se a conexão falhar, será disparada uma exceção, que será, posteriormente, pega no seu bloco catch correspondente. Nesse bloco, devemos colocar o nome da classe de exceção utilizada e criar uma variável, a qual será uma instância da exceção.</p>
<p>   Para obter mais informações sobre exceções, veja o link abaixo:<br />
   <a href="http://www.php.net/manual/pt_BR/language.exceptions.php" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/manual/pt_BR/language.exceptions.php?referer=');">http://www.php.net/manual/pt_BR/language.exceptions.php</a></p>
<p><strong>Colaboraram neste artigo:</strong><br />
<a href="http://forum.imasters.com.br/index.php?showuser=18845" target="_blank" onclick="urchinTracker('/outgoing/forum.imasters.com.br/index.php?showuser=18845&amp;referer=');">Anderson Mello</a><br />
<a href="http://forum.imasters.com.br/index.php?showuser=34746" target="_blank" onclick="urchinTracker('/outgoing/forum.imasters.com.br/index.php?showuser=34746&amp;referer=');">Beraldo</a><br />
<a href="http://forum.imasters.com.br/index.php?showuser=13485" target="_blank" onclick="urchinTracker('/outgoing/forum.imasters.com.br/index.php?showuser=13485&amp;referer=');">Fabyo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/tratamento-de-erros-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boas Práticas ao Programar</title>
		<link>http://www.rberaldo.com.br/blog/boas-praticas-ao-programar-2/</link>
		<comments>http://www.rberaldo.com.br/blog/boas-praticas-ao-programar-2/#comments</comments>
		<pubDate>Wed, 06 May 2009 00:13:00 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Boas Práticas]]></category>
		<category><![CDATA[programação correta]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/2009/05/05/boas-praticas-ao-programar-2/</guid>
		<description><![CDATA[Artigo sobre boas práticas de programação. O artigo usa a linguagem PHP, mas as técnicas podem ser aplicadas a qualquer outra linguagem.]]></description>
			<content:encoded><![CDATA[<p>Postarei aqui um artigo que eu e outros membros do Fórum iMasters escrevemos. É uma leitura essencial para qualquer programador. As práticas aplicam-se a diversas linguagens, mas neste caso, o foco principal é o PHP.</p>
<p>Boa leitura a todos!</p>
<p>Fonte: <a href="http://forum.imasters.uol.com.br/index.php?showtopic=214963" target="_blank" onclick="urchinTracker('/outgoing/forum.imasters.uol.com.br/index.php?showtopic=214963&amp;referer=');">http://forum.imasters.uol.com.br/index.php?showtopic=214963</a> </p>
<p><span id="more-12"></span></p>
<h3>Índice</h3>
<p><a href="#intro">1. Introdução</a><br />
<a href="#tags">2. Utilize sempre as tags completas</a><br />
<a href="#indent">3. Indentação</a><br />
<a href="#exist">4.  Funções para verificar a existência de variáveis e os seus tipos</a><br />
<a href="#cast">5. Tipos de dados e <em>casting</em></a><br />
<a href="#pattern">6. Adotar padrões para nomes de funções, classes, constantes e variáveis</a><br />
<a href="#e_all">7. Codificar usando exibição de erros E_ALL</a><br />
<a href="#arroba">8. Não ocultar erros utilizando @ ([arroba])</a><br />
<a href="#register_globals">9. Não codificar dependendo de register_globals</a><br />
<a href="#init">10. Criar arquivo de inicialização</a><br />
<a href="#atualizar_se">11. Mantenha-se sempre atualizado</a><br />
<a href="#apendices">Apêndices</a><br />
<a href="#apendice_a">Apêndice A. Sobre o php.ini</a><br />
<a href="#apendice_b">Apêndice B. Palavras reservadas</a><br />
<a href="#apendice_c">Apêndice C. Funções úteis para verificação de variáveis, diretórios e outros</a></p>
<h3><a name="intro">1. Introdução</a></h3>
<p>   Muitas das dicas abaixo valem para qualquer linguagem de programação, mas a abordagem principal é voltada para programação em PHP. Para quem quer ser um bom profissional não basta conhecer dezenas de linguagens diferentes e decorar as milhares de funções disponíveis para cada uma delas. Algo que muitos deixam de lado são os cuidados ao formatar o código, organizando-o e documentando-o adequadamente. Isso contribui, em muito, à alteração e à leitura do mesmo por outros profissionais, poupando tempo e permitindo fácil seqüência ao projeto.</p>
<p>   Vamos a algumas dicas recomendadas por vários profissionais da área. Todas elas devem ser consideradas também como referências para os próximos artigos que serão publicados aqui no fórum.</p>
<h3><a name="tags">2. Utilize sempre as tags completas</a></h3>
<p>   O PHP aceita quatro tipos de tags:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
 <span style="color: #000000; font-weight: bold;">&lt;script language</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;php&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;%</span> <span style="color: #000000; font-weight: bold;">%&gt;</span></pre></td></tr></table></div>

<p> A primeira opção é a padrão e preferencial, mas muitos programadores utilizam a segunda opção, por ser mais curta. Com ela, há também a possibilidade de usar esta sintaxe para exibir uma informação:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?=</span> <span style="color: #0000ff;">&quot;Hello World!&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
// equivale a
<span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Hello World!&quot;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p> Apesar disso, a utilização desse tipo de tag também não é recomendada, porque pode estar desabilitada no servidor, ou seja, quando a diretiva <strong>short_open_tag</strong> estiver em <strong>off</strong>, fazendo com que o script não seja interpretado.</p>
<p> A terceira opção não é muito comum, mas não é afetada pela diretiva <strong>short_open_tag</strong>, sendo tão segura quanto a primeira. As tags ASP <% %>, que também devem ser evitadas, só serão interpretadas se a diretiva <strong>asp_tags</strong> estiver em <strong>on</strong>, o que é pouco comum, visto que o seu valor padrão é <strong>off</strong>.</p>
<p><strong>Mais detalhes:</strong><br />
<a href="http://www.php.net/manual/pt_BR/language.basic-syntax.php" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/manual/pt_BR/language.basic-syntax.php?referer=');">http://www.php.net/manual/pt_BR/language.basic-syntax.php</a></p>
<h3><a name="indent">3. Indentação</a></h3>
<p>   Uma boa indentação facilita a organização e a leitura do código. Veja os seguintes exemplos:</p>
<p><strong>Exemplo 3.1 Código em linha única e sem indentação</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Hello World!&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><strong>Exemplo 3.2 Código sem indentação</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Hello World!&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><strong>Exemplo 3.3 Código com indentação adequada</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Hello World!&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>   Com os exemplos acima, podemos notar que a ausência de identação em um pequeno trecho de código pode não fazer diferença, mas tente imaginar 300 ou 400 linhas sem identação. Melhor ainda (ou pior), imagine fazer uma alteração em um script escrito nesse formato&#8230;<br />   Alguns podem, inclusive, pensar que reduzindo o número de linhas de código, facilita-se a navegação e a leitura do mesmo.<br />
   Uma boa identação é a que você adotar como padrão. O recomendado, e também adotado por muitos, é uma indentação de quatro espaços. Dê atenção especial às estruturas de controle, onde o &#8220;aninhamento&#8221; delas podem causar confusão de leitura.</p>
<p><strong>Exemplo 3.4 Código sem indentação</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//código</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//código</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><strong>Exemplo 3.5 Código com indentação adequada</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">//código</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">//código</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>   Nos exemplos 3.4 e 3.5 é possível perceber mais claramente o problema da falta de indentação.</p>
<h3><a name="exist">4.  Funções para verificar a existência de variáveis e os seus tipos</a></h3>
<p>   É importante verificar se uma variável, constante ou mesmo chave de array associativo foi inicializado, antes de resgatar o seu valor e utilizá-lo em algum processamento. Isso evita resultados inesperados. Veja o exemplo abaixo:</p>
<p><strong>Exemplo 4.1</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot; World!&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span><span style="color: #339933;">.</span><span style="color: #000088;">$b</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>   Considerando-se que o valor de $a tenha sido enviado por um formulário, pelo método POST, e esse valor seja &#8220;Hello&#8221;, a saída será &#8220;Hello World!&#8221;. Porém, se nenhum valor for preenchido, teremos um resultado inesperado, podendo ser gerada uma notificação de inexistência de variável. Para testar se a variável foi iniciada, utilizamos <a href="http://www.php.net/isset" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/isset?referer=');">isset()</a>.</p>
<p><strong>Exemplo 4.2</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Hi&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot; World!&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span><span style="color: #339933;">.</span><span style="color: #000088;">$b</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>   Outra forma, mais curta, é utilizar o <strong>operador condicional ternário</strong> (ou somente <strong>operador ternário</strong>).</p>
<p><strong>Exemplo 4.3 &#8211; Utilizando o operador ternário</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;Hi&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot; World!&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span><span style="color: #339933;">.</span><span style="color: #000088;">$b</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>   Se a primeira expressão retornar verdadeiro (TRUE), o segundo bloco é executado. Caso contrário, executa-se o terceiro.   Dessa forma, caso a variável não tenha sido enviada pelo formulário, atribuímos a ela o valor &#8220;Hi&#8221;, produzindo a saída &#8220;Hi World!&#8221;. Para fazer esse tipo de verificação com constantes, utilizamos a função <a href="http://www.php.net/defined" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/defined?referer=');">defined()</a>.</p>
<p><strong>Exemplo 4.4</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CAMINHO&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;www/meudiretorio/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CAMINHO&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;A constante já foi definida.&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;A constante não foi definida.&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>   Confira no Apêndice uma lista de funções úteis para verificação de tipos de variáveis, existência de diretórios, funções e outros.</p>
<p><strong>Mais detalhes:</strong><br />
<a href="http://www.php.net/manual/pt_BR/ref.variables.php" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/manual/pt_BR/ref.variables.php?referer=');">http://www.php.net/manual/pt_BR/ref.variables.php</a></p>
<h3><a name="cast">5. Tipos de dados e <em>casting</em></a></h3>
<p>   Ao desenvolvermos um sistema ou site, deparamo-nos com o uso de diversos tipos de variáveis, como <em>strings</em>, <em>arrays</em>, <em>booleans</em>, dentre outros. Como o PHP não suporta a definição de tipos de variáveis nas declarações das mesmas, em determinados momentos, uma variável que deveria conter como valor um número inteiro, pode receber uma string. Isso pode gerar erros sileciosos, comprometendo o funcionamento do código. Veja o exemplo:</p>
<p><strong>Exemplo 5.1</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">//Retorna 'integer'</span>
<span style="color: #000088;">$var</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">print</span> <span style="color: #990000;">gettype</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Retorna 'string'</span>
<span style="color: #000088;">$var</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;6&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">print</span> <span style="color: #990000;">gettype</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>   Usamos a função <a href="http://www.php.net/gettype" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/gettype?referer=');">gettype()</a> para retornar o tipo de variável declarada. No segundo trecho temos a declaração da mesma variável <strong>$var</strong>, que passa a receber o tipo de variável <em>string</em>. Este dado é convertido automaticamente ao fazer uma soma, por exemplo, voltando novamente a ser um valor do tipo inteiro. Para contornar esse tipo de situação e evitar surpresas, recomenda-se moldar o tipo de variável, também chamado de <em><strong>casting</strong></em>, assegurando assim que a variável será do tipo esperado. Para isso, pode-se utilizar a função <a href="http://www.php.net/settype" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/settype?referer=');">settype()</a>.</p>
<p><strong>Exemplo 5.2</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">//Retorna 'integer', mesmo com o valor declarado como 'string'</span>
<span style="color: #000088;">$var</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;6&quot;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">settype</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'integer'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">print</span> <span style="color: #990000;">gettype</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>   A moldagem de tipos também pode ser feita no momento da declaração da variável, antecedendo o seu valor com o tipo desejado, entre parênteses:</p>
<p><strong>Exemplo 5.3</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">//Define o tipo 'integer'</span>
<span style="color: #000088;">$var</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>integer<span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;6&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">print</span> <span style="color: #990000;">gettype</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Mais detalhes:<br />
<a href="http://www.php.net/manual/pt_BR/language.types.php" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/manual/pt_BR/language.types.php?referer=');">http://www.php.net/manual/pt_BR/language.types.php</a></p>
<h3><a name="pattern">6. Adotar padrões para nomes de funções, classes, constantes e variáveis</a></h3>
<p>   Mesmo que as maiores diferenças sejam notadas em grandes projetos, adotar padrões ao declarar funções, variáveis etc. auxilia o desenvolvimento, pois se evita a dúvida ou mesmo erros, por exemplo, ao chamar funções que não existam, simplesmente por se ter um nome confuso ou uma falta de padrão.<br />
   Você deve estar ciente da padronização que irá fazer, e respeitá-la rigorosamente em todo o site ou sistema. Um exemplo:</p>
<p><strong>Exemplo 6.1</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> primeira_funcao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #666666; font-style: italic;">//...</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> segundaFuncao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//...</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>   Programar sem um padrão, como no exemplo acima, compromete o desenvolvimento, pois será muito fácil acabar chamando por funções inexistentes (nomes diferentes do esperado). É muito importante analisar os padrões já utilizados por outros programadores ou desenvolver seu próprio padrão e seguí-lo à risca, garantindo assim um projeto fluente.<br />
   Essa mesma situação pode ser enfrentada para nomes de constantes, variáveis ou classes. Por isso, é importante seguir um padrão, tal como o exemplo abaixo:</p>
<p><strong>Exemplo 6.2</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$var</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$minhaVar</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;PHP&quot;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CONSTANTE&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Valor da constante&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SEGUNDA_CONSTANTE&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> minhaFuncao<span style="color: #009900;">&#40;</span><span style="color: #000088;">$argumento</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;&lt;b&gt;<span style="color: #006699; font-weight: bold;">$argumento</span>&lt;b&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
classe MinhaClasse <span style="color: #009900;">&#123;</span>
     <span style="color: #666666; font-style: italic;">//...</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>   Para o nome de variáveis, prefira utilizar nomes sempre em minúsculas. Para variáveis com palavras compostas, separe-as alterando as palavras seguintes com letra inicial maiúscula. Nomes de constantes preferencialmente devem ser declarados em maiúsculas, utilizando underline (&#8220;_&#8221;) como separador de palavras.<br />
   As funções e seus argumentos, assim como as classes, devem ser declaradas utilizando-se o mesmo padrão para as variáveis. Como forma de diferenciar as classes de funções, estas devem ter seus nomes com a inicial também em maiúscula.</p>
<h3><a name="e_all">7. Codificar usando exibição de erros E_ALL</a></h3>
<p>   Durante a estruturação de seu código, é muito importante manter as diretivas <strong>error_reporting</strong> em <strong>E_ALL</strong> e <strong>display_errors</strong> em <strong>on</strong>. Isso faz com que todos os possíveis erros sejam exibidos, para que você possa corrigi-los.<br />
   Não é necessário acessar o arquivo php.ini para alterar esses valores, basta usar a função <a href="http://www.php.net/ini_set" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/ini_set?referer=');">ini_set()</a>, como no exemplo abaixo:</p>
<p><strong>Exemplo 7.1</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'error_reporting'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">E_ALL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'display_errors'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// restante do código</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>   Deve-se inserir essas mudanças sempre antes do restante do código, para que elas afetem o script inteiro.   </p>
<p>Mais detalhes<br />
<a href="http://www.php.net/manual/pt_BR/ref.errorfunc.php" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/manual/pt_BR/ref.errorfunc.php?referer=');">http://www.php.net/manual/pt_BR/ref.errorfunc.php</a></p>
<h3><a name="arroba">8. Não ocultar erros utilizando @ ([arroba])</a></h3>
<p>   É desaconselhável o uso excessivo do operador de controle de erros (@, &#8220;arroba&#8221;). Esse operador somente deve ser usado nos casos em que a ocorrência de erro seja uma excessão, como na função mail(), funções de conexão com banco de dados e outras.</p>
<p><strong>Exemplo 8.1</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!@</span><span style="color: #990000;">mysql_connect</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;servidor&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;usuario&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;senha&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #990000;">die</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Erro ao conectar com o banco de dados MySQL&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span></pre></td></tr></table></div>

<p>   Considerando-se que os argumentos da função mysql_connect() acima estejam corretos, erros de conexão tornam-se uma exceção, como em caso de servidor fora do ar.<br />
   A partir do PHP 5, é possível manusear erros por meio de <a href="http://www.php.net/manual/pt_BR/language.exceptions.php" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/manual/pt_BR/language.exceptions.php?referer=');">Exceções</a>, mas esse tema não será abordado neste artigo.</p>
<p><strong>Nota importante: </strong><br />
Atualmente, o operador de controle de erro &#8220;@&#8221; sempre desativa mensagens de erro, mesmo para erros críticos, que terminam a execução de scripts. Além de outras coisas, isto significa que se você usar &#8220;@&#8221; para suprimir erros de certas funções e elas não estiverem disponíveis ou com tipos incorretos, o script vai parar exatamente aí sem nenhuma indicação da razão.</p>
<p><strong>Mais detalhes:</strong><br />
<a href="http://www.php.net/manual/pt_BR/language.operators.errorcontrol.php" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/manual/pt_BR/language.operators.errorcontrol.php?referer=');">http://www.php.net/manual/pt_BR/language.operators.errorcontrol.php</a></p>
<h3><a name="register_globals">9. Não codificar dependendo de register_globals</a></h3>
<p>   A register_globals é uma diretiva que passou a estar desabilitada (Off), por padrão, a partir do PHP 4.2.0. Essa diretiva, quando habilitada no PHP.INI, faz com que as variáveis globais sejam registradas (inicializadas) diretamente no script em execução.</p>
<p><strong>Exemplo 9.1 valor inicializado por GET</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Script acessado com valor via GET</span>
<span style="color: #666666; font-style: italic;">//meu_script.php?var=Teste</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;A variável foi inicializada pela register_globals;
} else {
    print &quot;</span>A variável <span style="color: #000088;">$var</span> não foi inicializada<span style="color: #0000ff;">&quot;;
}</span></pre></td></tr></table></div>

<p>   O exemplo acima, apesar de inofensivo, pode sugerir a vulnerabilidade que o uso incorreto da diretiva register_globals pode acarretar. Imagine uma função que verifica a autenticação do usuário e define uma variável como verdadeira:</p>
<p><strong>Exemplo 9.2</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>usuario_logado<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$usuario_autenticado</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$usuario_autenticado</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">include</span> <span style="color: #0000ff;">&quot;menu.php&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;Você não tem permissão.&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>   Neste exemplo fica claro a brecha de segurança, pois basta inicializar a variável $usuario_autenticado como verdadeira (TRUE) ao acessar o script para que o menu esteja disponível, burlando a função de verificação de autenticação do usuário. Para corrigir este problema, basta simplesmente inicializar a variável como false. Além de uma boa prática, previne que o valor seja &#8220;forçado&#8221; a ser verdadeiro.</p>
<p><strong>Exemplo 9.3</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Inicializando a variável $usuario_autenticado</span>
<span style="color: #666666; font-style: italic;">//como false, evitando que a register_globals</span>
<span style="color: #666666; font-style: italic;">//interfira no código</span>
<span style="color: #000088;">$usuario_autenticado</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>usuario_logado<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$usuario_autenticado</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$usuario_autenticado</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">include</span> <span style="color: #0000ff;">&quot;menu.php&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;Você não tem permissão.&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3><a name="init">10. Criar arquivo de inicialização</a></h3>
<p>   Um arquivo de inicialização é útil para verificar a versão do PHP em que o script está sendo executado, suas configurações padrão e definir valores que serão usados em todo o sistema. Isso torna a execução mais segura e não suscetível a erros.<br />
   Os pontos mais importantes em um arquivo de inicialização de sistemas são:</p>
<p>*Versão do PHP em que o script está sendo executado;<br />
*Verificar se determinadas extensões foram carregadas, como mysql, mysqli, gd, etc;<br />
*Definir valores para diretivas do php.ini, como <strong>error_reporting</strong> e <strong>display_errors</strong>;<br />
*Definir constantes, como informações para conexão com bancos de dados, diretório-raiz do sistema e outras.</p>
<p><strong>Mais detalhes:</strong><br />
<a href="http://forum.imasters.com.br/index.php?showtopic=202215" target="_blank" onclick="urchinTracker('/outgoing/forum.imasters.com.br/index.php?showtopic=202215&amp;referer=');">http://forum.imasters.com.br/index.php?showtopic=202215</a></p>
<h3><a name="atualizar_se">11. Mantenha-se sempre atualizado</a></h3>
<p>   A linguagem PHP está em constante atualização, sendo frequentemente disponíveis novas atualizações de versões para download. Por isso, acesse periodicamente o site oficial do PHP (<a href="http://www.php.net" target="_blank" onclick="urchinTracker('/outgoing/www.php.net?referer=');">http://www.php.net</a>) e verifique se não há uma versão mais recente do que a qual você está utilizando no momento. Se houver, baixe-a e instale-a imediatamente. Para facilitar esta verificação, segue abaixo um script desenvolvido pelo Fabyo. Além de verificar, ele exibe também os links para download.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$url</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://www.php.net/downloads.php&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;#&lt;h2&gt;Windows Binaries&lt;\/h2&gt;(.+?)&lt;/ul&gt;#si&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;#&lt;a href=(.+?)&gt;(.+?)&lt;\/a&gt;#si&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$matches2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$php</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;PHP&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$matches2</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$php</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;zip package&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$php</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$php</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$php</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">version_compare</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">phpversion</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$php</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&lt;&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">&quot;-1&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Sua versao do php esta desatualizada baixe a nova versao:&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$matches2</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$matches2</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span> 
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;img src=<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #339933;">.</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;PHP_SELF&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;?=&quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">php_logo_guid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span> alt=<span style="color: #000099; font-weight: bold;">\&quot;</span>Logo<span style="color: #000099; font-weight: bold;">\&quot;</span> /&gt;&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;Sua versão esta atualizada&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>   Também é importante prestar atenção às alterações feitas em cada versão, para que um script não gere incompatibilidade entre duas ou mais vesões do PHP. As duas mais importantes mudanças que podem afetar a execução de um código PHP são estas:</p>
<p>* A extinção das variáveis $HTTP_*_VARS (como $HTTP_GET_VARS e $HTTP_POST_VARS) e a criação das autoglobais (ou super globais) $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_REQUEST, e $_SESSION.<br />
* A mudança do valor padrão da diretiva <strong>register_globals</strong> de <strong>on</strong> para <strong>off</strong>.</p>
<p><strong>Mais detalhes:</strong><br />
<a href="http://br.php.net/manual/pt_BR/tutorial.oldcode.php" target="_blank" onclick="urchinTracker('/outgoing/br.php.net/manual/pt_BR/tutorial.oldcode.php?referer=');">http://br.php.net/manual/pt_BR/tutorial.oldcode.php</a><br />
<a href="http://br.php.net/manual/pt_BR/language.variables.predefined.php" target="_blank" onclick="urchinTracker('/outgoing/br.php.net/manual/pt_BR/language.variables.predefined.php?referer=');">http://br.php.net/manual/pt_BR/language.variables.predefined.php</a><br />
<a href="http://br.php.net/manual/pt_BR/security.globals.php" target="_blank" onclick="urchinTracker('/outgoing/br.php.net/manual/pt_BR/security.globals.php?referer=');">http://br.php.net/manual/pt_BR/security.globals.php</a></p>
<h3><a name="apendices">Apêndices</a></h3>
<h3><a name="apendice_a">Apêndice A. Sobre o php.ini</a></h3>
<p><a href="http://br.php.net/manual/pt_BR/ini.php" target="_blank" onclick="urchinTracker('/outgoing/br.php.net/manual/pt_BR/ini.php?referer=');">http://br.php.net/manual/pt_BR/ini.php</a></p>
<p>Entenda o PHP.INI (artigo publicado pelo <a href="http://forum.imasters.com.br/index.php?showuser=13485" target="_blank" onclick="urchinTracker('/outgoing/forum.imasters.com.br/index.php?showuser=13485&amp;referer=');">Fabyo</a>): <a href="http://forum.imasters.com.br/index.php?showtopic=144987" target="_blank" onclick="urchinTracker('/outgoing/forum.imasters.com.br/index.php?showtopic=144987&amp;referer=');">http://forum.imasters.com.br/index.php?showtopic=144987</a></p>
<h3><a name="apendice_b">Apêndice B. Palavras reservadas</a></h3>
<p><a href="http://br.php.net/manual/pt_BR/reserved.php" target="_blank" onclick="urchinTracker('/outgoing/br.php.net/manual/pt_BR/reserved.php?referer=');">http://br.php.net/manual/pt_BR/reserved.php</a></p>
<h3><a name="apendice_c">Apêndice C. Funções úteis para verificação de variáveis, diretórios e outros</a></h3>
<p>*<a href="http://www.php.net/is_array" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_array?referer=');">is_array()</a><br />
*<a href="http://www.php.net/is_bool" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_bool?referer=');">is_bool()</a><br />
*<a href="http://www.php.net/is_float" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_float?referer=');">is_float()</a><br />
*<a href="http://www.php.net/is_int" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_int?referer=');">is_int()</a><br />
*<a href="http://www.php.net/is_numeric" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_numeric?referer=');">is_numeric()</a><br />
*<a href="http://www.php.net/is_null" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_null?referer=');">is_null()</a><br />
*<a href="http://www.php.net/is_object" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_object?referer=');">is_object()</a><br />
*<a href="http://www.php.net/is_resource" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_resource?referer=');">is_resource()</a><br />
*<a href="http://www.php.net/is_string" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_string?referer=');">is_string()</a><br />
*<a href="http://www.php.net/is_dir" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_dir?referer=');">is_dir()</a><br />
*<a href="http://www.php.net/is_file" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/is_file?referer=');">is_file()</a><br />
*<a href="http://www.php.net/file_exists" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/file_exists?referer=');">file_exists()</a><br />
*<a href="http://www.php.net/function_exists" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/function_exists?referer=');">function_exists()</a><br />
*<a href="http://www.php.net/array_key_exists" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/array_key_exists?referer=');">array_key_exists()</a></p>
<p><strong>Colaboraram neste artigo:</strong></p>
<p><a href="http://forum.imasters.com.br/index.php?showuser=18845" target="_blank" onclick="urchinTracker('/outgoing/forum.imasters.com.br/index.php?showuser=18845&amp;referer=');">Anderson Mello</a><br />
<a href="http://forum.imasters.com.br/index.php?showuser=34746" target="_blank" onclick="urchinTracker('/outgoing/forum.imasters.com.br/index.php?showuser=34746&amp;referer=');">Beraldo</a><br />
<a href="http://forum.imasters.com.br/index.php?showuser=13485" target="_blank" onclick="urchinTracker('/outgoing/forum.imasters.com.br/index.php?showuser=13485&amp;referer=');">Fabyo</a><br />
Thiago Ferreira (tmferreira)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/boas-praticas-ao-programar-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

