<?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://programe.me/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://programe.me</link>
	<description>programação, desenvolvimento, tecnologia e muito o que contar.</description>
	<lastBuildDate>Wed, 23 Nov 2011 17:26:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>PHP Conference Brasil 2011</title>
		<link>http://programe.me/php-conference-brasil-2011/</link>
		<comments>http://programe.me/php-conference-brasil-2011/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 12:00:29 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Dia-a-dia]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[palestra]]></category>
		<category><![CDATA[phpconf]]></category>

		<guid isPermaLink="false">http://programe.me/?p=809</guid>
		<description><![CDATA[Quer concorrer a um convite Silver na faixa? Até 26/11! Diferentemente dos outros anos, em 2011 eu estarei na PHPConference como palestrante. Meu maior impasse era quanto ao tema, por fim, decidi submeter algo polêmico que foi aceito! Acredito conseguir abrir a mente de alguns possíveis espectadores com o tema: Definir classe não é programar [...]]]></description>
			<content:encoded><![CDATA[<pre><strong><a href="http://twitter.com/hlegius/status/139395194549313536">Quer concorrer a um convite Silver na faixa? </a>Até 26/11!</strong></pre>
<p>Diferentemente dos outros anos, em 2011 eu estarei na <a href="http://phpconference.com.br/schedule/day1">PHPConference como palestrante</a>. Meu maior impasse era quanto ao tema, por fim, decidi submeter algo polêmico que foi aceito! Acredito conseguir abrir a mente de alguns possíveis espectadores com o tema:</p>
<blockquote><p><a>Definir classe não é programar com orientação a objetos.</a></p></blockquote>
<p>Do que <strong>não</strong> falarei:</p>
<ul>
<li>Como definir uma classe com PHP;</li>
<li>Classe e Objeto no âmbito técnico do PHP;</li>
<li>Parâmetros, métodos e objetos;</li>
<li>Padrões de projeto (design patterns).</li>
</ul>
<p>Do que falarei:</p>
<ul>
<li>Design (projeto) orientado a objetos;</li>
<li>Princípios de orientação a objetos;</li>
<li>Como <strong>não</strong> definir uma classe (code smell);</li>
<li>Composição, agregação, value object e entidades;</li>
<li>Ubiquitous Language (ourindo do Domain-Driven Design)</li>
<li>Getters, setters burros;</li>
<li>Ciclo de vida de um objeto.</li>
</ul>
<p>O objetivo é abrir a mente dos presentes para uma orientação a objetos pura, legível e realmente manutenível. Minha palestra será na sexta-feira, 2 de dezembro às 11hs (<a href="http://phpconference.com.br/schedule/">de acordo com a grade atual</a>). <a href="http://www.phpconference.com.br/presentations/show/id/90">Interessou</a>? Aparece por lá! <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/php-conference-brasil-2011/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP Resque Bundle</title>
		<link>http://programe.me/queue-com-php-resque-bundle/</link>
		<comments>http://programe.me/queue-com-php-resque-bundle/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 11:37:08 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony resque php]]></category>

		<guid isPermaLink="false">http://programe.me/?p=797</guid>
		<description><![CDATA[Rubistas já familiariza com o famoso Resque para gerenciamento de filas, sabe bem da utilidade deste software. Para os desavisados, explico: &#160; Você tem um sistema de upload e parser de imagens em seu sistema. Várias pessoas enviando imagens o tempo todo. Como fazer para não explodir sobrecarregar o servidor com múltiplos filhos e ainda [...]]]></description>
			<content:encoded><![CDATA[<p>Rubistas já familiariza com o famoso <a href="https://github.com/defunkt/resque">Resque</a> para gerenciamento de filas, sabe bem da utilidade deste software. Para os desavisados, explico:</p>
<p>&nbsp;</p>
<p><a href="http://programe.me/wp-content/uploads/2011/11/queue_line_2.jpg"><img class="aligncenter size-medium wp-image-803" title="Queue" src="http://programe.me/wp-content/uploads/2011/11/queue_line_2-300x225.jpg" alt="Queue" width="300" height="225" /></a></p>
<p>Você tem um sistema de upload e parser de imagens em seu sistema. Várias pessoas enviando imagens o tempo todo. Como fazer para não <del>explodir</del> sobrecarregar o servidor com múltiplos <em>filhos</em> e ainda não segurar toda essa gente na tela de upload do site ? Simples! Você pode criar uma fila de upload e parser! Toda requisição de upload é direcionada para um <strong><em>euqueue</em></strong> que receberá e colocará a requisição no final da fila. Do outro lado, há um (ou mais) <strong><em>Workers</em></strong> trabalhando para que os itens da fila sejam processados um a um por ordem de entrada na fila. Sem sobrecargas, sem esperas por atendimento, etc.</p>
<p>Quando precisei utilizar o Resque, busquei uma solução em PHP e felizmente, encontrei! <a href="https://github.com/chrisboulton/php-resque">PHP-Resque</a> é um port fiel ao original Resque (Ruby). Vi o projeto e como funcionava. Tudo perfeito, exceto pelo fato de não ser separado com namespaces e não ter suporte ao Symfony. Buscando mais, encontrei um plugin para o Symfony 1.x, mas nada referente ao Symfony 2.x, daí, resolvi eu criar um bundle do php-resque para o sf2.</p>
<p>Na <a href="https://github.com/hlegius/PHPResqueBundle">página do projeto</a>, explico como funciona o <a href="https://github.com/hlegius/PHPResqueBundle">PHP Resque Bundle</a> com todo detalhamento possível. Tenho mais alguns itens a implementar no projeto como criar namespaces para as filas, algo possível no Resque (Ruby) mas impossível ainda no PHP-Resque &#8211; <a href="https://github.com/chrisboulton/php-resque/issues/20">vide thread</a>. Trabalharei nisto em breve, pois precisarei deste recurso também =D</p>
<p>Como o PHP-Resque não possui interface gráfica (como o Resque), uma alternativa é baixar o Resque e utilizá-lo somente para este fim &#8211; ou então, forkear o php-resque e implementar isto por lá!</p>
<p>Dúvidas, sugestões ou contribuições podem ser feitas diretamente no Github dos projetos. Happy hacking! <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/queue-com-php-resque-bundle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Review: Zend Server 5</title>
		<link>http://programe.me/zend-server-review/</link>
		<comments>http://programe.me/zend-server-review/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 17:48:32 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=771</guid>
		<description><![CDATA[No primeiro trimestre deste ano a Zend liberou licenças do Zend Server e Zend Studio para novos e antigos ZCEs (Zend Certified Engineers). Como sempre tive curiosidade de testar, mas não queria utilizar o limitadíssimo Zend Server Community Edition, fiz desta oportunidade a ocasião ideal para testá-lo e ver se realmente valeria a pena pagar [...]]]></description>
			<content:encoded><![CDATA[<p>No primeiro trimestre deste ano a <a href="http://zend.com" target="_blank">Zend</a> liberou licenças do <a href="http://zend.com/server" target="_blank">Zend Server</a> e<a href="http://zend.com/studio" target="_blank"> Zend Studio</a> para novos e antigos ZCEs (Zend Certified Engineers). Como sempre tive curiosidade de testar, mas não queria utilizar o limitadíssimo Zend Server Community Edition, fiz desta oportunidade a ocasião ideal para testá-lo e ver se realmente valeria a pena pagar o preço dele.</p>
<p>Com key em mãos, basta baixar um binário, típico installer.bin para Linux no <a href="http://www.zend.com/en/products/server/" target="_blank">site da Zend</a>.</p>
<p><strong>1. Instalação</strong></p>
<p>Ao rodar o binário, é solicitado a versão do PHP que deseja instalar. Na versão que testei, Zend Server 5, PHP 5.2 ou PHP 5.3. Neste passo é possível também definir qual <em>branch</em> você irá utilizar: <strong><em>Developer Edition</em></strong> ou <strong><em>Community Edition (CE)</em></strong>.</p>
<p>Para Linux, o binário funciona apenas com distros <em>Debian-like</em> ou<em> RedHat-like</em>. Para as demais, <del>o choro ainda é livre</del> nada ainda.</p>
<p>Instalação rápida e sem complicações. Após tudo instalado, você poderá controlar o daemon em <em>/etc/init.d/zend-server (start|stop|restart|&#8230;)</em></p>
<p><strong>2. Iniciando&#8230;</strong></p>
<p>Basta acessar: http://server.me:10081 e aguardar o redirect para tela de autenticação do Zend Server.</p>
<p><a href="http://programe.me/wp-content/uploads/2011/08/zs-login.png"><img class="aligncenter size-medium wp-image-783" title="Zend Server 5 - Auth Login page" src="http://programe.me/wp-content/uploads/2011/08/zs-login-300x235.png" alt="" width="300" height="235" /></a></p>
<p>Após logar, recebe-se o Dashboard que  contém um grande overview (óbvio) de tudo que ele poderá fazer por nós.</p>
<p><a href="http://programe.me/wp-content/uploads/2011/08/zs-dashboard.png"><img class="aligncenter size-medium wp-image-784" title="Zend Server 5 - Dashboard" src="http://programe.me/wp-content/uploads/2011/08/zs-dashboard-300x185.png" alt="" width="300" height="185" /></a></p>
<p>Os destaques são:</p>
<ul>
<li>Gerenciamento de eventos;</li>
<li>Configuração do <em><strong>php.ini</strong></em> ultra-simplificada;</li>
<li>Restart do container (Apache, PHP) na GUI;</li>
<li>Profiler e code backtrace de todas URLs do server;</li>
<li>Logs;</li>
<li>Fila de atividades;</li>
<li>Configuração de cache para conteúdos estáticos (html, css, javascript&#8230;);</li>
<li>Ativação/desativação de módulos facilmente, e;</li>
<li>Integração com Zend Studio para debugging em <em>ambiente de produção.</em></li>
</ul>
<p><strong>Gerenciamento de eventos</strong></p>
<p>Os eventos são completamente configuráveis e estão listados em <em><strong>Rule Management -&gt; Monitoring</strong></em> .<br />
As configurações incluem:</p>
<ul>
<li>Definir os alertas</li>
<li>Definir os critérios (por tempo de carregamento em milésimos de segundo; ou tamanho da página em Kb)</li>
<li>Setar ações (lançar email; salvar code backtrace; registrar apenas..)</li>
</ul>
<div id="attachment_785" class="wp-caption aligncenter" style="width: 310px"><a href="http://programe.me/wp-content/uploads/2011/08/zs-monitoring.png"><img class="size-medium wp-image-785" title="Zend Server 5 - Monitoring" src="http://programe.me/wp-content/uploads/2011/08/zs-monitoring-300x249.png" alt="" width="300" height="249" /></a><p class="wp-caption-text">Zend Server 5 - Monitoring</p></div>
<p>Para acompanhar cada evento, temos pelo dashboard (os últimos) ou diretamente na página dos eventos a listagem completa com data, etc.</p>
<div id="attachment_786" class="wp-caption aligncenter" style="width: 310px"><a href="http://programe.me/wp-content/uploads/2011/08/zs-monitoring-details.png"><img class="size-medium wp-image-786" title="Zend Server 5 - Monitoring details page" src="http://programe.me/wp-content/uploads/2011/08/zs-monitoring-details-300x112.png" alt="" width="300" height="112" /></a><p class="wp-caption-text">Zend Server 5 - Monitoring details page</p></div>
<p>Ao clicar em show code tracing uma nova janela é aberta exibindo o trace da aplicação com várias opções de filtragem (mais do que no próprio Zend Studio na aba Profile).</p>
<div id="attachment_787" class="wp-caption aligncenter" style="width: 310px"><a href="http://programe.me/wp-content/uploads/2011/08/zs-monitoring-popup.png"><img class="size-medium wp-image-787" title="Zend Server 5 - Code tracing popup" src="http://programe.me/wp-content/uploads/2011/08/zs-monitoring-popup-300x195.png" alt="" width="300" height="195" /></a><p class="wp-caption-text">Zend Server 5 - Code tracing popup</p></div>
<p><strong>Configuração do php.ini</strong></p>
<p>Todas as configurações do php.ini ficam em <em><strong>Server Setup -&gt; directives</strong></em>.</p>
<p>Basta editar o campo desejado, salvar e depois reiniciar o webserver para recarregar com as novas configurações. Tudo graficamente !</p>
<div id="attachment_788" class="wp-caption aligncenter" style="width: 310px"><a href="http://programe.me/wp-content/uploads/2011/08/zs-phpini.png"><img class="size-medium wp-image-788" title="Zend Server 5 - PHP.ini directives setup" src="http://programe.me/wp-content/uploads/2011/08/zs-phpini-300x209.png" alt="" width="300" height="209" /></a><p class="wp-caption-text">Zend Server 5 - PHP.ini directives setup</p></div>
<p><strong>Integração com Zend Studio para debug</strong></p>
<p>Aqui não há muito segredo. O Zend Server vem com o Zend Debugger configurado e pronto para uso. O mesmo debugger que também já está facilitado o acesso pelo Zend Studio. A única coisa pendente é liberar acesso remoto do Zend Studio na sua rede no seu Zend Server remoto e voilà.</p>
<p>As configurações de liberação de acesso estão em <em><strong>Server Setup -&gt; debugger</strong></em>. Basta adicionar o IP/range e salvar.</p>
<p><strong>Resumo</strong></p>
<p>Facilidades por todos lugares com o Zend Server 5. Como de praxe, a Zend enfia a faca nos preços, acredito eu que poderia ser mais acessível, assim, mais empresas &#8211; aqui incluem-se os freelas &#8211; teriam como pagar tranquilamente pela ferramenta, gerando mais receita à Zend.</p>
<p>O ponto alto da ferramenta é realmente o Code Trace e facilidade nas configurações e eventos do sistema em produção. Aliado ao Zend Studio, fica ainda melhor !</p>
<p><strong>Extra: Zend Server @ Amazon EC2</strong></p>
<p>A Zend disponibiliza uma <a href="http://www.zend.com/en/products/server/amazon/" target="_blank">ISO Linux já com o Zend Server totalmente configurado no serviço de cloud da Amazon Elastic Compute Cloud</a> na modalidade<em> &#8220;small&#8221;</em>. Essa instância <em>Small</em> da Amazon custaria no mínimo 60 dólares/mês rodando diariamente sem adicionais (disco, dns, etc). <em>*A Zend dá a licença gratuitamente quando utilizado na Amazon. </em></p>
<p>Deixei rodando em teste por dois dias e me custou 9 dolares. Cancelei e montei eu mesmo o Zend Server sob uma ISO Linux padrão na Amazon EC2, porém com uma instância &#8220;micro&#8221; que dada restrições, é gratuita. E mesmo que eu venha a pagar por mais disco ou núcleo de proc, será MUITO menos do que 60 dólares. Acredito que fique mais em conta do que uma VPS com 512MB de ram.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/zend-server-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Traits em PHP &#8211; herança horizontal</title>
		<link>http://programe.me/traits-em-php-heranca-horizontal/</link>
		<comments>http://programe.me/traits-em-php-heranca-horizontal/#comments</comments>
		<pubDate>Sat, 02 Apr 2011 13:08:00 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[herença]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=740</guid>
		<description><![CDATA[Antevejo que no futuro, o PHP como uma linguagem iterativa e incremental que é, adicionará ao seu núcleo um recurso muito valioso na categoria orientação à objetos. Antevejo ele, os Traits. E mais, consigo prever que será algo assim: &#60;?php trait Hello { public function ola() { echo "Olá"; } } class Mundo { use [...]]]></description>
			<content:encoded><![CDATA[<p>Antevejo que no futuro, o PHP como uma linguagem iterativa e incremental que é, adicionará ao seu núcleo um recurso muito valioso na categoria orientação à objetos.</p>
<p>Antevejo ele, os <a href="http://en.wikipedia.org/wiki/Traits" target="_blank">Traits</a>. E mais, consigo prever que será algo assim:</p>
<pre>&lt;?php
trait Hello {
 public function ola() {
   echo "Olá";
 }
}

class Mundo {
 use Hello;

 public function world() {
   echo "{$this-&gt;ola()} trait !";
  }
}

$ola = new Mundo();
$ola-&gt;world();
// Olá trait !</pre>
<p>Ok, não sou bidu. Realmente os Traits estão na lista do possível-futuro PHP 5.4 e eu, baixei a build de 31/03/2011 para testar.</p>
<p><strong>Traits</strong></p>
<p>O PHP não suporta herença multipla &#8211; amém &#8211; e por este motivo, às vezes ficamos limitados em algumas decisões de projeto (design). O maior problema neste ponto é que toda herença até agora (PHP 5.3.x) é vertical, ou seja, se eu precisar de um nível de abstração diferente no meio do processo, ou precisarei adicionar a nova abstração e reescrever tudo abaixo dela, ou ainda, terei que duplicar o código pois não conseguirei satisfazer a herença.</p>
<p>É nesse ponto que os Traits aparecem. Diferentemente da herença (vertical), os Traits possibilitam-nos criar herenças horizontais.</p>
<p>Exemplo, dada a necessidade:  haverão Funcionários, Supervisores, Gestores e Diretores no sistema e estes possui em comum o fato de receber salário. <span style="text-decoration: line-through;">(capitalismo)</span>. Uma possibilidade seria:</p>
<pre>Pessoa &gt; Funcionario
Pessoa &gt; Supervisores
Pessoa &gt; Gestores
Pessoa &gt; Diretores</pre>
<p>Tudo perfeito. Porém, chega outra necessidade: Gestores e Diretores tem a capacidade de demitir. Gestores precisam gerenciar cronogramas, assim como os Supervisores fazem.</p>
<p><strong><em>Pessoa.demitir(pessoa)</em></strong> não faz sentido, pois afetiria todos.<br />
<em><strong>Gestor.demitir(pessoa)</strong></em> e <strong><em>Diretor.demitir(pessoa)</em></strong> atende, mas <a href="http://en.wikipedia.org/wiki/DRY" target="_blank">duplicaria o código</a>.</p>
<pre>Pessoa &gt; Supervisor &gt; Gestor
Pessoa &gt; Diretor</pre>
<p>Shi, apareceu outro nível hierarquico. Traits auxilia exatamente neste ponto ! Vejamos:</p>
<pre>Trait Cronograma
Trait Evil (que contém recursos para demitir uma pessoa)
Pessoa &gt; Funcionario
Pessoa &gt; Supervisor : Cronograma
Pessoa &gt; Gestor : Cronograma : Evil
Pessoa &gt;  Diretor : Evil</pre>
<p>Note que o<strong><em> Pessoa &gt; Supervisor : Cronograma</em></strong> &#8211; os dois pontos para indicar o Trait são de minha autoria &#8211; era o <em><strong>Pessoa &gt; Supervisor</strong></em> antigo. Isso porque as atribuições para gerenciar cronogramas foram passadas para o Trait.</p>
<p>Neste pequeno exemplo, o Trait nos auxiliou com um problema de domínio. Acredito que ele também aplique-se e muito bem para problemas onde temos domínios transversais, pois, nele ficariam as atividades do outro domínio pode o domínio principal teria acesso aos recursos sem quebrar a SRP.</p>
<p><strong>Traits em PHP</strong></p>
<p>Como disse no começo, o futuro-provável PHP 5.4 virá com o Trait. Por enquanto essa implementação funcionaria:</p>
<pre>&lt;?php
trait Cronograma {
 private static $ATRASADO = "sempre";

 public function cobrarDe(Pessoa $funcionario) {
   $funcionario-&gt;definirPressao(self::$ATRASADO);
   $this-&gt;youTube();
 }

 private function youTube() {

 }
}

class Funcionario extends Pessoa {
}

class Supervisor extends Pessoa {
 use Cronograma;
}

$colaborador = new Funcionario();
$controlador = new Supervisor();
$controlador-&gt;cobrarDe($colaborador);</pre>
<p>Os Traits possuem boas capacidades com métodos de instância e estáticos. Vamos explorar um pouco mais:</p>
<pre>&lt;?php
trait Hello {
 public function sayHello() {
   echo "Olá";
 }
}

trait World {
 public function sayWorld() {
   echo "Mundo";
 }
}

class View {
 use Hello, World;
}

$view = new View();
$view-&gt;sayHello();
$view-&gt;sayWorld();
// exibe: Olá Mundo</pre>
<p>Pegando informações da Classe</p>
<pre>&lt;?php
trait QuemSou {
 public function eu() {
   return get_class($this);
 }
}

class Foo {
 use QuemSou;
}

$foo = new Foo();
echo $foo-&gt;eu();
// exibe: Foo</pre>
<p>Usando Variáveis de instância da classe</p>
<pre>&lt;?php
trait World {
 public function help() {
   return "{$this-&gt;hello} world";
 }
}

class Hello {
 private $hello = "Hello";
 use World;
}

$hello = new Hello();
echo $hello-&gt;help();
// exibe: Hello world</pre>
<p>Modificadores de acesso dos traits na classe</p>
<pre>&lt;?php
trait Hello {
 public function ola() {
   echo "Olá mundo";
 }
}

class Modificadores {
 use Hello { ola as private };
}

$ola = new Modificadores();
$ola-&gt;ola();
// Fatal Error....</pre>
<p>Modificadores de acesso com alias para nome de método</p>
<pre>&lt;?php
trait Hello {
 private function ola() {
   echo "Olá mundo";
 }
}

class Modificadores {
 use Hello { ola as public aloha };
}

$ola = new Modificadores();
$ola-&gt;aloha();
// Olá mundo</pre>
<p>Há outros vários recursos como métodos abstratos nos Traits, precedência, métodos estáticos, late static bindings, métodos mágicos, alias para nome de método do Trait ao usá-lo na classe. Para Rubistas ou Scalistas (?) as possibilidades são as mesmas dos Mixins e Traits de Ruby e Scala respectivamente.</p>
<ul>
<li><a href="http://wiki.php.net/rfc/horizontalreuse" target="_blank">RFC do PHP Trait</a> <em>(offline por enquanto devido a problemas no servidor deles)</em></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/traits-em-php-heranca-horizontal/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Review: PHPUnit &#8211; Pocket Guide</title>
		<link>http://programe.me/review-phpunit-pocket-guide/</link>
		<comments>http://programe.me/review-phpunit-pocket-guide/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 22:55:14 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=710</guid>
		<description><![CDATA[Comprei a versão .mobi na O&#8217;reilly naquelas promoções diárias por US$ 9,90 e não me arrependi. ﻿ O pequeno livro de Sebastian Bergmann, autor do PHPUnit, começa falando sobre  o que é e para que servem os &#8220;testes automatizados&#8221; com um texto bem didático explicando tin-tin por tin-tin. Na sequência, ele apresenta sua ferramenta que [...]]]></description>
			<content:encoded><![CDATA[<p>Comprei a versão .mobi na O&#8217;reilly naquelas promoções diárias por US$ 9,90 e não me arrependi.</p>
<p>﻿<a href="http://www.hlegius.pro.br/wp-content/uploads/2011/02/22203447611.jpg"><img class="aligncenter size-full wp-image-714" title="22203447611" src="http://www.hlegius.pro.br/wp-content/uploads/2011/02/22203447611.jpg" alt="" width="304" height="500" /></a></p>
<p>O pequeno livro de <a href="http://sebastian-bergmann.de/" target="_blank">Sebastian Bergmann</a>, autor do <a href="http://www.phpunit.de" target="_blank">PHPUnit</a>, começa falando sobre  o que é e para que servem os &#8220;testes automatizados&#8221; com um texto bem didático explicando <em>tin-tin por tin-tin</em>. Na sequência, ele apresenta sua ferramenta que resolve o problema apresentado no capítulo 2 e inicia-se alguns how-to com troubleshooting da instalação do PHPUnit em seu ambiente de desenvolvimento ou homologação.</p>
<p>Após instalado, Sebastian fala rapidamente sobre como criar e rodar um simples caso de teste com PHPUnit e no capítulo seguinte, ele faz a abordagem dos <em><a href="http://en.wikipedia.org/wiki/Test_fixture" target="_blank">Fixtures</a>, </em>algo que em meu ponto de vista foi a melhor coisa que ele inseriu no livro. Motivos não faltam:</p>
<ul>
<li>Cedo ou tarde, desenvolvedores perguntam como manter um pré-estado no database para rodar a suite de teste;</li>
<li>Afoitos por testar, muitos iniciantes não leem sobre esse excelente recurso disponível para a maioria &#8211; qualquer eu diria &#8211; xUnit;</li>
<li>Fixtures é uma mão na roda;</li>
<li>Fixtures são pré-requisitos para <a href="http://jenkins-ci.org/" target="_blank">testes automatizados</a> de verdade, quando há necessidade de utilizar dados persistidos, obviamente.</li>
</ul>
<p>No capítulo 7 é explicado como validar Exceptions do domínio da aplicação de forma legível e de quebra mostra que o PHPUnit também pode realizar testes de performances perfeitamente.</p>
<p>Outro capítulo que eu gostei de ler, o nono, explica sobre o Test-First Programming e lá ele dá algumas dicas valiosas para quem está iniciando neste mundo.</p>
<p>Ele aborda como o PHPUnit faz <em>Code Coverage</em> do software testado e dedica um capítulo inteiro para falar sobre Stubs e boas práticas/funções de um caso/suíte de teste.</p>
<p>Para finalizar, ele explica como integrar PHPUnit com <a href="http://phing.info" target="_blank">Phing</a> &#8211; na real fica super na cara que rola igualmente com <a href="http://ant.apache.org" target="_blank">Ant</a> &#8211; o qual eu utilizo atualmente com Jenkins e PHPUnit &#8211; e fecha o pocket book explorando e explicando sobre os internals do PHPUnit e sobre como evoluir seus test-case à partir de uma classe base da framework de teste.</p>
<p>É um livro pequeno e de grande valia. Excelente referência para desmistificar algumas sombras que ficam ao trabalhar com PHPUnit. Valeu os quase dez dolares pagos por ele.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/review-phpunit-pocket-guide/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Um ano depois&#8230;</title>
		<link>http://programe.me/um-ano-depois/</link>
		<comments>http://programe.me/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[hlegius]]></category>
		<category><![CDATA[PHP]]></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 algumas [...]]]></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://programe.me/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://programe.me/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://programe.me/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://programe.me/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://programe.me/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://programe.me/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://programe.me/php-e-seus-pseudo-padroes-para-nomeclatura-de-classe/</link>
		<comments>http://programe.me/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 [...]]]></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://programe.me/php-e-seus-pseudo-padroes-para-nomeclatura-de-classe/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Twig &#8211; Uma outra engine de templates em PHP</title>
		<link>http://programe.me/twig-uma-outra-engine-de-templates-em-php/</link>
		<comments>http://programe.me/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[hlegius]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software livre]]></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 [...]]]></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://programe.me/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://programe.me/twig-uma-outra-engine-de-templates-em-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Eu uso estático porque é mais rápido.</title>
		<link>http://programe.me/eu-uso-estatico-porque-e-mais-rapido/</link>
		<comments>http://programe.me/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() { $i [...]]]></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://programe.me/eu-uso-estatico-porque-e-mais-rapido/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Configurando o Zend Debugger</title>
		<link>http://programe.me/configurando-o-zend-debugger/</link>
		<comments>http://programe.me/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 [...]]]></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://programe.me/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://programe.me/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://programe.me/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://programe.me/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://programe.me/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://programe.me/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://programe.me/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://programe.me/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://programe.me/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://programe.me/configurando-o-zend-debugger/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

