<?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>hlegius &#187; PHP</title>
	<atom:link href="http://www.hlegius.pro.br/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.hlegius.pro.br</link>
	<description>programação, desenvolvimento, tecnologia e muito o que contar.</description>
	<lastBuildDate>Tue, 22 Jun 2010 15:19:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Um ano depois&#8230;</title>
		<link>http://www.hlegius.pro.br/um-ano-depois/</link>
		<comments>http://www.hlegius.pro.br/um-ano-depois/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 20:31:15 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Dia-a-dia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[hlegius]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=544</guid>
		<description><![CDATA[Há pouco mais de um ano, comecei a desenvolver pela Vex, minha primeira experiência non-freela, criando aplicações internas web-based em PHP, claro.  
A &#8220;ideia&#8221; de trabalhar fora veio repentinamente, basicamente com um pseudoconvite de meu amigo de longa data @Otata, que já estava trabalhando por lá e disse-me não por uma, nem duas, mas [...]]]></description>
			<content:encoded><![CDATA[<p>Há pouco mais de um ano, comecei a desenvolver pela <a href="http://www.vexcorp.com">Vex</a>, minha primeira experiência non-freela, criando aplicações internas web-based em PHP, claro. <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/hlegius/3575945402/in/photostream/"><img title="Vex - Maio 2009" src="http://farm3.static.flickr.com/2455/3575945402_708ae7b821.jpg" alt="" width="500" height="375" /></a><p class="wp-caption-text">Vex - Setores TI e Operações - Maio 2009</p></div>
<p style="text-align: left;">A &#8220;ideia&#8221; de trabalhar fora veio repentinamente, basicamente com um pseudoconvite de meu amigo de longa data <a href="http://twitter.com/otata" target="_blank">@Otata</a>, que já estava trabalhando por lá e disse-me não por uma, nem duas, mas algumas vezes, de que a Vex estava contratando mais developers para fechar o time e que era para eu enviar meu &#8220;currículo&#8221;.</p>
<p style="text-align: left;">Após enviar meu currículo para o pessoal, houve os tramites default de conversa por telefone, entrevista pessoal, a renomada provinha tira-teima e no final do dia após enviar meu currículo estava ingressando no time.</p>
<p style="text-align: left;">Algo que achei peculiar foi a rápida contratação &#8211; comigo pelo menos. Tudo bem que houve ele, o QI, mas fiquei surpreso com a confiança que recebi dos coordenadores, afinal eu era até aquele momento um freela de cabelo comprido e que morava há alguns quilômetros de distância da empresa.</p>
<p style="text-align: left;">
<p style="text-align: left;"><strong>Ambiente</strong></p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/hlegius/3535317787/"><img title="Vex - Galere Web - Maio 2009" src="http://farm4.static.flickr.com/3352/3535317787_a58de59980.jpg" alt="" width="500" height="375" /></a><p class="wp-caption-text">Vex - Galere Web - Maio 2009</p></div>
<p style="text-align: left;">Obviamente, totalmente diferente do até então <em>escritório-casa</em> que eu trabalhava enquanto freelancer. A adaptação não foi um problema, pois na Vex eu também utilizo notebook para desenvolver plugado à um monitor externo quase nos mesmos moldes que tenho em meu home office.</p>
<p style="text-align: left;">Por não recebermos visitas de clientes no prédio, podemos ir com roupas menos formais. Isso não quer dizer que eu possa ir de bermudas ou chinelos igual já tentaram fazer por lá <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p style="text-align: left;">No andar do desenvolvimento, há também o pessoal de sistemas embarcados e redes. O relacionamento com todos sempre foi bem tranquilo, mesmo quando saía uns flamewars do tipo: Python vs PHP; Zimbra não é <acronym title="Sim, sou Yahoo! fanboy">Yahoo!</acronym>; e todo mundo contra o <a href="http://twitter.com/otata" target="_blank">@Otata</a>.</p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/hlegius/3655840182/"><img src="http://farm4.static.flickr.com/3396/3655840182_986d765840.jpg" alt="" width="500" height="375" /></a><p class="wp-caption-text">Vex - Junho 2009</p></div>
<p style="text-align: left;">Durante esse período uma coisa ficou clara: a empresa movimenta-se bastante. Houve pessoas entrando; pessoas mudando de área, pessoas deixando a Vex e até, pessoas que saíram e estão retornando novamente. As saídas, do ponto de vista pessoal, são ruins, pois todos no andar tem um contato diário, uma amizade e que depois de sua saída o contato praticamente se extingue.</p>
<p style="text-align: left;">
<p><strong>Os PHP&#8217;ers</strong></p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/hlegius/4328427633/"><img src="http://farm5.static.flickr.com/4057/4328427633_8172122753.jpg" alt="" width="500" height="375" /></a><p class="wp-caption-text">Vex - Galere Webdev (@bufoni)</p></div>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/hlegius/4497018828/"><img src="http://farm5.static.flickr.com/4036/4497018828_06f4333761.jpg" alt="" width="500" height="375" /></a><p class="wp-caption-text">Vex - Galere Web (@Sugamele)</p></div>
<p>Se os developers geralmente não batem muito bem das ideias, essa turma bate menos ainda ! (haha, vão me matar com esse comentário). O pessoal na Vex é bem tranquilo e são bem espontâneos. O que surpreende nessa turma são as diferenças: cada um possui seu temperamento, opiniões &#8211; muitas das vezes bem diferentes &#8211; e suas especialidades. Mesmo com tantas diferenças, nós, que trabalhamos geralmente aos pares ou trios e raramente individualmente, temos um envolvimento excelente nos projetos.</p>
<p>Ao que estive olhando nos logs do controle de versão, passaram aproximadamente 12 pessoas (achismo mode on) pelo time Web durante um período de 4 anos.</p>
<p>Inclusive, o <a href="http://twitter.com/esampaio" target="_blank">@esampaio</a>, aqui conhecido como meu chefe, publicou um vídeo com o histórico do SVN de um de nossos projetos internos.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="275" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=9383180&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="500" height="275" src="http://vimeo.com/moogaloop.swf?clip_id=9383180&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object><a href="http://vimeo.com/9383180"></a></p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/hlegius/3877838088/"><img title="Vex - Webdev" src="http://farm3.static.flickr.com/2529/3877838088_e2c2dd9b4e.jpg" alt="" width="500" height="375" /></a><p class="wp-caption-text">Vex - Webdev. @Sugamele e eu - Agosto, 2009</p></div>
<p>Pela quantidade de pessoas que ao longo desse período trabalharam em cima desse projeto em específico é um pouco previsível o que pode-se encontrar nele. Há coisas realmente muito boas &#8211; tanto código quanto solução para um problema &#8211; a própria engine de i18n é uma delas, porém, há também coisas desenvolvidas no estilo <a title="WOP" href="http://desciclo.pedia.ws/wiki/POG#Modelagem_Orientada_a_Gambiarras" target="_blank">WOP</a>. (Workaround-oriented programming).</p>
<p>O que me chamou a atenção nessa área é a real vontade do pessoal em evoluir e melhorar os pontos que hoje não estão bons. <strong><em>Quality of Code</em></strong> está literalmente em alta e o princípio <strong><em>&#8220;Don&#8217;t live with broken windows&#8221;</em></strong> (para mais leia o livro: <a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1271881011&amp;sr=8-1" target="_blank">The Pragmatic Programmer</a>) tem feito sucesso. <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Quando é necessário atualizar alguma coisa ou sempre que possível &#8211; mesmo não estando na lista de prioridades, os códigos obscuros do passado são atualizados, melhorando não só a leitura e documentação (leia-se PHPdoc), mas também o relacionamento daquele módulo com todo o resto. Anima muito ver uma equipe &#8211; o que inclui os coordenadores da área &#8211; interessados em adotar metodologias e princípios que visam melhorar o código e entendem que isto no final, traz benefícios não só para os developers, mas também para os usuários da ferramenta.</p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/hlegius/3576906072/"><img src="http://farm4.static.flickr.com/3331/3576906072_c0577e878a.jpg" alt="" width="500" height="375" /></a><p class="wp-caption-text">Vex - (@lfamorim e @sergioprado ao fundo) @Otata e @acidcode - Maio, 2009</p></div>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/hlegius/4328427647/"><img title="Vex" src="http://farm5.static.flickr.com/4019/4328427647_dea0894017.jpg" alt="" width="500" height="375" /></a><p class="wp-caption-text">Vex - @bufoni @esampaio e @sergioprado - Fevereiro, 2010</p></div>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/hlegius/3966572478/"><img src="http://farm3.static.flickr.com/2484/3966572478_8d8b0de070.jpg" alt="" width="500" height="375" /></a><p class="wp-caption-text">Vex Webdev - @bufoni e @Sugamele - Setembro, 2009</p></div>
<p><strong>Trabalho em grupo</strong></p>
<p>Por ter o costume de trabalhar sozinho na época dos freelas &#8211; claro, havia o designer <a href="http://twitter.com/jorgeveteran" target="_blank">@jorgeveteran</a> &#8211; eu, achei no começo que seria algo complicado. E sim, é complicado ! Não guardar as ideias ou soluções contigo é uma das coisas mais complicadas. Deixar o pessoal que está contigo no projeto atualizado das ações, estabelecer uma linha e manter as coisas alinhadas durante todo o projeto é algo que eu precisei reeducar quando comecei na Vex. Mas até hoje não houve nenhum tipo de problema com o pessoal que já trabalhei em conjunto. <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Um dos maiores problemas foi encontrar paciência para explicar as coisas técnicas para o pessoal. Não sou o melhor exemplo de paciência quando a tarefa é explicar coisas &#8211; que eu julgo claras e simples de entender &#8211; aos outros. Consigo explicar tudo numa boa, porém, dúvidas e erros que eu julgo primários me deixa meio: &#8220;Não acredito que você fez/perguntou isso !?&#8221;.</p>
<p>Outra particularidade é que dependendo da pergunta &#8211; na realidade, quase todas &#8211; eu não forneço a resposta pronta. Forneço links, materiais e até títulos de livros para que a pessoa leia, estude e tire suas próprias conclusões a respeito. Antes eu debater com ela aquele assunto à eu &#8220;formar robozinhos&#8221; que repetem tudo que eu julgo ser verdade até aquele momento. Se eles não entendiam o motivo pelo qual faço isso, agora eles ficaram sabendo ! <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/hlegius/4343683541/"><img title="Vex Webdev" src="http://farm5.static.flickr.com/4066/4343683541_e496d9cdc8.jpg" alt="" width="500" height="375" /></a><p class="wp-caption-text">Vex Webdev - Playground - Fevereiro, 2010</p></div>
<p>Esse período que é um pouco mais de um ano realmente está valendo muito. Ao que percebo de comentários &#8211; críticas, na realidade &#8211; dos developers nas empresas em que trabalham, é possível ter uma clara noção de que a Vex é uma exceção. Uma equipe jovem, de jovens líderes e com ideias muito boas. O setor de tecnologia está de parabéns !</p>
<p>Retratos que coleciono desde quando iniciei na Vex podem serem <a title="Vex Pics." href="http://www.flickr.com/search/?w=59288595%40N00&amp;q=vex+OR+vexcorp&amp;m=tags" target="_blank">vistos aqui, ó !</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/um-ano-depois/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP e seus pseudo-padrões para nomeclatura de classe.</title>
		<link>http://www.hlegius.pro.br/php-e-seus-pseudo-padroes-para-nomeclatura-de-classe/</link>
		<comments>http://www.hlegius.pro.br/php-e-seus-pseudo-padroes-para-nomeclatura-de-classe/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 01:56:46 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[padroes]]></category>
		<category><![CDATA[standards]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=519</guid>
		<description><![CDATA[Se você reparar bem o PHP é no quesito padronização de código uma linguagem bem brasileira. Há os padrões: Pecl, Pecl2, Zend Framework e Java (vulgo Zend Framework Coding Standard for PHP &#62;= 5.3).
Reparando bem, cada modelo tem suas particularidades, porém com mesma base. O Pecl2 e Zend Framework PHP &#62;= 5.3, aqui chamado de [...]]]></description>
			<content:encoded><![CDATA[<p>Se você reparar bem o PHP é no quesito padronização de código uma linguagem bem brasileira. Há os padrões: <a title="Pecl Coding Standard" href="http://pear.php.net/manual/pt_BR/standards.php" target="_blank">Pecl</a>, <a title="Pecl2 Coding Standard for PHP 5.3" href="http://pear.php.net/manual/pt_BR/pear2cs.rules.php" target="_blank">Pecl2</a>, <a title="Zend Framework Coding Stantard" href="http://framework.zend.com/manual/en/coding-standard.html" target="_blank">Zend Framework</a> e <a title="Zend Framework Coding Standard for PHP 5.3 or higher" href="http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html" target="_blank">Java</a> (vulgo Zend Framework Coding Standard for PHP &gt;= 5.3).</p>
<p>Reparando bem, cada modelo tem suas particularidades, porém com mesma base. O Pecl2 e Zend Framework PHP &gt;= 5.3, aqui chamado de Java/Sun/Oracle Coding Standard, tem o mesmo objetivo: atualizar o não-padrão para trabalharem com suporte a Namespaces. O que explico mais adiante.</p>
<p><strong>Antes do namaspace</strong>, ou seja, antes do PHP 5.3 a Zend recomendava um padrão que eu sempre achei ridículo, mas pensando bem, não tinha muito como fugir disso:</p>
<pre>Arquivo: /application/module/Object.php
Nome da Classe: Module_Object</pre>
<pre>Arquivo: /application/module/client/view/Json.php
Nome da Classe: Module_Client_View_Json</pre>
<p>Funcional ? Sim, sem dúvidas. Elegante ? Bem&#8230;</p>
<p>Bonito fica quando encontramos coisas como:</p>
<pre>Arquivo: /application/module/AObject.php
Classe: Module_AObject &lt;&lt;abstrata&gt;&gt;</pre>
<p>A adoção do prefixo &#8220;A&#8221; para abstrações e do prefixo &#8220;I&#8221; para interfaces. Além de nada elegante, só atrapalha o uso de Domain-Driven Design onde, resumidamente falando, tem como foco: transparecer no código o que você ouve de seu cliente/stakeholder.</p>
<p>Salvo engano meu, vi isso em um destes padrões sugeridos para o PHP. Mas infelizmente não encontrei o link :/</p>
<p><strong>E aí veio o PHP 5.3</strong></p>
<p>Com a chegada oficial do PHP 5.3, os padrões ao invés de unificarem-se e sugerir algo em comum, resolveram o que ? Criar <strong>mais padrões</strong> (o que chega a ser irônico) para brindar a chegada do tão sonhado Namespace (ou pacotes, para os Javeiros).</p>
<p>A Zend sugere o seguinte agora:</p>
<pre>Arquivo: /application/module/client/view/Json.php
Namespace: \module\client\view
Classe: Json</pre>
<p>Sim, óbvio ! Temos assim o padrão Zend Framework v2 ou simplesmente, Java Coding Standards. E eu não estou brincando não. No próprio artigo proposto por <a href="http://framework.zend.com/manual/en/coding-standard.naming-conventions.html#coding-standard.naming-conventions.classes">Matthew Ratzloff</a>, ele cita como referência o <a href="http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html#367">link para o site do Java</a>. O foco de Matthew é acabar com um problema grave criado pela Zend Framework: abreviação de nomes devido a quantidade de caracteres.</p>
<p>O pessoal do Pecl, sugeriu algo bem parecido. Manteve as particularidades e adicionou o suporte à namespaces ao seu Coding Standard.</p>
<p><strong>Porém, há os frameworks</strong></p>
<p>Obviamente em meio a sopa de pseudo-padrões, cada framework tem o seu próprio como era de se esperar. symfony, Cake PHP, Zend Framework, Kohana, etc. Cada um com o seu próprio mesclando vários e criando um terceiro.</p>
<p>Em minha sincera opinião, acho o Coding Standard do symfony de longe o mais bizarro: tab com dois espaços e nome de classe iniciado por minúsculo e sufixado com .class.php de longe lidera a aberração.</p>
<p>Para piorar o autoload dele autoriza coisas como:</p>
<pre>Arquivo: /apps/module/lib/myObject.class.php
Classe: myObjectClass</pre>
<p>Isso não funcionará com namespaces. Fato.</p>
<p><strong>Teremos um padrão ?</strong></p>
<p>Gostaria eu que sim. Seria fundamental estabelecer, agora com o reaparecimento de namespaces no PHP &#8211; sim, existiu num passado sombrio &#8211; um padrão default e que fosse largamente adotado. Complicado é convencer muito ego por aí a fora a abandonar seus pseudo-standards &#8211; que de padrão não tem nada &#8211; e utilizar um único facilitando a colaboração entre projetos e utilizando o tempo no que realmente importa: criar bons e bem documentados softwares.<strong> </strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/php-e-seus-pseudo-padroes-para-nomeclatura-de-classe/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Twig &#8211; Uma outra engine de templates em PHP</title>
		<link>http://www.hlegius.pro.br/twig-uma-outra-engine-de-templates-em-php/</link>
		<comments>http://www.hlegius.pro.br/twig-uma-outra-engine-de-templates-em-php/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 10:14:47 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software livre]]></category>
		<category><![CDATA[hlegius]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[Twig]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=467</guid>
		<description><![CDATA[Fui apresentado ao Twig não há muito tempo, mas logo me interessei pela proposta do projeto: simplicidade e flexibilidade ao trabalhar com templates em PHP.
Resumidamente é um projeto criado pelo Fabien Potencier - para quem não o conhece é o criador do symfony framework &#8211; e salvo engano há rumores de que ele pretende integrar [...]]]></description>
			<content:encoded><![CDATA[<p>Fui apresentado ao <a href="http://www.twig-project.org">Twig</a> não há muito tempo, mas logo me interessei pela proposta do projeto: <em>simplicidade e flexibilidade</em> ao trabalhar com templates em PHP.</p>
<p>Resumidamente é um projeto criado pelo <strong>Fabien Potencier </strong>- para quem não o conhece é o criador do <a href="http://www.symfony-project.org">symfony framework</a> &#8211; e salvo engano há rumores de que ele pretende integrar o Twig à versão 2.x do symfony removendo o PHP super verboso que rola nos templates do symfony desde seu lançamento. <em>* carece fontes concretas</em></p>
<p>Recursos bacanas e uma sintaxe à lá Django nos templates me chamou muita atenção para não só mais olhar, mas sim, testar para ver melhor a ferramenta.</p>
<p>Não demorou para eu testar como ele se portaria diante de objetos no template e para minha tristeza, para ele ler um atributo, depende nada mais, nada menos do que <strong>__get()</strong> e <strong>__isset()</strong>. É possível também, assim como na JSTL ler um atributo iniciado por get. No template você deveria chamá-lo sem esse get. i.e: getFoo() no template seria apenas foo.</p>
<p>Imediatamente, o que vem a mente de quem trabalha com OO ? Quebra brutal de encapsulamento. Sim, <strong>__get() </strong>por mais fácil que possa parecer, quebra totalmente a segurança de uma variável membro, uma vez que os atributos da mesma tornam-se públicos.</p>
<p>Tentei entrar em contato com o Fabien para ver o motivo que o levou a implementar assim. Ele, bem receptivo <em>- ironia mode on -</em> disse-me: se tiver um patch mande-o, do contrário, peço que seja paciente.</p>
<p>Fiz o patch, revi algumas coisas e mantive compatibilidade com o <strong>__get() __isset()</strong> que o Twig originalmente aceita e criei um Fork do <a href="http://github.com/hlegius/Twig">projeto no GitHub</a>.</p>
<p><strong>Features default</strong></p>
<ul>
<li>Suporte a plugins</li>
<li>Variáveis</li>
<li>Leitura de arrays por índices int ou string</li>
<li>Arrays multidimensionais</li>
<li>Objetos (via __get() __isset() apenas)</li>
<li>Objetos alinhados (Nested Objects) com __get() __isset() também</li>
<li>Blocos de controle, loops, etc.</li>
</ul>
<p><strong>Mudanças</strong></p>
<p>Métodos públicos começados por:</p>
<ul>
<li> get</li>
<li>is</li>
<li>has</li>
<li>match</li>
<li>contain</li>
</ul>
<p>Podem ser chamados no template sem qualquer problema sem a necessidade dos métodos mágicos.<br />
Abaixo exemplos funcionais:</p>
<p><code></p>
<pre>//...
/**
 * SomeVar
 * @var string
 */
 private $baz;
 /**
 * Bar Object
 * @var Bar
 */
 private $bar;
 /**
 * Magic String with __get
 * @var string
 */
 public $magic;

 public function __construct() {
    $this-&gt;baz = "Value of Foobar::\$baz";
    $this-&gt;bar = new Bar();
    $this-&gt;magic = 'Magic methods still working !';
 }

 /**
 * @return string
 */
 public function getBaz() {
     return $this-&gt;baz;
 }

 /**
 * @return boolean
 */
 public function hasBaz() {
     return (!empty($this-&gt;baz)) ? true : false;
 }

 private function hasIamNull() {
     return false;
 }

 public function fakehasFoo() {
     return 'I will not be displayed !';
 }

 public function matchesWith($otherString) {
     return ('foo' === $otherString);
 }

 public function getBar() {
     return $this-&gt;bar;
 } // ....</pre>
<p></code></p>
<p>No template teriamos:</p>
<p><code></p>
<pre>&lt;body&gt;
 &lt;h1&gt;Meu título&lt;/h1&gt;
 &lt;p&gt;Bar foo&lt;/p&gt;

 {% if foo.hasBaz %}
 &lt;p&gt;{{ foo.getBaz }}&lt;/p&gt;
 {% endif %}

 {% if foo.hasIamNull %}
 &lt;p&gt;{{ foo.getBaz }}&lt;/p&gt;
 {% endif %}

 &lt;p&gt;{{ foo.getAbstractBaz }}&lt;/p&gt;

 &lt;p&gt;{{ foo.getIamPublic }}&lt;/p&gt;

 &lt;p&gt;{{ foo.fakehasFoo }}&lt;/p&gt;

 &lt;p&gt;{{ foo.getBar.getHlegius }}&lt;/p&gt;

 &lt;p&gt;{{ foo.getBar.getBarFoo.getTwig }}&lt;/p&gt;
 &lt;p&gt;{{ foo.getBar.getBarFoo.tryToCallMe }}&lt;/p&gt; &lt;!-- private function, fails. --&gt;

 &lt;p&gt;{{ foo.methodThatIsnotExists }}&lt;/p&gt; &lt;!-- without error --&gt;

 {% if foo.matchesWith('foo') %}
 &lt;p&gt;Yeah, it's matches !&lt;/p&gt; &lt;!-- will matches --&gt;
 {% endif %}

 {% if foo.matchesWith('baz') %}
 &lt;p&gt;Yeah, it's matches again :S !&lt;/p&gt; &lt;!-- will NOT matches --&gt;
 {% endif %}</pre>
<p></code></p>
<p>Métodos não permitidos, índices não existentes e outros tipos de erros são omitidos por default.</p>
<p>Ainda penso em melhorar e implementar mais coisas ao projeto. Minha ideia inicial é ir sempre atualizando do projeto oficial para não distanciar-se muito. O patch eu também encaminhei ao próprio Fabien, mas ainda ele sequer respondeu ao meu e-mail.</p>
<p>Quem já utiliza o Twig e quiser testar <a href="http://github.com/hlegius/Twig">essa nova versão mais &#8220;Object-oriented friendly&#8221;</a> farei questão de dar total suporte e apoio para mantê-la up to date <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Há ainda, exemplos de uso e do que você pode fazer com o Twig que eu modifiquei. Detalhes você encontra no <a href="http://github.com/hlegius/Twig/tree/master/examples/">diretório examples</a> do projeto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/twig-uma-outra-engine-de-templates-em-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eu uso estático porque é mais rápido.</title>
		<link>http://www.hlegius.pro.br/eu-uso-estatico-porque-e-mais-rapido/</link>
		<comments>http://www.hlegius.pro.br/eu-uso-estatico-porque-e-mais-rapido/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 14:04:04 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[OOP e Patterns]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[teoria]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=488</guid>
		<description><![CDATA[Ouvi e já pude ler isto não uma, nem duas, mas sim diversas vezes. Argumentação padrão de quem defende uma &#8220;Orientação à Objetos mais estática&#8221; &#8211; se é que podemos chamar isso de OO.
Vejamos um exemplo nada científico que fiz:
Criei os seguintes exemplos:

&#60;?php
class Estatico {

    public static function fazAlgumaCoisa() {
   [...]]]></description>
			<content:encoded><![CDATA[<p>Ouvi e já pude ler isto não uma, nem duas, mas sim diversas vezes. Argumentação padrão de quem defende uma &#8220;Orientação à Objetos mais estática&#8221; &#8211; se é que podemos chamar isso de OO.</p>
<p>Vejamos um exemplo nada científico que fiz:</p>
<p>Criei os seguintes exemplos:</p>
<p><code></p>
<pre>&lt;?php
class Estatico {

    public static function fazAlgumaCoisa() {
        $i = 0;
        while ($i &lt; 10000) {
           echo Estatico::outraCoisa();
           $i++;
        }
    }

    public static function outraCoisa() {
        return "Conteúdo";
    }
}

Estatico::fazAlgumaCoisa();</pre>
<p></code></p>
<p><code></p>
<pre>&lt;?php
class Instancia {

    public function fazAlgumaCoisa() {
        $i = 0;
        while ($i &lt; 10000) {
            echo $this-&gt;outraCoisa();
            $i++;
        }
    }

    public function outraCoisa() {
        return "Conteúdo";
    }
}
$objInstancia = new Instancia();
$objInstancia-&gt;fazAlgumaCoisa();</pre>
<p></code></p>
<p>Os resultados após rodar quatro vezes cada foram:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/02/estatico.png"><img class="aligncenter size-medium wp-image-491" title="Chamadas estáticas em PHP" src="http://www.hlegius.pro.br/wp-content/uploads/2010/02/estatico-300x68.png" alt="" width="300" height="68" /></a></p>
<p style="text-align: center;"><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/02/instancia.png"><img class="aligncenter" title="Chamada em instância em PHP" src="http://www.hlegius.pro.br/wp-content/uploads/2010/02/instancia-300x66.png" alt="" width="300" height="66" /></a></p>
<p>Ou seja: <strong>91.09 ms para o estático</strong> contra <strong>90.07 para a versão non-static</strong>. Obviamente foi apenas um teste sem qualquer relevância, pois rodei em minha máquina pessoal com várias outras aplicações rodando em background. É perceptível porém, que a diferença não é absurda que compense o uso de estático por este motivo.</p>
<p>Deixando a questão de &#8220;performance&#8221; de lado, partimos para questões arquitetônicas:</p>
<ul>
<li>Identidade</li>
<li>SoC &#8211; Separation of Concerns (Principio de Separação das Responsabilidades)</li>
<li>Encapsulamento</li>
<li>Estado</li>
<li>DRY &#8211; Don&#8217;t Repeat Yourself</li>
<li>Associações &#8211; sejam elas composições ou agregações</li>
</ul>
<p>Ao perder Identidade e Estado as possibilidades daquele método &#8211; ou da classe inteira, caso use estático em tudo &#8211; tem o leque de utilidade reduzido para:</p>
<ul>
<li>Service</li>
<li>Facade</li>
<li>Factory</li>
<li>Helpers &#8211; no âmbito de serem apenas funções que realizam determinada tarefa na aplicação sem qualquer valor ao Domínio</li>
</ul>
<p>Com isso, perdemos também o Princípio de Separação das Responsabilidades, ou seja, a classe perde o controle sobre a integridade dos dados que ela deveria controlar e proteger contra acesso ou alteração indevidos.</p>
<p>Listei o DRY também por um motivo simples: com métodos estáticos, perdemos a grande chance de usar as variáveis de instância da classe à favor da mesma. Exemplo:</p>
<p><code></p>
<pre>class UsuarioEstatico {

    public static function login($usuario, $senha) {
        // valida o usuário e zaz
        $autenticador = new Autenticador();
        $autenticador-&gt;autentica($usuario, $senha);
    }

    public static function logout($usuario) {
        // verifica se a sessao está aberta
        $autenticador = new Autenticador();
        $autenticador-&gt;fechaSessaoPara($usuario);
    }
}</pre>
<p></code></p>
<p><code></p>
<pre>class Usuario implements Autenticavel {
    private $autenticador;

    public function __construct($usuario, $senha) {
        // manipula os dados de entrada
        $this-&gt;autenticador = new Autenticador($this);
    }

    public function login() {
        return $this-&gt;autenticador-&gt;autentica();
    }

    public function logout() {
        return $this-&gt;autenticador-&gt;fechaSessao();
    }
}</pre>
<p></code></p>
<p>Repare no modelo estático: foi necessário instanciar o antenticador por duas vezes em pontos diferentes. Opa, repetiu ! Mesmo que o autenticador fosse estático, teriamos duplicação, pois teriamos que certificar que o usuário existe e tudo mais. Isso porque não comentei como ficaria o lado cliente dessa implementação estática. O cliente &#8211; seja Controller, WebService ou qualquer classe em outra camada no domínio &#8211; teria que conhecer muita coisa sobre implementação dessa classe para poder manipulá-la.</p>
<p>Como bônus, repare que perdemos neste caso também o Polimorfismo, uma vez que eu poderia ter esse Autenticador() como base de autenticação para qualquer tipo (Usuário, Funcionário, Gerência, Administradores&#8230;)</p>
<p>O uso de métodos ou funções &#8211; sim, há diferença &#8211; estáticas pode ser bem-vindo nos itens já enumerados. Alguns developers porém, ainda que nestes casos são contra o uso por achar a ideia estática demasiadamente anti-oo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/eu-uso-estatico-porque-e-mais-rapido/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Configurando o Zend Debugger</title>
		<link>http://www.hlegius.pro.br/configurando-o-zend-debugger/</link>
		<comments>http://www.hlegius.pro.br/configurando-o-zend-debugger/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 10:00:31 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Softwares]]></category>
		<category><![CDATA[zend]]></category>
		<category><![CDATA[zend debugger zendstudio]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/configurando-o-zend-debugger/</guid>
		<description><![CDATA[Conforme prometido no Review do Zend Studio 7 , estarei tentando facilitar a configuração do Zend Debugger e também do Zend Studio na máquina.
É um processo teoricamente simples e sem mistérios, porém, o que muito vejo são pessoas com dificuldades em utilizá-lo da maneira correta. Acho que falta as vulgas tips para reduzir tais incidentes.
Vou [...]]]></description>
			<content:encoded><![CDATA[<p>Conforme prometido no <a href="http://www.hlegius.pro.br/zend-studio-7-review/" target="_blank">Review do Zend Studio 7</a> , estarei tentando facilitar a configuração do Zend Debugger e também do Zend Studio na máquina.</p>
<p>É um processo teoricamente simples e sem mistérios, porém, o que muito vejo são pessoas com dificuldades em utilizá-lo da maneira correta. Acho que falta as vulgas <em>tips</em> para reduzir tais incidentes.</p>
<p>Vou dividir a configuração básica em duas partes. São elas:</p>
<ol>
<li>Configurando o Zend Debugger no Windows</li>
<li>Configurando o Zend Debugger no Linux</li>
</ol>
<p>Após a configuração particular em cada ambiente, teremos:</p>
<ul>
<li>Configurações no Zend Studio (comum para ambos ambientes)</li>
<li>Configurações na Zend Toolbar</li>
<li>Exemplos de uso</li>
<li>Troubleshoot</li>
</ul>
<p>Note que após baixar o Zend Studio, você não precisará de mais nada pois o pacote de mais de 300MB trás consigo além do Zend Studio os itens:</p>
<ul>
<li>Manual do PHP</li>
<li>Manual do Zend Studio</li>
<li>Zend Debugger (vamos precisar)</li>
<li>Zend Toolbar for Mozilla Firefox, Internet Explorer e Google Chrome (vamos precisar)</li>
<li>PHP 5.2 e PHP 5.3</li>
<li>PHPUnit plugin</li>
<li>Ambiente JRE (Java Runtime Environment - para rodar o Zend Studio)</li>
<li>Todos plugins que o Zend Studio tem por default</li>
</ul>
<p><strong>Nota</strong>: desative quaisquer outros debuggers. Isto inclui o famoso Xdebug. Ao final explico como deixar ambos ativados &#8211; e falo o porque de ambos ativos antes que alguém me xingue =P</p>
<p><strong>1. Configurando o Zend Debugger no Windows</strong></p>
<p>Vou usar aqui a variável <strong>$ZEND_DIR</strong> para designar o caminho até a instalação do Zend Studio. No meu caso é: <em>C:\Program Files\Zend\</em></p>
<p><em> </em>Misteriosamente no Windows a biblioteca ZendDebugger.dll que acompanha o Zend Studio não funciona. Também não é para menos: a disponível no site tem 893kb, contra 132kb da que acompanha o Studio. No Linux isto não ocorre, tornando tudo mais estranho ainda. De qualquer modo, perguntei para eles o motivo.</p>
<p>Então, nosso primeiro passo é baixar o <a title="Download Zend Debugger" href="http://www.zend.com/en/products/studio/downloads" target="_blank">ZendDebugger do site</a> . Após baixar, descompacte o conteúdo em um diretório temporário e copie apenas a biblioteca ZendDebugger.dll para o diretório que você vai criar: $ZEND_DIR\debug. Deverá estar assim:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger1.PNG"><img class="aligncenter size-medium wp-image-427" title="Diretório após pegar o ZendDebugger" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger1-300x76.PNG" alt="Diretório após pegar o ZendDebugger" width="300" height="76" /></a></p>
<p>Procure seu arquivo php.ini &#8211; caso não saiba onde esteja um php -i ou rodar o phpinfo() no servidor pode ajudar <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ao final dele você deve colocar:</p>
<pre>; The section name is optional, but it's always a good idea to add it,
; especially if you are not using a separate file
[Zend]

; This directive needs the full path to the Zend Debugger DLL.
zend_extension_ts="C:\Program Files\Zend\debug\ZendDebugger.dll"

; This directive allows Zend Debugger to start a debug session with:
; 127.0.0.1/32 - Zend Studio on the same computer
; 192.168.0.1/32 - Zend Studio on a computer with IP address 192.168.0.1
; 10.0.0.0/8 - Zend Studio on any computer with IP starting with 10.
zend_debugger.allow_hosts=127.0.0.1/32

; This directive allows Zend Debugger to expose itself
; upon request (this is used in some service functionality).
; The possible options are:
; never - do not expose (default)
; always - expose to whoever wants to know
; allowed_hosts - expose only if the request comes from an IP listed above
zend_debugger.expose_remotely=always</pre>
<p>Certifique-se do caminho correto em <em>zend_extension_ts</em> e em allow_hosts, caso queira adicionar mais IPs, apenas coloque uma virgula separando-os.</p>
<p>Agora procure por:</p>
<pre>; Implicit flush tells PHP to tell the output layer to flush itself
; automatically after every output block.  This is equivalent to calling the
; PHP function flush() after each and every call to print() or echo() and each
; and every HTML block.  Turning this option on has serious performance
; implications and is generally recommended for debugging purposes only.
implicit_flush = On</pre>
<p>Certifique-se que esteja On. Reinicie seu Apache, Lighttpd, IIS,&#8230;</p>
<p>Acessando seu phpinfo() novamente, você deverá ver a entrada do Zend Debugger:</p>
<p><img class="aligncenter size-full wp-image-428" title="PHPinfo - Zend Debugger" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger2.png" alt="PHPinfo - Zend Debugger" width="359" height="60" /></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger3.PNG"><img class="aligncenter size-medium wp-image-429" title="Entrada no phpinfo" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger3-300x137.PNG" alt="Entrada no phpinfo" width="300" height="137" /></a></p>
<p>Com isto a instalação do Zend Debugger está concluída. Em caso de problemas, certifique-se do caminho até a DLL do ZendDebugger ou ainda tente desativar os debuggers que você possa ter instalado ou ainda <em>extensions</em> adicionais para cache, performance e etc.</p>
<p><strong>2. Configurando o Zend Debugger no Linux</strong></p>
<p>Diferentemente do Windows, a instalação no Linux não requer baixar o ZendDebugger do site, pois a versão que acompanha o Zend Studio funciona perfeitamente igual <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Assumindo $ZEND_DIR como diretório base do Zend Studio. No meu caso é: /usr/local/Zend/</p>
<p>Localize seu php.ini . Como eu instalo tudo separado, o meu encontra-se em /etc/php/php.ini. Você pode usar o comando # find / -name php.ini para localizá-lo ou ainda, rodar o phpinfo() que também serve.</p>
<p>Ao final do arquivo, coloque:</p>
<pre>[Zend]
zend_extension="$ZEND_DIR/ZendStudio-7.1.1/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.7.v20091116/resources/php5/ZendDebugger.so"
zend_debugger.allow_hosts=127.0.0.1
zend_debugger.expose_remotely=always
[Debugger]
zend_extension_manager.debug_server_ts="$ZEND_DIR/ZendStudio-7.1.1/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.7.v20091116/resources/php5/"
zend_debugger.expose_remotely=allowed_hosts</pre>
<p>O caminho não há quebra de linha <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Note a versão do meu Zend Studio. Isto pode acabar mudando a versão do plugin também.</p>
<pre> org.zend.php.debug.debugger.linux.x86_64_5.3.7.v20091116</pre>
<p>O seu pode ser bem diferente disto. até o .linux deverá ser semelhante. Depois disto, vem a arquitetura do sistema operacional (aqui é 64bits) a versão do Debugger e por fim a versão de atualização. Com um ls no diretório de plugins você acha a versão correta ao seu caso.</p>
<p>Procure ainda no php.ini por:</p>
<pre>; Implicit flush tells PHP to tell the output layer to flush itself
; automatically after every output block.  This is equivalent to calling the
; PHP function flush() after each and every call to print() or echo() and each
; and every HTML block.  Turning this option on has serious performance
; implications and is generally recommended for debugging purposes only.
implicit_flush = On</pre>
<p>Certifique-se de que esteja On. O comentário acima do comando já diz o porque temos que deixá-lo ativado =P<br />
Salve e reinicie o Apache ou Lighttpd.</p>
<p>Acesse seu phpinfo e você deverá encontrar as seguintes entradas:</p>
<p style="text-align: center;"><img class="aligncenter" title="PHPinfo - Zend Debugger" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger2.png" alt="PHPinfo - Zend Debugger" width="359" height="60" /></p>
<p style="text-align: center;"><img class="aligncenter" title="Entrada no phpinfo" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/windebugger3-300x137.PNG" alt="Entrada no phpinfo" width="300" height="137" /></p>
<p style="text-align: center;">
<p style="text-align: left;">Com isto sua configuração no Linux está concluída <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: left;">
<p><strong>3. Configurações no Zend Studio</strong></p>
<p>Assumindo que seu Zend Debugger está devidamente instalado, vamos as configurações no Zend Studio:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendstudioconf1.PNG"><img class="aligncenter size-medium wp-image-430" title="Debug conf no Zend Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendstudioconf1-300x261.PNG" alt="Debug conf no Zend Studio" width="300" height="261" /></a>Certifique-se de possuir uma configuração semelhante.</p>
<p>Na linha PHP Debugger, clique em <em>Configure&#8230;</em><br />
Selecione o Zend Debugger na listagem e  clique em <em>Configure</em></p>
<p><em><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendstudioconf2.PNG"><img class="aligncenter size-medium wp-image-431" title="Zend Debugger" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendstudioconf2-300x277.PNG" alt="Zend Debugger" width="300" height="277" /></a> </em></p>
<p>Mantenha essa configuração. Muito provavelmente você não precisará editar nada. Atenção apenas para o Client Host/IP:</p>
<p>Retornando à primeira tela, agora na linha<strong> Server:</strong> clique em <em>PHP Servers&#8230;<br />
</em>Selecione <strong>Default PHP Web Server</strong> e clique em <em>Edit</em><em> </em></p>
<p><em><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendstudioconf3.PNG"><img class="aligncenter size-medium wp-image-432" title="Path Map configuration" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendstudioconf3-300x281.PNG" alt="Path Map configuration" width="300" height="281" /></a> </em></p>
<p>Muita atenção nesta parte: tudo que estiver listado ali será reconhecido pelo Zend Debugger como parte do projeto e portanto passível de debugar. O que não constar ali ele simplemente terá como &#8220;ok&#8221; e mesmo que você venha a colocar um breakpoint no código que não está contido no Path Mapping, ele irá ignorá-lo.</p>
<p>Por padrão, todo projeto que você cria no Zend Studio, ele automaticamente seta o próprio projeto na lista, e cada projeto tem o seu próprio Path Mapping. Por isso mesmo eu com 6 projetos setados na minha Workspace ele apenas está listando o projeto que está atualmente aberto. Caso eu abra e peça para ele debugar outro projeto, ele adiciona a lista esse meu outro projeto automaticamente.</p>
<p>Certo. Se ele adiciona automaticamente porque tenho que saber disto ?<br />
Simples ! Você pode estar usando bibliotecas de terceiros ou usando sua própria biblioteca e não tê-la incluida ali significa que o Zend Studio não irá debugá-la.</p>
<p>Para finalizar, copie o <a href="http://gpl.hlegius.pro.br/coding/dummy.phps" target="_blank">conteúdo que coloquei online</a> e salve-o como <strong>dummy.php</strong> na raiz de seu Servidor HTTP. Ele deverá estar acessível através do http://seuip/dummy.php e não é necessário colocar um em cada projeto, porém se você usa virtualhosts deverá ser um por virtualhost. Sem isto, o Debugger não funciona. A Zend disponibiliza este arquivo porém eu não me recordo se vem com o ZendDebugger ou se eu o peguei de outra fonte no site deles.</p>
<p>Neste ponto você já pode debugar um Script PHP ou uma URL que você forneça. Explicarei isto mais abaixo na parte <em>Exemplos de uso.</em></p>
<p><em> </em></p>
<p><strong>4. Configurando o Zend Toolbar<em> </em></strong></p>
<p>Durante a instalação ele configura a Zend Toolbar para o Internet Explorer. Para configurá-la no Firefox é simples:</p>
<p>Com o browser aberto acesse o caminho: $ZEND_DIR/ZendStudio-(sua_versao)/toolbars e clique em <em>ZendFirefoxToolbar-2.2.xpi.<br />
</em>Instale e reinicie o Mozilla Fx.<em><br />
</em></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendtoolbar1.PNG"><img class="aligncenter size-medium wp-image-433" title="Instalando a Zend Toolbar" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendtoolbar1-300x124.PNG" alt="Instalando a Zend Toolbar" width="300" height="124" /></a></p>
<p>Após reiniciar o Firefox e com o Zend Studio aberto, vá na ZendToolbar em <strong><em>Extra Stuff -&gt; Settings</em></strong></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendtoolbar2.PNG"><img class="aligncenter size-full wp-image-434" title="ZendToolbar configs" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendtoolbar2.PNG" alt="ZendToolbar configs" width="410" height="428" /></a></p>
<p>Certifique-se do caminho setado em <em>Zend Studio Executable </em>que geralmente vem errado <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  e o Zend Studio Broadcasting Port que deverá ser igual ao meu.<br />
Após isto, clique em Test e o resultado deverá ser:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendtoolbar3.PNG"><img class="aligncenter size-full wp-image-435" title="Zend Toolbar ok" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zendtoolbar3.PNG" alt="Zend Toolbar ok" width="401" height="239" /></a></p>
<p>Com isto a configuração do Zend Studio, Zend Debugger e Zend Toolbar estão concluídas.</p>
<p><strong>5. Exemplos de uso</strong></p>
<p>Para exemplificar melhor, vamos criar um pequeno projeto no Zend Studio.<br />
<strong>New -&gt; PHP Project </strong></p>
<p>Coloque o nome Zend ou qualquer outro e finalize.</p>
<p>Ele terá três arquivos: São eles: <a href="http://gpl.hlegius.pro.br/coding/zendstudio-example/Foobar.phps" target="_blank">Foobar.php</a> <a href="http://gpl.hlegius.pro.br/coding/zendstudio-example/Finaliza.phps" target="_blank">Finaliza.php</a> e <a href="http://gpl.hlegius.pro.br/coding/zendstudio-example/index.phps" target="_blank">index.php</a> . Salve-os em seu projeto.</p>
<p>Acesse http://seuip/projeto/index.php com o Mozilla Firefox. Deverá aparecer na tela o conteúdo:</p>
<pre>Uma string qualquerFinalizando</pre>
<p>Agora, clique em Debug na Zend Toolbar. Talvez ele pergunte sobre abrir a perspectiva de Debugging. Marque para sempre tomar esta ação e dê ok.</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio.png"><img class="aligncenter size-medium wp-image-438" title="PHP Debug Perspective" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio-300x169.png" alt="PHP Debug Perspective" width="300" height="169" /></a></p>
<p>Note que ele está parado na primeira linha do arquivo:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio2.png"><img class="aligncenter size-full wp-image-439" title="ZendDebug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio2.png" alt="ZendDebug" width="323" height="218" /></a></p>
<p>Suas opções são:</p>
<ul>
<li>F5: entra no método/classe que esteja dentro do seu Path Mapping. Caso não esteja, ele executa a ação normalmente e vai para a próxima instrução.</li>
<li>F6: executa a linha corrente e segue para a próxima instrução</li>
<li>F7: executa a linha corrente e sobe um nível (usando quando você aperta F5 sem querer :p)</li>
<li>F8: executa todo até encontrar um <em>breakpoint</em></li>
<li><em>Ctrl + F2: mata a sessão de debugging sem finalizar o script.</em></li>
</ul>
<p>Estas opções que listei, você encontrará na barra que está na aba Debug.</p>
<p style="text-align: center"><img class="aligncenter" title="Zend Toolbar" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio3.png" alt="Zend Toolbar" width="280" height="38" /></p>
<p style="text-align: left">Aperte F6 até ele ficar sobre a linha 6, $objFoo = new Foobar(); e então, aperte F5.<a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio4.png"><img class="aligncenter size-full wp-image-442" title="Zend Debug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio4.png" alt="Zend Debug" width="479" height="175" /></a>Note que ele abriu a classe <em>Foobar</em> e parou sobre a primeira linha dentro do construtor da classe. Repare na aba <strong>Variables</strong> que até aquele ponto, a variável membro <em>baz</em> está nula.</p>
<p style="text-align: left"><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio5.png"><img class="aligncenter size-full wp-image-443" title="Zend Debug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio5.png" alt="Zend Debug" width="432" height="144" /></a></p>
<p style="text-align: left">Pressionando novamente F5 ou F6, você será enviado para a linha que contém a chave que fecha o método construtor. Neste ponto, <em>baz</em> possui o valor <em>bar</em> que contém três caracteres.</p>
<p style="text-align: left">Apertando F6 ou F5 novamente, ele retornará a index.php sob a linha $objFoo-&gt;finaliza(). Caso decida pelo F5, ele entrará no método. Caso F6, ele executará a ação do método (e seus subníveis) e passará para a próxima instrução &#8211; que em nosso caso seria a próxima linha.</p>
<p style="text-align: left">Siga com F5 ou F6 até o término do script para acompanhar a evolução e modificação das variáveis.</p>
<p style="text-align: left"><strong>Breakpoints</strong></p>
<p style="text-align: left">Quem nunca usou um debug, talvez não conheça o que venha a ser um breakpoint. Ele na forma literal é um ponto de parada do debug <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: left">Vamos como exemplo, setar um na classe Foobar na linha 20. Para tal, você pode clicar duas vezes ao lado do número que identifica a linha ou então, com o cursor sobre a linha usar <em>Ctrl + Shift + B</em></p>
<p style="text-align: left"><em><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio6.png"><img class="aligncenter size-full wp-image-444" title="Zend Debug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio6.png" alt="Zend Debug" width="312" height="124" /></a></em>Um ponto ficará ao lado da linha identificando que há um breakpoint ativo. Novamente clique em Debug na toolbar. Ao abrir o Debug na primeira linha, pressione F8. Ele deverá parar sob nosso breakpoint.</p>
<p style="text-align: left"><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio7.png"><img class="aligncenter size-full wp-image-445" title="Zend Debug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio7.png" alt="Zend Debug" width="412" height="192" /></a><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio8.png"><img class="aligncenter size-full wp-image-446" title="Zend Debug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio8.png" alt="Zend Debug" width="327" height="131" /></a><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio9.png"><img class="aligncenter size-full wp-image-447" title="Zend Debug" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio9.png" alt="Zend Debug" width="260" height="76" /></a></p>
<p style="text-align: left">Na aba Breakpoints você pode desativar ou remover os breakpoints setados sem necessitar abrir arquivo por arquivo para removê-los.<br />
É possível definir condição para que o Debugger pare sobre determinado breakpoint. Para definir a condicional, clique com o botão direito sobre o breakpoint e vá em <em>breakpoint properties</em>.
</p>
<p style="text-align: left">
<p style="text-align: left">Ao lado do botão Debug na Zend Toolbar, há o <em>Debug Menu</em> . Nele há quatro opções: <strong>Current Page; Next Page; All forms (POST) in this site; All pages in this site</strong>. Recomendo que crie formulários, teste em chamadas Ajax, iframes (argh!), redirecionamentos HTTP e tudo mais que use no seu dia-a-dia. O Debugger pega qualquer ação no browser <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: left">E como brinde por ter configurado o Zend Debugger, você tem o Profile da página atual. Bastando para tal clicar em Profile.</p>
<p style="text-align: left"><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio10.png"><img class="aligncenter size-medium wp-image-448" title="Zend Profiler" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debuggingstudio10-300x214.png" alt="Zend Profiler" width="300" height="214" /></a>Enjoy <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: left">
<p><strong>6. Troubleshoot</strong></p>
<p><strong>Habilitando o Xdebug junto com o Zend Debugger</strong></p>
<p>A utilidade disto é que o Xdebug fornece recursos como: highlight de variáveis var_dump() &#8211; que não vamos mais usá-la como debugger &#8211; controle contra loopings infinitos, o trace completo quando encontramos Warning ou Fatal Errors e alguns outros mimos que o Zend Debugger não trás &#8211; ou eu os desconheço <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Para habilitar ambos, abra seu php.ini. E mude a entrada do Xdebug de:</p>
<pre>;zend_extension=php_xdebug.dll</pre>
<p>para</p>
<pre>extension=php_xdebug.dll</pre>
<p>O mesmo vale para a versão Linux, mudando apenas para .so</p>
<p><strong>Ele não para sob os breakpoints que setei</strong></p>
<p>Verifique o Path Mapping se o mesmo contém seu projeto listado. Caso não, adicione manualmente o projeto ao Path Mapping e tente novamente.</p>
<p><strong>Uso biblioteca externa &#8211; Propel, Symfony, Zend.. e toda vez que chamo o debugger recebo a tela</strong>:<a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zenddebuggererror.jpg"><img class="aligncenter size-medium wp-image-449" title="Path Mapping with external libs" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/zenddebuggererror-300x242.jpg" alt="Path Mapping with external libs" width="300" height="242" /></a>O problema é novamente o <strong>Path Mapping</strong>. Adicione o caminho da sua lib externa ao Path Mapping (veja como na sessão de configuração do Zend acima) e tente novamente.</p>
<p>Para finalizar&#8230;</p>
<p>Há um <a href="http://forums.zend.com/viewtopic.php?f=59&amp;t=962" target="_blank">excelente artigo em inglês</a> que explica como configurar o ZendDebugger no Linux e Windows e ainda explica o funcionamento do Debugger sobre a aplicação web. Vale a pena a leitura.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/configurando-o-zend-debugger/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Review: Zend Studio 7</title>
		<link>http://www.hlegius.pro.br/zend-studio-7-review/</link>
		<comments>http://www.hlegius.pro.br/zend-studio-7-review/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 00:50:37 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[develop]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=372</guid>
		<description><![CDATA[Salve !
Desde quando comecei a fazer programas venho usando algumas ferramentas para desenvolver em PHP.
Na categoria Editor / IDE, na minha mão (ui) já passaram Quanta Plus, KDevelop, Eclipse PHP IDE, Netbeans for PHP e agora estou utilizando o Zend Studio. Com exceção do último, todos free ou opensource.
Netbeans é muito bom, porém o que [...]]]></description>
			<content:encoded><![CDATA[<p>Salve !</p>
<p>Desde quando comecei a fazer programas venho usando algumas ferramentas para desenvolver em PHP.<br />
Na categoria Editor / IDE, na minha mão (ui) já passaram <strong>Quanta Plus</strong>, <strong>KDevelop</strong>, <strong>Eclipse PHP IDE</strong>, <strong>Netbeans</strong><strong> for PHP</strong> e agora estou utilizando o <strong>Zend Studio</strong>. Com exceção do último, todos free ou opensource.</p>
<p>Netbeans é muito bom, porém o que me chamou a atenção no <a href="http://www.zend.com/products/studio/" target="_blank">Zend Studio</a> foi o <em>all-in-one</em> que ele traz por default. Listando rapidamente:</p>
<ul>
<li>Editor PHP</li>
<li>Integração SVN/CVS/Git</li>
<li>PHP Debugging já integrado ao Zend Debugger</li>
<li>PHP Profiling</li>
<li>Database Management e Debug</li>
<li>Um ToDo simples</li>
<li>Facilidade em achar as coisas nos projetos</li>
<li>Zend Toolbar integration para Firefox e IE &#8211; mas quem liga pro IE afinal</li>
<li>etc&#8230;</li>
</ul>
<p>Claro que não é impossível configurar toda essa penca de coisa no Eclipse nativo ou Netbeans, só que isto demandaria tempo. <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Destaque para PHP Debug, Profiling e Zend Toolbar. Isto me chamou MUITA atenção quando estava olhando reviews e também nos trinta dias de testes.</p>
<p>Além do<em> feijão com arroz </em>temos:</p>
<p><strong>1. Call Hierarchy / Type Hierarchy / Open Type Hierarchy</strong></p>
<p>Ajuda um bocado na localização nas relações entre classes e métodos dentro do projeto. No exemplo tenho um método que chama outro e esse outro chama outro. No caso, tudo dentro de mesma classe, mas funciona perfeitamente em qualquer parte do sistema &#8211; incluindo libs no <em>Include Path:</em></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/callHierarchy.PNG"><img class="aligncenter size-full wp-image-397" title="Call Hierarchy" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/callHierarchy.PNG" alt="Call Hierarchy" width="339" height="144" /></a></p>
<p>Já o Type Hierarchy mostra a relação entre uma classe e suas relações com classes pai ou interfaces:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/typeHierarchy.PNG"><img class="aligncenter size-full wp-image-398" title="Type Hierarchy" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/typeHierarchy.PNG" alt="Type Hierarchy" width="342" height="373" /></a></p>
<p>E o Open Type Hierarchy (Ctrl + Shift + H) auxilia a localização de objetos, arquivos e métodos dentro do projeto.</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/openTypeHierarchy.PNG"><img class="aligncenter size-medium wp-image-399" title="Open Type Hierarchy" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/openTypeHierarchy-300x260.PNG" alt="Open Type Hierarchy" width="300" height="260" /></a></p>
<p>Ainda na área de localização de elementos, há uma pesquisa mais completa (Ctrl + H) que permite localização de métodos, arquivos, classes separando por tipo e muito mais:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/search1.PNG"><img class="aligncenter size-medium wp-image-400" title="Search (Ctrl + H)" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/search1-300x224.PNG" alt="Search (Ctrl + H)" width="300" height="224" /></a></p>
<p>Após encontrar um resultado, a tab search é exibida/focada:</p>
<p><img class="aligncenter size-full wp-image-401" title="Search Results" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/search2.PNG" alt="Search Results" width="323" height="262" /></p>
<h3></h3>
<p><strong>2. Indentação e Marcação (diff) no código:</strong></p>
<p>Outra coisa interessante &#8211; e que existe em qualquer IDE decente &#8211; é a possibilidade de trazer o que é chamado de Quick Diff. Este recurso permite mostrar de forma simples o que você alterou, removeu ou adicionou no código. Funciona com SVN, CVS e cópia do disco local. Selecione o tipo e as cores e voilà !</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/quickDiff.PNG"><img class="aligncenter size-medium wp-image-403" title="Quick diff" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/quickDiff-292x300.PNG" alt="Quick diff" width="292" height="300" /></a></p>
<p>Embora muito comum, a indentação de código é algo interessante de manter ajustado (tab com 4 espaços) e suas preferências quanto a espaço entre os elementos; posição de chave de abertura e etc;</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/indent.PNG"><img class="aligncenter size-medium wp-image-402" title="Indent" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/indent-300x257.PNG" alt="Indent" width="300" height="257" /></a></p>
<p>Nessa tela é possivel você definir praticamente tudo sobre indentação de código ! Depois de configurar ao seu gosto (ou padrão) pode exportar para XML e usar em qualquer outra ferramenta que leia o formato &#8211; qualquer Eclipse, por exemplo =P</p>
<p><strong>Depois de configurado</strong>, você pode selecionar o trecho a ter a indentação ajustada selecionando o trecho e  Ctrl + i &#8211; obrigado, Otávio pela dica; Pode formatar todo um arquivo usando Ctrl + shift + F &#8211; valeu Toscano pela tip &#8211; ou ainda, formatar TODO o projeto: <em>Selecione o Projeto no PHP Explorer, Source -&gt; Format &#8211; </em>obrigado hlegius <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Note que todos atalhos funcionam no Eclipse também <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>3. PHP Debug</strong></p>
<p>Não é um recurso muito usado pelos developers PHP, principalmente aqueles que começaram com PHP, como eu, mas sem dúvidas revoluciona a forma de como você desenvolve. Após adotar o debug você não quer mais saber de var_dump() ou print_r() com aqueles: &#8216;estou aqui&#8217; para verificar o que pegou na aplicação.</p>
<p>Como o PHP é baseado em Web, seria fundamental ele poder ser debugado como se estivesse sendo carregamento pelo browser, não ? E é exatamente isso que permite o Zend Debugger &#8211; o Xdebug também =~</p>
<p>Ambas engines de debug podem ser integradas ao Zend Studio, porém, no pacote do Studio já vem a versão mais recente do Zend Debugger e tudo já meio que ajustado para rodar com ele <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>É possível debugar um script PHP Modo terminal e claro, o PHP Web Debug. Para este último você fornece a URL que quer debugar e ele abre a sessão de debugging parando na primeira linha.</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug1.PNG"><img class="aligncenter size-medium wp-image-404" title="Zend Debugger + Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug1-300x267.PNG" alt="Zend Debugger + Studio" width="300" height="267" /></a></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug2.PNG"><img class="aligncenter size-medium wp-image-405" title="Zend Debugger + Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug2-300x225.PNG" alt="Zend Debugger + Studio" width="300" height="225" /></a></p>
<p>Utilizando os breakpoints você pode acompanhar o fluxo da aplicação, valores das variáveis, propriedades dos objetos instanciados e etc.</p>
<p>Claro que nossas aplicações vão muito além de uma simples URL. Temos chamadas com POST, GET e até chamadas em <em>Ajax</em>. O Zend Studio provê uma extension para o Firefox chamada <strong>Zend Toolbar</strong>. Essa toolbar, permite que você diga ao browser para chamar a sessão de Debug ou Profiling do Studio na próxima página; página atual; Qualquer submit POST ou ainda em qualquer ação no browser. E o pior: funciona !</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug3.PNG"><img class="aligncenter size-medium wp-image-406" title="Zend Studio + Zend Toolbar" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug3-300x242.PNG" alt="Zend Studio + Zend Toolbar" width="300" height="242" /></a></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug4.PNG"><img class="aligncenter size-medium wp-image-407" title="Zend Studio - Debug Perpective" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/debug4-300x119.PNG" alt="Zend Studio - Debug Perpective" width="300" height="119" /></a></p>
<p>A configuração do Zend Debugger na sua máquina é simples, mas acho ser digna de um post inteiro sobre isto. Vou tentar preparar um material e publico aqui a configuração e uso dele no Zend Studio.</p>
<p><strong>4. PHP Profile</strong></p>
<p>Além de debuggar, seria interessante analisarmos o desempenho da aplicação. Ok, segue:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/profile.PNG"><img class="aligncenter size-medium wp-image-408" title="PHP Profile Zend Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/profile-300x201.PNG" alt="PHP Profile Zend Studio" width="300" height="201" /></a></p>
<p>Chamadas, quantas vezes chamou; quem demora mais; quem é mais rápido; quem chama quem;</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/profile2.PNG"><img class="aligncenter size-medium wp-image-409" title="PHP profile - Zend Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/profile2-300x254.PNG" alt="PHP profile - Zend Studio" width="300" height="254" /></a></p>
<p>E ele, o fluxo da aplicação:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/profile3.PNG"><img class="aligncenter size-medium wp-image-410" title="PHP Profile - Zend Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/profile3-300x256.PNG" alt="PHP Profile - Zend Studio" width="300" height="256" /></a></p>
<p>A Zend Toolbar também provê acesso simples ao Profiling. Basta clicar em Profile na toolbar e pronto. O Studio é chamado e o profile da página é feito.</p>
<p><strong>5. Database Management</strong></p>
<p>Para fechar, gerenciamento dos databases. Possui ponte para vários databases incluindo Oracle, MySQL, PostgreSQL e MSSQL.</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/database.PNG"><img class="aligncenter size-medium wp-image-411" title="Database - Zend Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/database-181x300.PNG" alt="Database - Zend Studio" width="181" height="300" /></a></p>
<p>Por ele é possível adicionar valores, editar, remover, rodar <em>Queries SQL</em>, backup de estrutura e valores e ele também armazena suas Queries para re-executá-las com um clique quando quiser.</p>
<p><strong>6. Outros</strong></p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/01/svn.png"><img class="aligncenter size-medium wp-image-412" title="SVN - Zend Studio" src="http://www.hlegius.pro.br/wp-content/uploads/2010/01/svn-242x300.png" alt="SVN - Zend Studio" width="242" height="300" /></a></p>
<p>SVN, projetos remotos &#8211; incluindo acesso SMB ou FTP; WebServices; Históricos locais, SVN, diff, suporte a Git e suporte a quaisquer plugins que rodem no Eclipse, afinal o Zend Studio tem como base o Eclipse.</p>
<p>Já o configurei no Ubuntu lá na Vex, Windows 7 e Arch Linux aqui no escritório pessoal. Tudo muito tranquilo, sempre.</p>
<p><strong>7. Preços e licença</strong></p>
<p>O custo da licença eu acho alto demais para uma IDE de desenvolvimento. Atualmente são US$ 400,00 por ano para ter suporte e atualização sempre. Caso queira, pode comprar a licença por um ano e depois não comprar mais. Neste caso você ficaria com a última versão antes da expiração de seu suporte ilimitado. Em miúdos: enquanto você paga, recebe atualização da versão.</p>
<p>Comprei em setembro, na versão 7. Em Setembro de 2010, vamos imaginar que esteja na versão 9. Terei as licenças para 7, 8 e 9. Expirou e não renovei, mas saiu update da versão 9, a 9.1, por exemplo. Tenho update dela, pois a licença é a mesma da 9. Porém, no lançamento da 10, eu precisaria comprar uma nova licença para ter direito de baixar e usar a o v10.</p>
<p><strong>Minha opinião final:</strong> gostei e tenho usado apenas ele desde quando comecei a testá-lo em meados de Setembro de 2009. Tem muita coisa boa e que ajuda muito e mesmo com o alto custo, vale cada centavo pago até o presente momento.</p>
<p><em>#notamental não é post patrocinado, tão pouco trabalho na Zend, certo ? <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/zend-studio-7-review/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>8++ perguntas para o @hlegius</title>
		<link>http://www.hlegius.pro.br/8-perguntas-para-o-hlegius/</link>
		<comments>http://www.hlegius.pro.br/8-perguntas-para-o-hlegius/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 00:29:16 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[hlegius]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=374</guid>
		<description><![CDATA[O Chris, um chapa (ainda) virtual, viciado (e rato) em programação de interfaces, convidou-me a participar de uma entrevista informal. Queria ouvir ler meus pontos de vista em relação à alguns temas e também, perguntas sobre meu lado profissional.
Topei ! Respondi 8++ questões as quais podem ser vistas acessando o blog dele.
Agradeço o convite e [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://www.chrisb.com.br/blog/">Chris</a>, um chapa (ainda) virtual, viciado (e rato) em programação de interfaces, convidou-me a participar de uma entrevista informal. Queria <strike>ouvir</strike> ler meus pontos de vista em relação à alguns temas e também, perguntas sobre meu lado profissional.</p>
<p>Topei ! Respondi 8++ questões as quais podem ser vistas acessando o <a href="http://www.chrisb.com.br/blog/8-perguntas-para-o-hlegius/">blog dele</a>.</p>
<p>Agradeço o convite e deixo aqui um convite formal para um bate-papo numa (un)conference qualquer. o/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/8-perguntas-para-o-hlegius/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zend Certified Engineer</title>
		<link>http://www.hlegius.pro.br/zend-certified-engineer/</link>
		<comments>http://www.hlegius.pro.br/zend-certified-engineer/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 23:25:40 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=351</guid>
		<description><![CDATA[Depois de quase um ano enrolando para tentar a prova de certificação da Zend, eu tomei coragem e no sábado, 15 de agosto deste ano, eu finalmente fui fazer a prova no Centro de Testes autorizado da Vue, no Senac, em São Paulo.
O check-in para a prova é um pouco tenso colocando ainda mais medo [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de quase um ano enrolando para tentar a prova de certificação da Zend, eu tomei coragem e no sábado, 15 de agosto deste ano, eu finalmente fui fazer a prova no Centro de Testes autorizado da Vue, no Senac, em São Paulo.</p>
<p>O check-in para a prova é um pouco tenso colocando ainda mais medo em quem vai fazer a prova. Documentos em inglês, assinar em três lugares diferentes, marcar hora de entrada, guardar itens no guarda-volumes e entrar liso, apenas com o crachá da instituição em uma baiazinha apertada de 1x1 metro quadrado onde mal cabe você e o computador.</p>
<p>Essa baia tem um além do PC - totalmente travado e rodando Windows 2000 - um fone para os ruídos externos não atrapalhar-te durante a prova. Bem acima há uma câmera filmando todas suas ações e a única coisa permitida é utilizar o teclado, mouse e uma folha de anotações com apagador e canetão para lousa.</p>
<p>Na minha prova, resumidamente caiu: <strong>PHP 4, 5, diferenças entre 4 e 5 e uma pergunta de PHP 3</strong>. Design patterns caiu umas quatro ou cinco questões. Admito que era necessário pensar, não era perguntinha boba como do tipo: <em>"o padrão que faz tal coisa é : ..., ..., ..."</em>. Era necessário analisar a melhor solução com as patterns lá descrimidas e fazer sua escolha. Gostei dessa parte <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Havia perguntas cabulosas onde era alterada várias vezes e de várias formas um objeto copiando, referênciando e tudo mais; para no fim ele requerer a saída de todas variáveis que aquele objeto teve durante o ciclo de vida.</p>
<p>Caiu coisas sobre segurança, PDO, SQLite, perguntas específicas de banco de dados - coisas como definir transação, prepared-statements, ... - comparação de tipos, coisas sobre arrays e refatoração de código. Neste último ele fornecia um código legado em PHP 4 e pedia a versão em PHP 5. Nada complexo, coisas simples, somente para testar se você conhece PHP4 <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>O tempo de prova é excelente. 90 minutos para 70 questões. Eu finalizei a prova restando pouco mais de 40 minutos. Super tranquilo. Fiz sem pressa, na calma, lendo e pensando nas soluções.</p>
<p>É totalmente permitido pular questões e depois voltar nelas, porém, não fiz isto. Fui na sequência. Direto !</p>
<p>Ao fim, ele mostra as questões que possívelmente não tenham sido respondidas e pergunta se você quer finalizar a prova. Clicando que sim, ele confirma novamente e informa que não há mais volta :O</p>
<p>Ao confirmar novamente, aparece uma barrinha de "loading...". Ela ficou por alguns segundos, que mais pareciam uma eternidade. Respirei fundo e olhei para a tela novamente. Vi em negrito e em h1: <strong>Congratulations ! You passed</strong> (..) [alguma coisa a mais que eu nao lembro]</p>
<p>Respiro de alívio e ao mesmo tempo ergui as mãos e falei meio que sem voz: <em>Eu consegui !</em></p>
<p>Saí da salinha mais do que depressa e ao chegar na recepção já havia um<a href="http://www.flickr.com/photos/hlegius/3823797858/" target="_blank"> "comprovante" da prova </a>informando que eu havia passado<em>, </em>com data, hora<em> </em>e meu código da prova.</p>
<p>Agora estou esperando chegar a certificação pelos correios e pelo que andei olhando no Flickr, junto virá um adesivo Zend Certified PHP 5 para eu colar <span style="text-decoration: line-through;">na testa </span>onde quiser.</p>
<p>A prova exige que você tenha vivência com a linguagem. Não adianta "decorar", comer livros ou fazer cursos de verão. Esqueçam. Precisa saber o que acontece quando as coisas dão certo e principalmente: o comportamento das coisas quando dão errado. Como por exemplo:</p>
<div class="igBar"><span id="lcode-2"><a href="#" onclick="javascript:showPlainTxt('code-2'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-2">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?php </div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">$arrFake = <span style="color:#CC0000;">"aqui era para ser um array, mas não é. Qual é o resultado ?"</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">echo count<span style="color:#006600; font-weight:bold;">&#40;</span>$arrFake<span style="color:#006600; font-weight:bold;">&#41;</span>; ?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Você pode - e deve - pesquisar por simulados online e realizar testes com a linguagem. A melhor coisa que você pode fazer é ler o manual do PHP. Melhor fonte para aprender bem o PHP. Há também o <a href="http://www.zend.com/store/education/certification/self-test.php">Zend Self-test</a> que você poderá tentar também.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/zend-certified-engineer/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Alternativa ao Cron Jobs em PHP</title>
		<link>http://www.hlegius.pro.br/alternativa-ao-cron-jobs-em-php/</link>
		<comments>http://www.hlegius.pro.br/alternativa-ao-cron-jobs-em-php/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 01:25:25 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Desenvolvimento]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=326</guid>
		<description><![CDATA[Salve !
Sabe aquelas vezes em que você precisa realizar tarefas demoradas no browser do cliente e então você lembra do maravilhoso Cron Jobs ? Pois é, uma excelente ferramenta a nossa disposição. Entretanto, às vezes, certas empresas de hosting (Locaweb é uma) define um horário para funcionamento destas "tarefas agendadas". No caso da Locaweb é [...]]]></description>
			<content:encoded><![CDATA[<p>Salve !</p>
<p>Sabe aquelas vezes em que você precisa realizar tarefas demoradas no browser do cliente e então você lembra do maravilhoso Cron Jobs ? Pois é, uma excelente ferramenta a nossa disposição. Entretanto, às vezes, certas empresas de hosting (Locaweb é uma) define um horário para funcionamento destas "tarefas agendadas". No caso da Locaweb é das 2 às 3 da matina apenas.</p>
<p>Mas, mas e agora ? Como executar a tal sonhada tarefa "em background" quando não há o Cron Jobs como opção ?</p>
<h3>Um pouco de história</h3>
<p>Sabemos muito bem que o PHP é <em>server-side</em> e isso significa que o PHP roda no servidor e não no cliente como o Javascript, por exemplo. Entretanto, logo quando eu comecei a programar com PHP eu me perguntava o motivo pelo qual o script era interrompido ao clicar no botão Stop do browser ou então quando eu o fechava já que a ação era no cliente e não no servidor. Tempos depois descobri que nestes eventos, era enviada uma informação ao servidor PHP (via TCP, claro) que de o usuário "abortou" a conexão com ele e o PHP bem esperto que é, parava aquela tarefa.</p>
<h3>Entretanto...</h3>
<p>O PHP nos permite manipular esse comportamento, ou seja, posso dizer ao PHP que eu quero continuar executando o script mesmo se o cliente nos <em>deixar na voz</em> ! Como uma imagem vale mais do que mil palavras, deixo aos senhores um pequeno vídeo que fiz demonstrando o funcionamento:</p>
<p><object width="590" height="422"><param name="movie" value="http://www.youtube.com/v/kJT2rEK7mvo&#038;hl=pt-br&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/kJT2rEK7mvo&#038;hl=pt-br&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="590" height="422"></embed></object></p>
<p>Perceba que caso queira redirecionar o usuário para outra página e continuar trabalhando naquela tarefa, você precisa manipular o buffer e os headers da página da forma como coloquei no script, caso contrário, ele irá processar todo o conteúdo e depois sim, redirecionar. Isto por quê, como não estamos enviando nada diretamente ao browser, o Apache espera uma quantidade de dados enviados antes de processar quaisquer headers. Com as <a href="http://br.php.net/manual/en/ref.outcontrol.php" target="_blank">funções de buffer do PHP</a> nós podemos mudar também esse comportamento, forçando-lhe a obedecer o header (Location).</p>
<p>Deixo abaixo o código dos dois arquivos usados no vídeo:</p>
<div class="igBar"><span id="lcode-5"><a href="#" onclick="javascript:showPlainTxt('code-5'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-5">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?php</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">/**</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * Connection Handler</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * @author Hélio Costa e Silva &lt;helio@hlegius.pro.br&gt;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * @version 27/03/2009</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> *</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * @internal teste</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> */</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">ob_start<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">ignore_user_abort<span style="color:#006600; font-weight:bold;">&#40;</span>true<span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">$n = <span style="color:#800000;color:#800000;">1</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">do <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; error_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">'Sequência '</span> . $n . <span style="color:#CC0000;">"<span style="color:#000099; font-weight:bold;">\n</span>"</span>, <span style="color:#800000;color:#800000;">3</span>, <span style="color:#CC0000;">'foobar.txt'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; $n++;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; sleep<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;color:#800000;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; flush<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; if <span style="color:#006600; font-weight:bold;">&#40;</span>$n&gt; <span style="color:#800000;color:#800000;">35</span><span style="color:#006600; font-weight:bold;">&#41;</span> break;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> while <span style="color:#006600; font-weight:bold;">&#40;</span>true<span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<div class="igBar"><span id="lcode-6"><a href="#" onclick="javascript:showPlainTxt('code-6'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-6">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?php</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">/**</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * Connection Handler</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * @author Hélio Costa e Silva &lt;helio@hlegius.pro.br&gt;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * @version 27/03/2009</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> *</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * @internal teste</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> */</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">$n = <span style="color:#800000;color:#800000;">30</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">do <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; if <span style="color:#006600; font-weight:bold;">&#40;</span>$n == <span style="color:#800000;color:#800000;">36</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; header <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"Location: http://localhost/estudos/"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; ob_end_clean<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; header <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"Connection: close"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; ignore_user_abort<span style="color:#006600; font-weight:bold;">&#40;</span>true<span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; ob_start<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; header<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"Content-Length: 0"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; ob_end_flush<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; flush<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#FF9933; font-style:italic;">// Se houver sessões em aberto, usar também:</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#FF9933; font-style:italic;">//session_write_close();</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#FF9933; font-style:italic;">// Sugestão feita pelo usuário em:</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#FF9933; font-style:italic;">// http://br.php.net/manual/en/features.connection-handling.php</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; error_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">'Redirecionado '</span> . $n . <span style="color:#CC0000;">"<span style="color:#000099; font-weight:bold;">\n</span>"</span>, <span style="color:#800000;color:#800000;">3</span>, <span style="color:#CC0000;">'foobar.txt'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; $n++;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; sleep<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#800000;color:#800000;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; if <span style="color:#006600; font-weight:bold;">&#40;</span>$n&gt; <span style="color:#800000;color:#800000;">65</span><span style="color:#006600; font-weight:bold;">&#41;</span> break;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> while <span style="color:#006600; font-weight:bold;">&#40;</span>true<span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>E também, o <a href="http://helio.hlegius.pro.br/hlegius-ignore_user_abort_php.ogv">vídeo original no formato OGV</a>.</p>
<p><strong>Mais informações:</strong></p>
<ul>
<li><a href="http://br.php.net/ignore_user_abort" target="_blank">http://br.php.net/ignore_user_abort</a></li>
<li><a href="http://br.php.net/manual/en/features.connection-handling.php" target="_blank">http://br.php.net/manual/en/features.connection-handling.php</a></li>
</ul>
<p><em>Nota</em>: o programa usado para gravar foi o <strong>qt-RecordMyDesktop</strong> para Linux.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/alternativa-ao-cron-jobs-em-php/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Exceptions. Pois nem tudo é perfeito</title>
		<link>http://www.hlegius.pro.br/exceptions-pois-nem-tudo-e-perfeito/</link>
		<comments>http://www.hlegius.pro.br/exceptions-pois-nem-tudo-e-perfeito/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 14:44:10 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=313</guid>
		<description><![CDATA[Salve !
Pense numa rotina que desenvolveu. Qualquer uma ! Agora tente se recordar de quantas formas ela poderia ser quebrada pelo usuário, gerando assim algo inexperado na sua aplicação fazendo com que você retornasse um erro para o cliente.
E qual é a forma que você utiliza para retornar estes erros ? Veja, eu posso ajudar [...]]]></description>
			<content:encoded><![CDATA[<p>Salve !</p>
<p>Pense numa rotina que desenvolveu. Qualquer uma ! Agora tente se recordar de quantas formas ela poderia ser quebrada pelo usuário, gerando assim algo inexperado na sua aplicação fazendo com que você retornasse um erro para o cliente.</p>
<p>E qual é a forma que você utiliza para retornar estes erros ? Veja, eu posso ajudar a recordar você:</p>
<div class="igBar"><span id="lcode-11"><a href="#" onclick="javascript:showPlainTxt('code-11'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-11">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?php</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">function foobar<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strlen<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> &lt;<span style="color:#800000;color:#800000;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -<span style="color:#800000;color:#800000;">1</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strpos<span style="color:#006600; font-weight:bold;">&#40;</span>$nome,<span style="color:#CC0000;">"foo"</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -<span style="color:#800000;color:#800000;">2</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;echo $nome;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;return <span style="color:#800000;color:#800000;">0</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Com isso lá na sua Action você fica fazendo malabarismo para encontrar o erro retornado e gerar a mensagem para o usuário. Não demorará muito para você criar sua tabela de erro:</p>
<ul>
<li>-1 para erros de entrada</li>
<li>-2 para erros de máscara</li>
<li>-3 para calcúlos errados</li>
<li>-4 para usuário não logado</li>
<li>-5 ....</li>
<li>-7634 ....</li>
</ul>
<p>Realmente, bem simples assim né ? Só consultar a tabela e mandar bala.</p>
<p>Eu realmente não entendo o motivo de muitos não utilizarem a<a href="http://br.php.net/exception" target="_blank"> classe nativa de exceções do PHP</a>. É simples, é funcional e<em> de grátis</em> você não precisa montar sua tabelinha de códigos de erro.</p>
<p>Veja o mesmo código reescrito utilizando a tal classe:</p>
<div class="igBar"><span id="lcode-12"><a href="#" onclick="javascript:showPlainTxt('code-12'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-12">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?php</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">function foobar<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strlen<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> &lt;<span style="color:#800000;color:#800000;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new Exception <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O nome não é válido !"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strpos<span style="color:#006600; font-weight:bold;">&#40;</span>$nome,<span style="color:#CC0000;">"foo"</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; throw new Exception<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O nome precisa conter foo, cara !"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;echo $nome;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Com isso na sua Action, simplesmente:</p>
<div class="igBar"><span id="lcode-13"><a href="#" onclick="javascript:showPlainTxt('code-13'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-13">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?php</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">include <span style="color:#CC0000;">"function_foobar.php"</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">try <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; foobar<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"ab"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> catch <span style="color:#006600; font-weight:bold;">&#40;</span>Exception $e<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; $var_template_sem_merchan_pro_smarty-&gt;<span style="">assign</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">'retorno_de_erro'</span>,$e-&gt;<span style="">getMessage</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Assim, você pode ter 1, 2, 3, <em>n</em> mensagens de erro em <em>n</em> camadas da aplicação sem a necessidade de se preocupar em tratar uma a uma também na Action. Fica ultra-transparente na Action além de economizar seus dedos refazendo coisas que já estavam prontas camadas a dentro.</p>
<p><strong>Nota</strong>: Não esqueça disso <strong>nunca</strong> : <span style="color: #ff0000;">jamais</span> lance como exception uma mensagem de erro do PHP. Isso é feio - porque vem em inglês -, você será xingado por 3 gerações futuras de programadores além de permitir que os usuários vejam detalhes sobre sua aplicação.</p>
<h5>Como detectar os erros sem lança-los ao usuário ?</h5>
<p>Bem simples. Persista-os - eita mania - em arquivos de log. Mas calma, antes de sair criando algo com fopen(), leia isto: o PHP também traz o cara que salva - persiste - erros ! Ah sim, o PHP é excelente eu sei. Voltando ao exemplo...</p>
<p>
<div class="igBar"><span id="lcode-14"><a href="#" onclick="javascript:showPlainTxt('code-14'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-14">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?php</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">function foobar<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strlen<span style="color:#006600; font-weight:bold;">&#40;</span>$nome<span style="color:#006600; font-weight:bold;">&#41;</span> &lt;<span style="color:#800000;color:#800000;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;error_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O cara forneceu "</span>. $nome . <span style="color:#CC0000;">" e isto é inválido <span style="color:#000099; font-weight:bold;">\n</span>"</span>, <span style="color:#800000;color:#800000;">3</span>, <span style="color:#CC0000;">"seu_arquivo_de_log.txt"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new Exception <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O nome não é válido !"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp;if <span style="color:#006600; font-weight:bold;">&#40;</span>strpos<span style="color:#006600; font-weight:bold;">&#40;</span>$nome,<span style="color:#CC0000;">"foo"</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; error_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O cara forneceu "</span>. $nome . <span style="color:#CC0000;">" porém sem o foo !<span style="color:#000099; font-weight:bold;">\n</span>"</span>, <span style="color:#800000;color:#800000;">3</span>, <span style="color:#CC0000;">"seu_arquivo_de_log.txt"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#FF9933; font-style:italic;">// #notamental não há motivos para logar &quot;erros&quot; deste tipo. Estou apenas ilustrando seu funcionamento <img src='http://www.hlegius.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp;throw new Exception<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"O nome precisa conter foo, cara !"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; </div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; echo $nome;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Sim, ele, o <a href="http://br.php.net/error_log" target="_blank">error_log()</a> salva o log para ti. E pior, digo, melhor: caso queira ele pode enviar a notificação no seu e-mail. Certo, em boa parte dos casos isto definitivamente não é uma boa ideia. Mas pode ser útil algum dia, penso.</p>
<p>Resumo do dia: use ao máximo as <a href="http://br.php.net/exception" target="_blank">Exceptions</a> e as <a href="http://br.php.net/manual/pt_BR/ref.errorfunc.php" target="_blank">funções para tratamento de erros do php</a> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hlegius.pro.br/exceptions-pois-nem-tudo-e-perfeito/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
