<?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>PHP Jedi</title>
	<atom:link href="http://www.phpjedi.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phpjedi.com.br</link>
	<description>Que o PHP esteja com você!</description>
	<lastBuildDate>Wed, 07 Sep 2011 07:32:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>O que o PHP não tem (e que nunca terá)</title>
		<link>http://www.phpjedi.com.br/2011/01/o-que-o-php-nao-tem-e-que-nunca-tera/</link>
		<comments>http://www.phpjedi.com.br/2011/01/o-que-o-php-nao-tem-e-que-nunca-tera/#comments</comments>
		<pubDate>Sat, 29 Jan 2011 15:48:40 +0000</pubDate>
		<dc:creator>Ariel Patschiki</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[funcionalidade]]></category>

		<guid isPermaLink="false">http://www.phpjedi.com.br/?p=133</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<div class="pni-navigtion"><a name="pni-top0"></a><ol><li><a href="#o-php-nunca-ter-ao-menos-por-um-bom-tempo-do-seguinte">O PHP nunca terá, ao menos por um bom tempo, do seguinte:</a><ol><li><a href="#threads-reais">Threads Reais</a></li><li><a href="#um-core-pequeno">Um core pequeno</a></li><li><a href="#argumentos-com-nomes-parmetros-de-mtodosfunes-e-tipos-mistos">Argumentos com nomes parâmetros de métodos/funções e tipos mistos</a></li><li><a href="#consistncia-em-nomes-de-funesclasses-e-vrias-funes-inteis">Consistência em nomes de funções/classes e várias funções inúteis</a></li><li><a href="#classes-de-tipos-bsicos-de-alto-nvel">Classes de tipos básicos de alto nível</a></li><li><a href="#tipagem-forte">Tipagem forte</a></li></ol></li><li><a href="#referncias">Referências</a></li></ol></div><div class="pni-content"></p>
<h3><a name="o-php-nunca-ter-ao-menos-por-um-bom-tempo-do-seguinte"></a>O PHP nunca terá, ao menos por um bom tempo, do seguinte:<a href="#pni-top0" class="toplink">^</a></h3>
<h4><a name="threads-reais"></a>Threads Reais<a href="#pni-top0" class="toplink">^</a></h4>
<p>Na Web, como a aplicação PHP (o PHP em si fica) não fica na memória é muito difícil implementar threads de verdade. Existe algumas soluções paleativas, como a extensão <a href="http://www.php.net/manual/pt_BR/intro.pcntl.php">PCNTL</a>. Porém não são threads reais.</p>
<h4><a name="um-core-pequeno"></a>Um core pequeno<a href="#pni-top0" class="toplink">^</a></h4>
<p>O PHP compilado, com algumas extensões, pode ter dezenas de Megabytes de tamanho em disco. Muito mais do que o Python e o Ruby</p>
<h4><a name="argumentos-com-nomes-parmetros-de-mtodosfunes-e-tipos-mistos"></a>Argumentos com nomes parâmetros de métodos/funções e tipos mistos<a href="#pni-top0" class="toplink">^</a></h4>
<p>Em PHP, não é possível nomear parâmetros de métodos e funções nem utilizar tipos mistos. Em um PHP ideal, uma classe poderia ser assim:</p>
<div class="geshi no php">
<div class="head">class carro {</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> andar<span class="br0">&#40;</span><span class="re1">$aceleracao</span><span class="sy0">,</span> <span class="re1">$direcao</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> andar<span class="br0">&#40;</span><span class="re1">$aceleracao</span><span class="sy0">,</span> <span class="re1">$marcha</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$carro</span> <span class="sy0">=</span> <span class="kw2">new</span> carro<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$carro</span><span class="sy0">-&gt;</span><span class="me1">andar</span><span class="br0">&#40;</span><span class="re1">$aceleracao</span> <span class="sy0">=</span> <span class="nu0">0.2</span><span class="sy0">,</span> <span class="re1">$marcha</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$carro</span><span class="sy0">-&gt;</span><span class="me1">andar</span><span class="br0">&#40;</span><span class="re1">$aceleracao</span> <span class="sy0">=</span> <span class="nu0">0.3</span><span class="sy0">,</span> <span class="re1">$direcao</span> <span class="sy0">=</span> <span class="st0">&quot;ré&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<h4><a name="consistncia-em-nomes-de-funesclasses-e-vrias-funes-inteis"></a>Consistência em nomes de funções/classes e várias funções inúteis<a href="#pni-top0" class="toplink">^</a></h4>
<p>É fato conhecido de qualquer programador PHP que não há muita padronização entre nomes de funções. E vai demorar muito para que elas seja depreciadas.</p>
<p>Além disso, há várias funções inúteis que poderiam ser comprimidas em uma boa:</p>
<p>Para ordenar, no PHP: sort(), arsort(), asort(), ksort(), natsort(), natcasesort(), rsort(), usort(), array_multisort(), e uksort(), etc.</p>
<p>No Python: list.sort()</p>
<h4><a name="classes-de-tipos-bsicos-de-alto-nvel"></a>Classes de tipos básicos de alto nível<a href="#pni-top0" class="toplink">^</a></h4>
<p>É muito mais fácil fazer (e ler) assim (num PHP ideal):</p>
<div class="geshi no php">
<div class="head">$string = &#8220;PHP Jedi&#8221;;</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="re1">$string</span><span class="sy0">-&gt;</span><span class="me1">trim</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">substr</span><span class="br0">&#40;</span><span class="nu0">-1</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">str_replace</span><span class="br0">&#40;</span><span class="st0">&#39;PHP&#39;</span><span class="sy0">,</span> <span class="st0">&#39;Ruby&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>do que assim (atualmente):</p>
<div class="geshi no php">
<div class="head">$string = &#8220;PHP Jedi&#8221;;</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st0">&#39;PHP&#39;</span><span class="sy0">,</span> <span class="st0">&#39;Ruby&#39;</span><span class="sy0">,</span> <span class="kw3">substr</span><span class="br0">&#40;</span><span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$string</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Além da vantagem óbvia de poder especializar os tipos básicos.</p>
<h4><a name="tipagem-forte"></a>Tipagem forte<a href="#pni-top0" class="toplink">^</a></h4>
<p>Como discutido no artigo neste blog, <a href="http://www.phpjedi.com.br/2010/08/tipagem-forte-em-php/">Tipagem Forte em PHP</a>, o PHP tem algumas maneiras de lidar com a falta de tipagem. Porém como não são escritas no core da linguagem, carecem de estabilidade, versatilidade e padronização. Seria feliz se o PHP disparasse um error ou uma exception no seguinte trecho de código:</p>
<div class="geshi no php">
<div class="head">$string = &#8220;1&#8243;;</div>
<ol>
<li class="li1">
<div class="de1"><span class="re1">$string</span><span class="sy0">++;</span></div>
</li>
</ol>
</div>
<h3><a name="referncias"></a>Referências<a href="#pni-top0" class="toplink">^</a></h3>
<ul>
<li><a href="http://wiki.python.org/moin/PythonVsPhp">http://wiki.python.org/moin/PythonVsPhp</a></li>
<li><a href="http://www.bitcetera.com/en/techblog/2009/04/07/10-reasons-why-php-is-still-better-than-ruby--/">http://www.bitcetera.com/en/techblog/2009/04/07/10-reasons-why-php-is-still-better-than-ruby&#8211;/</a></li>
<li><a href="http://andyjeffries.co.uk/articles/4-reasons-why-ruby-syntax-is-better-than-phps%2D">http://andyjeffries.co.uk/articles/4-reasons-why-ruby-syntax-is-better-than-phps%2D</a></li>
<li><a href="http://en.wikipedia.org/wiki/Thread_%28computer_science%29">http://en.wikipedia.org/wiki/Thread_%28computer_science%29</a></li>
<li><a href="http://blog.roshambo.org/20-possible-reasons-why-php-function-names-and-parameters-are-weird/">http://blog.roshambo.org/20-possible-reasons-why-php-function-names-and-parameters-are-weird/</a></li>
<li><a href="http://toykeeper.net/soapbox/php_problems/">http://toykeeper.net/soapbox/php_problems/</a></li>
</ul>
<p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpjedi.com.br/2011/01/o-que-o-php-nao-tem-e-que-nunca-tera/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Backup em CakePHP</title>
		<link>http://www.phpjedi.com.br/2010/11/backup-em-cakephp/</link>
		<comments>http://www.phpjedi.com.br/2010/11/backup-em-cakephp/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 18:29:50 +0000</pubDate>
		<dc:creator>Ariel Patschiki</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[básico]]></category>
		<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://www.phpjedi.com.br/?p=124</guid>
		<description><![CDATA[O que é? Desenvolvi um plugin do CakePHP que permite fazer backups de banco de dados, como MySQL, PostgreSQL, SQL Server e outras, sem utilizar ferramentas externas, como mysqldump. Especiamente útil em hospedagens compartilhadas que não permitem executar comandos. Se você tiver a extensão php ZipArchive, o plugin ainda compacta o .sql gerado. Como Instalar [...]]]></description>
			<content:encoded><![CDATA[<h2>O que é?</h2>
<p>Desenvolvi um plugin do <a href="http://cakephp.org/">CakePHP</a> que permite fazer backups de banco de dados, como MySQL, PostgreSQL, SQL Server e outras, sem utilizar ferramentas externas, como mysqldump.<br />
Especiamente útil em hospedagens compartilhadas que não permitem executar comandos.<br />
Se você tiver a extensão php <a href="http://php.net/manual/en/book.zip.php">ZipArchive</a>, o plugin ainda compacta o .sql gerado.</p>
<h2>Como Instalar</h2>
<p>Baixe o plugin no GitHub: <a href="http://github.com/mobvox/Cake-Database-Backup">http://github.com/mobvox/Cake-Database-Backup</a> e copie para sua pasta de plugins.</p>
<h2>Como Usar</h2>
<h3>Manualmente, no console</h3>
<p>No Console, digite:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">$ cake backup</div>
</li>
</ol>
</div>
<h3>No CRON</h3>
<p>Adicione o seguinte comando na entrada CRON:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">/</span>seu<span class="sy0">-</span>diretorio<span class="sy0">/</span>cakephp<span class="sy0">/</span>cake<span class="sy0">/</span>console<span class="sy0">/</span>cake <span class="sy0">-</span>app <span class="st0">&quot;/seu-diretorio/aplicacao&quot;</span> backup</div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpjedi.com.br/2010/11/backup-em-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aplicações Desktop em PHP: WinBinder versus PHP-GTK</title>
		<link>http://www.phpjedi.com.br/2010/10/aplicacoes-desktop-em-php-winbinder-versus-php-gtk/</link>
		<comments>http://www.phpjedi.com.br/2010/10/aplicacoes-desktop-em-php-winbinder-versus-php-gtk/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 19:53:56 +0000</pubDate>
		<dc:creator>Ariel Patschiki</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[comparativo]]></category>

		<guid isPermaLink="false">http://www.phpjedi.com.br/?p=110</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<div class="pni-navigtion"><a name="pni-top1"></a><ol><li><a href="#introduo">Introdução</a></li><li><a href="#o-php-gtk">O PHP-GTK</a></li><li><a href="#o-winbinder">O WinBinder</a></li><li><a href="#concluso">Conclusão</a></li><li><a href="#referncias-1">Referências</a></li></ol></div><div class="pni-content"></p>
<h3><a name="introduo"></a>Introdução<a href="#pni-top1" class="toplink">^</a></h3>
<p>Hoje em dia, são poucos os momentos em que é necessário desenvolver uma aplicação desktop, porém eles existem. Como existem vários desenvolvedores que aprenderam a programar em PHP, para eles desenvolver utilizando uma linguagem que já conhecem reduz a curva de aprendizado do ambiente.<br />
Existem duas boas opções para desenvolver em PHP para desktop: WinBinder e PHP-GTK. Neste post iremos verificar os pontos fracos e fortes das duas</p>
<h3><a name="o-php-gtk"></a>O PHP-GTK<a href="#pni-top1" class="toplink">^</a></h3>
<p>O PHP-GTK é um <em>wrapper</em> para a API do GTK, que é um toolkit de controles GUI (botões, janelas, etc.) muito utilizado no mundo Linux. Existem várias aplicações importantes que utilizam o GTK como: GIMP,  VMware Player, Inkscape, entre outros. O GTK é bastante utilizado no Gnome enquanto o QT é muito utilizado no KDE.</p>
<p>Para &#8220;desenhar&#8221; os controles nas janelas em PHP-GTK, é possível utilizar o Glade. É um software maduro e muito utilizado, que cobre uma gama enorme de opções GUI e possui uma comunidade de apoio muito grande.</p>
<p>No Brasil, o <a href="http://www.dalloglio.net/">Pablo Dall Oglio</a> mantem um site completo sobre PHP-GTK, o <a href="http://www.php-gtk.com.br/">php-gtk.com.br</a>, além de ter publicado um livro sobre o assunto, que está em sua segunda edição.</p>
<p>Exemplo de Código em PHP-GTK:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// Função de CallBack</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> botaoClick<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Olá Mundo!<span class="es0">\n</span>&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Cria a janela e o botão</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$window</span> <span class="sy0">=</span> <span class="kw2">new</span> GtkWindow<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$button</span> <span class="sy0">=</span> <span class="kw2">new</span> GtkButton<span class="br0">&#40;</span><span class="st0">&#39;OK&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Seta as propriedades dos controles</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$window</span><span class="sy0">-&gt;</span><span class="me1">set_title</span><span class="br0">&#40;</span><span class="st0">&#39;Olá Mundo!&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$window</span><span class="sy0">-&gt;</span><span class="me1">connect_simple</span><span class="br0">&#40;</span><span class="st0">&#39;destroy&#39;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;Gtk&#39;</span><span class="sy0">,</span> <span class="st0">&#39;main_quit&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$button</span><span class="sy0">-&gt;</span><span class="me1">connect_simple</span><span class="br0">&#40;</span><span class="st0">&#39;clicked&#39;</span><span class="sy0">,</span> <span class="st0">&#39;botaoClick&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Adiciona o botão à janela e o exibe</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$window</span><span class="sy0">-&gt;</span><span class="me1">add</span><span class="br0">&#40;</span><span class="re1">$button</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$window</span><span class="sy0">-&gt;</span><span class="me1">show_all</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Chama o loop principal</span></div>
</li>
<li class="li1">
<div class="de1">Gtk<span class="sy0">::</span><span class="me2">main</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Vantagens:</p>
<ul>
<li>Multiplataforma: Funciona nos principais Sistemas Operacionais, como Windows, Linux, MacOS, etc.</li>
<li>Glade: Ferramenta GUI madura e eficiente.</li>
</ul>
<p>Desvantagens:</p>
<ul>
<li><em>Footprint</em> muito grande, cerca de 8MB.</li>
</ul>
<h3><a name="o-winbinder"></a>O WinBinder<a href="#pni-top1" class="toplink">^</a></h3>
<p>O WinBinder é um <em>wrapper</em> para a API de controles nativos do Windows. Aplicativos desenvolvidos com ele chamam nativamente as DLLs do windows para desenhar os controles da tela. Implementa o conceito de Mensagens do Windows, tornando a vida de um ex-programador de baixo nível para Windows mais fácil.</p>
<p>Para &#8220;desenhar&#8221; os controles na tela, é possível utilizar a ferramenta própria do WinBinder ou a ferramenta do WinAsm. Ambas são limitadas e com alguns erros.</p>
<p>Exemplo de Código em WinBinder:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$mainwin</span> <span class="sy0">=</span> wb_create_window<span class="br0">&#40;</span><span class="kw2">NULL</span><span class="sy0">,</span> AppWindow<span class="sy0">,</span> <span class="st0">&quot;Five steps&quot;</span><span class="sy0">,</span> <span class="nu0">320</span><span class="sy0">,</span> <span class="nu0">240</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">wb_create_control<span class="br0">&#40;</span><span class="re1">$mainwin</span><span class="sy0">,</span> PushButton<span class="sy0">,</span> <span class="st0">&quot;Button 1&quot;</span><span class="sy0">,</span> &nbsp;<span class="nu0">50</span><span class="sy0">,</span> <span class="nu0">70</span><span class="sy0">,</span> <span class="nu0">80</span><span class="sy0">,</span> <span class="nu0">22</span><span class="sy0">,</span> &nbsp; &nbsp; <span class="nu0">101</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">wb_create_control<span class="br0">&#40;</span><span class="re1">$mainwin</span><span class="sy0">,</span> PushButton<span class="sy0">,</span> <span class="st0">&quot;Button 2&quot;</span><span class="sy0">,</span> <span class="nu0">180</span><span class="sy0">,</span> <span class="nu0">70</span><span class="sy0">,</span> <span class="nu0">80</span><span class="sy0">,</span> <span class="nu0">22</span><span class="sy0">,</span> &nbsp; &nbsp; <span class="nu0">102</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">wb_set_handler<span class="br0">&#40;</span><span class="re1">$mainwin</span><span class="sy0">,</span> <span class="st0">&quot;process_main&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">wb_main_loop<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> process_main<span class="br0">&#40;</span><span class="re1">$window</span><span class="sy0">,</span> <span class="re1">$id</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">switch</span><span class="br0">&#40;</span><span class="re1">$id</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="nu0">101</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="nu0">102</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wb_message_box<span class="br0">&#40;</span><span class="re1">$window</span><span class="sy0">,</span> <span class="st0">&quot;Button #$id was pressed.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> IDCLOSE<span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wb_destroy_window<span class="br0">&#40;</span><span class="re1">$window</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>﻿Vantagens:</p>
<ul>
<li>Reaproveitamento de código GUI, pois utiliza os controles nativos do Windows</li>
<li>Alta performace comparado ao PHP-GTK pois tem uma camada a menos</li>
<li><em>Footprint</em> pequeno, cerca de 700k</li>
<li>Menor curva de aprendizado para quem já programou em baixo nível para Windows.</li>
</ul>
<p>Desvantagens:﻿﻿</p>
<ul>
<li>Funciona somente em Windows</li>
<li>Não possui uma ferramenta GUI madura</li>
</ul>
<h3><a name="concluso"></a>Conclusão<a href="#pni-top1" class="toplink">^</a></h3>
<p>Quando for desenvolver alguma aplicação desktop utilizando PHP, sugiro concentrar os esforços nessas duas ferramentas. Se você já desenvolve em GTK, utilizando C ou Python, com certeza o PHP-GTK vai ser mais indicado para você. Porém se já desenvolveu em Visual C++, por exemplo, o WinBinder será mais familiar.</p>
<p>Além disso um pondo forte do WinBinder, que é um pequeno <em>footprint</em> &#8211; 700k, pode ser critério de decisão, pois facilita a distribuição do aplicativo.</p>
<p>Para aplicativos complexos, sem dúvida o PHP-GTK é mais maduro, pois tem mais controles e é utilizado amplamente por uma série de aplicativos no mercado. Além de ter uma comunidade maior.</p>
<p>É natural também dizer que não é aconcelhável o uso de nenhuma dessas tecnologias para desenvolvimento de aplicações complexas, restando o uso para casos específicos e/ou reutilização de código PHP existente.</p>
<h3><a name="referncias-1"></a>Referências<a href="#pni-top1" class="toplink">^</a></h3>
<ul>
<li><a href="http://gtk.php.net/">http://gtk.php.net/</a></li>
<li><a href="http://www.php-gtk.com.br/">http://www.php-gtk.com.br/</a></li>
</ul>
<p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpjedi.com.br/2010/10/aplicacoes-desktop-em-php-winbinder-versus-php-gtk/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Codificação de Caracteres &#8211; ISO-8859-1 versus UTF8</title>
		<link>http://www.phpjedi.com.br/2010/10/codificacao-de-caracteres-iso-8859-1-versus-utf8/</link>
		<comments>http://www.phpjedi.com.br/2010/10/codificacao-de-caracteres-iso-8859-1-versus-utf8/#comments</comments>
		<pubDate>Tue, 05 Oct 2010 20:55:24 +0000</pubDate>
		<dc:creator>Ariel Patschiki</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[básico]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.phpjedi.com.br/?p=102</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<div class="pni-navigtion"><a name="pni-top2"></a><ol><li><a href="#introduo-1">Introdução</a></li><li><a href="#a-tabela-ascii">A Tabela ASCII</a></li><li><a href="#unicode">Unicode</a></li><li><a href="#por-que-usar-utf-8">Por que usar UTF-8?</a></li><li><a href="#como-usar-utf-8-codificaes-de-caracteres-no-dia-a-dia">Como usar UTF-8 codificações de caracteres no dia-a-dia?</a><ol><li><a href="#como-usar-utf-8-nos-arquivos-php-html-css-js-etc">Como usar UTF-8 nos arquivos (php, html, css, js, etc.)</a></li><li><a href="#como-usar-utf-8-no-banco-de-dados">Como usar UTF-8 no banco de dados</a></li><li><a href="#como-usar-utf-8-na-conexo-com-o-banco-de-dados">Como usar UTF-8 na conexão com o banco de dados</a></li><li><a href="#como-usar-utf-8-no-cabealho-http">Como usar UTF-8 no cabeçalho HTTP</a></li><li><a href="#como-usar-utf-8-no-xml-incluindo-xhtml">Como usar UTF-8 no XML (Incluindo XHTML)</a></li><li><a href="#como-usar-utf-8-no-html">Como usar UTF-8 no HTML</a></li><li><a href="#como-usar-utf-8-em-requisies-ajax">Como usar UTF-8 em requisições Ajax</a></li><li><a href="#como-usar-utf-8-na-hora-de-converter-de-uma-codificao-para-outra">Como usar UTF-8 na hora de converter de uma codificação para outra:</a></li><li><a href="#como-usar-utf-8-nas-funes-de-string">Como usar UTF-8 nas funções de string:</a></li></ol></li><li><a href="#concluso-1">Conclusão</a></li><li><a href="#fontes-e-referncias">Fontes e referências</a></li></ol></div><div class="pni-content"></p>
<h3><a name="introduo-1"></a>Introdução<a href="#pni-top2" class="toplink">^</a></h3>
<p>Segundo a Wikipédia, &#8220;Uma codificação de caracteres é um padrão de relacionamento entre um conjunto de caracteres&#8221;.</p>
<p>No nosso mundo existem milhares de caracteres em centenas de idiomas e variações e ainda outros milhares de símbolos que podem ser utilizados em fontes de computador para serem exibidas, salvas e transportadas. As tabelas de caracteres surgiram para transformar os nossos caracteres em bits que podem ser armazenados. A primeira tabela surgiu nos EUA e é chamada Tabela ASCII.</p>
<h3><a name="a-tabela-ascii"></a>A Tabela ASCII<a href="#pni-top2" class="toplink">^</a></h3>
<p>Em computadores temos bits que geram bytes. Porém para um byte (ou mais) gerar um caracter, é necessário ter uma tabela de equivalência. Em 1963 a American Standards Association (Associação de Padrões Americanos) criou uma tabela de caracteres chamada ASCII, que é utilizada até os dias de hoje. A ASCII utilizava inicialmente um conjunto de 7 bits (27 = 128 caracteres). Para a língua inglesa os caracteres da tabela ASCII são suficientes para exibir todas as palavras, simbolos e textos possíveis. Porém para outros idiomas, como por exemplo latinos &#8211; que contém acentos, são necessários diferentes caracteres, a tabela ASCII não tem serventia completa. Para isso criou-se uma versão estendida da ASCII, utilizando 8 bits (um byte), possibilitando assim 256 caracteres. Então a ISO (Internation Standarts Organization &#8211; Organização de Padrões Internacionais) criou várias codificações (norma 8859) que são formas diferentes da tabela ASCII estendida (8 bits) para suprir as necessidades de vários países e idiomas de exibir seus símbolos. Ao todo existem 16 variações da codificação ISO-8859. A mais utilizada é a ISO-8859-1, chamada também de Latin-1, que é direcionada para a maioria dos idiomas europeus ocidentais. A ISO-8859-1 também a é mais utilizada no Brasil.</p>
<p>Para entender a diferença entre um arquivo texto em uma codificação e outra vamos exemplificar: A sequência de bits &#8220;11100100&#8243; que representa o número hexadecimal &#8220;0xE4&#8243; e o decimal &#8220;228&#8243; corresponde ao caractere &#8220;ä&#8221; da tabela ISO-8859-1 (Latina) e ao caractere &#8220;ф&#8221; da ISO-8859-5 (Grega). Se um arquivo em uma codificação for aberto utilizando uma outra, os caracteres concorrentes do 128 ao 255 poderão ser interpretados de forma diferente, porém o caracter 0 ao 127 nas tabelas ISO serão interpretados de forma igual, pois correspondem à tabela ASCII de 7 bits.</p>
<h3><a name="unicode"></a>Unicode<a href="#pni-top2" class="toplink">^</a></h3>
<p>As codificações diferentes serviram ao propósito de saciar as necessidades dos diferentes países e idioma, porém existem limitações nesse modelo. Essas limitações com a internet se tornam a cada dia mais evidentes. Por exemplo: Se eu tenho uma página em HTML usando a codificação ISO-8859-1 e preciso exibir caracteres japoneses e latinos ao mesmo tempo? Não consigo (a não ser com entidades, o que é desaconselhavel!). Para resolver tal problema e outros, o Unicode foi criado.</p>
<p>A idéia original foi do Joe Becker da Xerox e do Lee Collins e Mark Davis da Apple em 1989. Porém somente em 1991 foi criado o Unicode consortium &#8211; Consórcio Unicode &#8211; e publicada a primeira versão de um sistema de codificação de caracteres que englobassem todas as palavras de todos os idiomas do mundo inteiro.</p>
<p>Para economizar bytes, somente os caracteres diferentes da tabela ASCII utilizam mais de um byte. Esse sistema de bytes-múltiplos foi adotado pelo padrão UTF que tem como a variação mais conhecida a UTF-8.</p>
<p>Um arquivo codificado em UTF-8 pode exibir todos os caracteres mapeados e propostos pela Unicode, sendo assim resolvendo o problema inicial de exibir caracteres de diferentes idiomas ao mesmo tempo, no mesmo arquivo. A codificação UTF-8 é que tem a maior tendência de utilização hoje em dia. Todos os consórcios, institutos e associações de padrões importantes recomendam o suporte (e a utilização) do UTF-8 para transporte, exibição e armazenamento de caracteres.</p>
<h3><a name="por-que-usar-utf-8"></a>Por que usar UTF-8?<a href="#pni-top2" class="toplink">^</a></h3>
<p>Na vida real, temos que usar UTF-8 nas codificações de arquivos e banco obrigatoriamente nas seguintes situações</p>
<ol>
<li>O sistema/site terá (agora ou no futuro) suporte à múltiplos idiomas;</li>
<li>O sistema/site exibirá conteúdo de outros idiomas, como por exemplo o símbolo de euro (€);</li>
<li>O usuário do sistema/site poderá ser um estrangeiro que possa inserir dados em outras codificações, como por exemplo um turco escrevendo o seu nome em um fórum brasileiro.</li>
</ol>
<p>Para os outros casos não necessariamente precisamos utilizar UTF-8 para codificações, porém é recomendado, devido aos seguintes pontos:</p>
<ol>
<li>Nunca saberemos o futuro do sistema/site, podendo haver múltiplos idiomas ou usuários de outros idiomas no futuro;</li>
<li>Evitar problemas de compatibilidade entre meios diferentes;</li>
<li>É a codificação mais utilizada, é a tendência de utilização e é a recomendação dos grandes nomes da internet;</li>
</ol>
<h3><a name="como-usar-utf-8-codificaes-de-caracteres-no-dia-a-dia"></a>Como usar UTF-8 codificações de caracteres no dia-a-dia?<a href="#pni-top2" class="toplink">^</a></h3>
<h4><a name="como-usar-utf-8-nos-arquivos-php-html-css-js-etc"></a>Como usar UTF-8 nos arquivos (php, html, css, js, etc.)<a href="#pni-top2" class="toplink">^</a></h4>
<p>Todo editor de texto moderno (inclusive o bloco de notas), possui opções para escolher a codificação de caracteres. Consulte a documentação do seu editor para saber como fazer.</p>
<p>É necessário também não gerar os bytes identificadores BOM (Begin Order Mark), que em sistemas nix (Unix, Linux, etc.) o PHP interpreta como texto e envia para a saída, provocando problemas com a utilização de cabeçalhos.</p>
<h4><a name="como-usar-utf-8-no-banco-de-dados"></a>Como usar UTF-8 no banco de dados<a href="#pni-top2" class="toplink">^</a></h4>
<p>Os SGBDs (Sistema Gerenciador de Banco de Dados) mais usados suportam as codificações UTF-8 e ISO-8859-1. Incluindo o MySQL, PostgreSQL, sqlite, MS SQL Server, Oracle. No MySQL por exemplo é possível definir a codificação a nível de banco de dados, esquema, tabela e até campo. Para saber como escolher a codificação, consulte a documentação do front-end utilizado para criar tabelas, etc.</p>
<h4><a name="como-usar-utf-8-na-conexo-com-o-banco-de-dados"></a>Como usar UTF-8 na conexão com o banco de dados<a href="#pni-top2" class="toplink">^</a></h4>
<p>O banco de dados pode estar em uma codificação (ou em várias), porém a entrada e saída das queries serão feitas em uma só codificação que é a de conexão. Selecionar a codificação da conexão é diferente em cada classe/funções de conexão ao banco. Seguem alguns exemplos:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// mysql</span></div>
</li>
<li class="li1">
<div class="de1">mysql_set_charset<span class="br0">&#40;</span><span class="st0">&#39;utf8&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// mysqli</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$conexao</span><span class="sy0">-&gt;</span><span class="me1">set_charset</span><span class="br0">&#40;</span><span class="st0">&quot;utf8&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Ou ainda através de queries (mysql), que servem para classes de abstração que não tem métodos/funções para selecionar a codificação:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">set character_set_results <span class="sy0">=</span> <span class="st0">&#39;utf8&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">set character_set_client <span class="sy0">=</span> <span class="st0">&#39;utf8&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">set character_set_connection <span class="sy0">=</span> <span class="st0">&#39;utf8&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">set character_set_database <span class="sy0">=</span> <span class="st0">&#39;utf8&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">set character_set_server <span class="sy0">=</span> <span class="st0">&#39;utf8&#39;</span></div>
</li>
</ol>
</div>
<h4><a name="como-usar-utf-8-no-cabealho-http"></a>Como usar UTF-8 no cabeçalho HTTP<a href="#pni-top2" class="toplink">^</a></h4>
<p>A maneira mais fácil e compatível para dizer ao navegador qual codificação você está usando é definir o charset no cabeçalho Content-Type.</p>
<p>No PHP, é feito da seguinte maneira:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&#39;Content-type: text/html; charset=utf-8&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Lembrando que todo cabeçalho deve ser enviado antes de qualquer outra informação.</p>
<h4><a name="como-usar-utf-8-no-xml-incluindo-xhtml"></a>Como usar UTF-8 no XML (Incluindo XHTML)<a href="#pni-top2" class="toplink">^</a></h4>
<p>Todo XML deve ter um pseudo-elemento</p>
<h4><a name="como-usar-utf-8-no-html"></a>Como usar UTF-8 no HTML<a href="#pni-top2" class="toplink">^</a></h4>
<p>O MIME Content-type do HTML tem prioridade menor que o do cabeçalho, porém existem situações que não é possível enviar cabeçalhos. Para tal, utilize o atributo content da tag meta. Para evitar problemas o ideal é setar o content-type no header e no html.</p>
<h4><a name="como-usar-utf-8-em-requisies-ajax"></a>Como usar UTF-8 em requisições Ajax<a href="#pni-top2" class="toplink">^</a></h4>
<p>Ao enviar dados em uma requisição Ajax, é necessário dizer em qual codificação encontram-se os dados. Caso a página esteja configurada em UTF-8, as propriedades DOM .value de objetos javascript como inputs e textareas estarão em UTF-8.</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">ajax<span class="sy0">.</span>open<span class="br0">&#40;</span><span class="st0">&#39;POST&#39;</span><span class="sy0">,</span> caminho<span class="sy0">,</span> <span class="sy0">!</span>sincrona<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">ajax<span class="sy0">.</span>setRequestHeader<span class="br0">&#40;</span><span class="st0">&#39;Content-Type&#39;</span><span class="sy0">,</span> <span class="st0">&#39;application/x-www-form-urlencoded; charset=UTF-8&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">ajax<span class="sy0">.</span>send<span class="br0">&#40;</span>dados<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<h4><a name="como-usar-utf-8-na-hora-de-converter-de-uma-codificao-para-outra"></a>Como usar UTF-8 na hora de converter de uma codificação para outra:<a href="#pni-top2" class="toplink">^</a></h4>
<p>Existem funções no PHP para converter de/para iso-8859-1 e UTF-8, sendo as intrínsecas <a href="http://www.php.net/manual/pt_BR/function.utf8-encode.php">utf8_encode</a> e <a href="http://www.php.net/manual/pt_BR/function.utf8-decode.php">utf8_decode</a>. Porém devemos restringir o uso delas a situações bem específicas como:</p>
<ol>
<li>Para utilização de funções/class que não suportem a UTF-8;</li>
<li>Para comunicação com outros sistemas/webservices que utilizam codificação diferente da utilizada pelo sistema/site;</li>
<li>Para gravar em arquivos que precisam estar em codificações diferentes.</li>
</ol>
<h4><a name="como-usar-utf-8-nas-funes-de-string"></a>Como usar UTF-8 nas funções de string:<a href="#pni-top2" class="toplink">^</a></h4>
<p>Até o PHP5 o suporte à UTF-8 não é completo nas funções de string. Por exemplo a strtoupper  não aceita caracteres UTF-8. Para as funções de string no PHP5 é necessário converter para ISO-8859-1 antes de usa-la e de converter novamente para UTF-8 após o uso. Como demonstrado no exemplo a seguir:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$nome</span> <span class="sy0">=</span> <span class="st0">&#39;Esse blog é bem legal!&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$nome_up</span> <span class="sy0">=</span> <span class="kw3">utf8_encode</span><span class="br0">&#40;</span><span class="kw3">strtoupper</span><span class="br0">&#40;</span><span class="kw3">utf8_decode</span><span class="br0">&#40;</span><span class="re1">$nome</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="re1">$nome_up</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<h3><a name="concluso-1"></a>Conclusão<a href="#pni-top2" class="toplink">^</a></h3>
<p>Se o conceito de codificação de caracteres for entendido, e com o auxílio das ferramentas (e funções) corretas, os problemas de exibição de acentos não ocorrerão e se ocorrerem, será fácil consertá-los. Já a escolha da codificação depende do projeto e do programador.</p>
<p>Lembrando sempre que o correto é utilizar sempre a mesma codificação em todos os lugares, independentemente de qual ela seja.</p>
<h3><a name="fontes-e-referncias"></a>Fontes e referências<a href="#pni-top2" class="toplink">^</a></h3>
<ul>
<li><a id="hjoa" title="http://pt.wikipedia.org/wiki/Codifica%C3%A7%C3%A3o_de_caracteres" href="http://pt.wikipedia.org/wiki/Codifica%C3%A7%C3%A3o_de_caracteres">http://pt.wikipedia.org/wiki/Codifica%C3%A7%C3%A3o_de_caracteres</a></li>
<li><a id="abuf" title="http://www.ietf.org/rfc/rfc3629.txt" href="http://www.ietf.org/rfc/rfc3629.txt">http://www.ietf.org/rfc/rfc3629.txt</a></li>
<li><a id="gaad" title="http://en.wikipedia.org/wiki/ASCII" href="http://en.wikipedia.org/wiki/ASCII">http://en.wikipedia.org/wiki/ASCII</a></li>
<li><a id="kt.e" title="http://en.wikipedia.org/wiki/ISO/IEC_8859-1" href="http://en.wikipedia.org/wiki/ISO/IEC_8859-1">http://en.wikipedia.org/wiki/ISO/IEC_8859-1</a></li>
<li><a id="bgs2" title="http://www.w3.org/TR/unicode-xml/" href="http://www.w3.org/TR/unicode-xml/">http://www.w3.org/TR/unicode-xml/</a></li>
<li><a id="aabd" title="http://en.wikipedia.org/wiki/Unicode" href="http://en.wikipedia.org/wiki/Unicode">http://en.wikipedia.org/wiki/Unicode</a></li>
<li><a id="b.85" title="http://revolucao.etc.br/archives/usando-entities-e-referencias-numericas-de-caracteres-ncr/" href="http://revolucao.etc.br/archives/usando-entities-e-referencias-numericas-de-caracteres-ncr/">http://revolucao.etc.br/archives/usando-entities-e-referencias-numericas-de-caracteres-ncr/</a></li>
<li><a id="oz-0" title="http://www.w3.org/International/O-charset.en.php" href="http://www.w3.org/International/O-charset.en.php">http://www.w3.org/International/O-charset.en.php</a></li>
<li><a id="vu9f" title="http://en.wikipedia.org/wiki/UTF-8" href="http://en.wikipedia.org/wiki/UTF-8">http://en.wikipedia.org/wiki/UTF-8</a></li>
<li><a id="lfsr" title="http://googleblog.blogspot.com/2008/05/moving-to-unicode-51.html" href="http://googleblog.blogspot.com/2008/05/moving-to-unicode-51.html">http://googleblog.blogspot.com/2008/05/moving-to-unicode-51.html</a></li>
</ul>
<p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpjedi.com.br/2010/10/codificacao-de-caracteres-iso-8859-1-versus-utf8/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sistemas Corporativos em CakePHP &#8211; Separação de Módulos</title>
		<link>http://www.phpjedi.com.br/2010/09/sistemas-corporativos-em-cakephp-separacao-de-modulos/</link>
		<comments>http://www.phpjedi.com.br/2010/09/sistemas-corporativos-em-cakephp-separacao-de-modulos/#comments</comments>
		<pubDate>Mon, 20 Sep 2010 17:01:55 +0000</pubDate>
		<dc:creator>Ariel Patschiki</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[sistemas corporativos]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.phpjedi.com.br/?p=81</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<div class="pni-navigtion"><a name="pni-top3"></a><ol><li><a href="#sistemas-corporativos-a-jornada">Sistemas Corporativos &#8211; A Jornada</a></li><li><a href="#organizao-e-separao-de-mdulos">Organização e Separação de Módulos</a></li><li><a href="#organizao-de-arquivos">Organização de Arquivos</a></li><li><a href="#organizao-de-tabelas">Organização de Tabelas</a></li><li><a href="#alteraes-no-cdigo">Alterações no Código</a><ol><li><a href="#no-app_model-do-mdulo">No app_model do módulo</a></li><li><a href="#no-model">No Model</a></li><li><a href="#nos-controller">Nos Controller</a></li><li><a href="#nos-links">Nos Links</a></li></ol></li><li><a href="#concluso-2">Conclusão</a></li></ol></div><div class="pni-content"></p>
<h3><a name="sistemas-corporativos-a-jornada"></a>Sistemas Corporativos &#8211; A Jornada<a href="#pni-top3" class="toplink">^</a></h3>
<p>Inicio neste post uma jornada de vários artigos que acompanhará minha empreitada de desenvolver Sistemas Corporativos em CakePHP, como ERPs, CRMs, etc.</p>
<p>Todos sabem que o CakePHP é um ótimo framework para sistemas web, bem como seu inspirador, o Rais, porém poucos usam-o para Sistemas Corporativos. <em>Per si</em> o CakePHP não é completamente funcional neste caso, porém felizmente ele suporta uma gama enorme de especializações como helpers, behaviors e plugins que servirão como base para implementação dos recursos necessários.</p>
<p>Segue abaixo algumas das funcionalidades que acho necessárias pare o uso Corporativo.</p>
<ul>
<li>Organização e Separação de Módulos<strong> &lt;- Tema deste artigo<br />
</strong></li>
<li>Aplicação de regras de negócio avançadas nos models</li>
<li>Plataforma de portlets (widgets, gadgets)</li>
<li>Edição de tabelas filhas &#8220;inline&#8221; (helper + javascript)</li>
<li>Filtros avançados e grid dinâmico no índice, com agrupamento, sumarização, etc.</li>
<li>Histórico transacional com suporte a &#8220;dezfazer&#8221; última ação no banco de dados</li>
<li>Exportação simples do resultado do índice para CSV e PDF</li>
<li>&#8220;Rascunho&#8221; e &#8220;Lixeira&#8221; de registros</li>
<li>Helper de Suggest</li>
<li>Helper de Gráficos</li>
</ul>
<h3><a name="organizao-e-separao-de-mdulos"></a>Organização e Separação de Módulos<a href="#pni-top3" class="toplink">^</a></h3>
<p>Como Sistemas Corporativos tendem a ter mais de 100 módulos, é imprescindível que haja uma organização de arquivos de tabelas. Acredito que seja uma opinião consensual entre os desenvolvedores desse tipo de sistema.</p>
<h3><a name="organizao-de-arquivos"></a>Organização de Arquivos<a href="#pni-top3" class="toplink">^</a></h3>
<p><img class="alignnone" title="Captura de tela 2010-09-20 às 11.49.23" src="http://www.phpjedi.com.br/wp-content/uploads/2010/09/Captura-de-tela-2010-09-20-%C3%A0s-11.49.23.png" alt="" width="261" height="523" /></p>
<p>Na imagem acima, podemos perceber que existe uma pasta nova, alheia a estrutura padrão do CakePHP, chamada &#8220;modules&#8221;. Em sua essência esta pasta é idêntica a &#8220;plugins&#8221;, comportando uma estrutura nova de &#8220;controllers&#8221;, &#8220;models&#8221; e &#8220;views&#8221; bem como seu próprio &#8220;app_model&#8221; e &#8220;app_controller&#8221;. Para esta pasta funcionar, é necessário adicionar as seguinte linhas no arquivo &#8220;bootstrap.php&#8221;:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">App<span class="sy0">::</span><span class="me2">build</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&#39;plugins&#39;</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; APP <span class="sy0">.</span> <span class="st0">&#39;plugins&#39;</span> <span class="sy0">.</span> DS<span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; APP <span class="sy0">.</span> <span class="st0">&#39;modules&#39;</span> <span class="sy0">.</span> DS</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Nota-se uma divisão semântica entre os módulos que gera uma organização modo a agrupar os que são desenvolvidos em conjunto. Adotei um padrão que, para os conceitos básicos do sistema como: países, cidades, etc. utilizando do módulo básico chamado &#8220;base&#8221; para tal.</p>
<p>Alguns módulos são pré-requisitos de outros, acredito que seja necessário verificar os pré-requisitos porteriorimente.</p>
<h3><a name="organizao-de-tabelas"></a>Organização de Tabelas<a href="#pni-top3" class="toplink">^</a></h3>
<p><a href="http://www.phpjedi.com.br/wp-content/uploads/2010/09/Captura-de-tela-2010-09-20-às-11.59.40.png"><img class="alignnone size-full wp-image-86" title="Captura de tela 2010-09-20 às 11.59.40" src="http://www.phpjedi.com.br/wp-content/uploads/2010/09/Captura-de-tela-2010-09-20-às-11.59.40.png" alt="" width="250" height="580" /></a></p>
<p>Na imagem acima, podemos perceber que está sendo utilizado um prefixo nas tabelas. Este prefixo é exatamente igual ao nome do módulo no qual ela será utilizada.</p>
<p><a href="http://www.phpjedi.com.br/wp-content/uploads/2010/09/Captura-de-tela-2010-09-20-às-11.50.41.png"><img class="alignnone size-full wp-image-89" title="Captura de tela 2010-09-20 às 11.50.41" src="http://www.phpjedi.com.br/wp-content/uploads/2010/09/Captura-de-tela-2010-09-20-às-11.50.41.png" alt="" width="562" height="414" /></a></p>
<p>Na imagem acima, a estrutura da tabela &#8220;financeiro_transacoes&#8221;, observamos que as FKs (<em>foreign keys</em> &#8211; chaves estrangeiras) para o próprio módulo, não utilizam novamente o prefixo do módulo, como por exemplo &#8220;transacao_tipo_id&#8221;. Já as FKs que referenciam outro módulo tem em seu nome o prefixo do módulo em questão, como a &#8220;pessoa_estabelecimento_id&#8221;, que refere-se a tabela &#8220;estabelecimento_id&#8221; do módulo &#8220;pessoa&#8221;.</p>
<h3><a name="alteraes-no-cdigo"></a>Alterações no Código<a href="#pni-top3" class="toplink">^</a></h3>
<h4><a name="no-app_model-do-mdulo"></a>No app_model do módulo<a href="#pni-top3" class="toplink">^</a></h4>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> FinanceiroAppModel <span class="kw2">extends</span> AppModel <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> <span class="re1">$tablePrefix</span> <span class="sy0">=</span> <span class="st0">&#39;financeiro_&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Para utilizar a tabela  &#8220;financeiro_transacoes&#8221; como simplesmente &#8220;financeiro&#8221; dentro do módulo, é necessário dizer para o CakePHP que aquela tabela tem aquele prefixo, como exemplificado no código acima.</p>
<p>É absolutamente necessário que todos os models deste módulo extendam o &#8220;FinanceiroAppModel&#8221; e não o &#8220;AppModel&#8221; para o correto funcionamento do prefixo.</p>
<h4><a name="no-model"></a>No Model<a href="#pni-top3" class="toplink">^</a></h4>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Transacao <span class="kw2">extends</span> FinanceiroAppModel <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> <span class="re1">$name</span> <span class="sy0">=</span> <span class="st0">&#39;Transacao&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> <span class="re1">$displayField</span> <span class="sy0">=</span> <span class="st0">&#39;descricao&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> <span class="re1">$belongsTo</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;TransacaoTipo&#39;</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;className&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Financeiro.TransacaoTipo&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;foreignKey&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;transacao_tipo_id&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;TransacaoSituacao&#39;</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;className&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Financeiro.TransacaoSituacao&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;foreignKey&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;transacao_situacao_id&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;TransacaoIrma&#39;</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;className&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Financeiro.Transacao&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;foreignKey&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;transacao_irma_id&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;Cliente&#39;</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;className&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Pessoa.Cliente&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;foreignKey&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;pessoa_cliente_id&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;Fornecedor&#39;</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;className&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Pessoa.Fornecedor&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;foreignKey&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;pessoa_fornecedor_id&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> <span class="re1">$hasMany</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;TransacaoBaixa&#39;</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;className&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Financeiro.TransacaoBaixa&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;foreignKey&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;transacao_id&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;dependent&#39;</span> <span class="sy0">=&gt;</span> <span class="kw2">false</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;TransacaoCentro&#39;</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;className&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Financeiro.TransacaoCentro&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;foreignKey&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;transacao_id&#39;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;dependent&#39;</span> <span class="sy0">=&gt;</span> <span class="kw2">false</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>No código acima, nas FKs, escrevemos o prefixo da tabela na referência utilizando a sintaxe: &#8220;Modulo.Model&#8221;, como visto no exemplo.</p>
<h4><a name="nos-controller"></a>Nos Controller<a href="#pni-top3" class="toplink">^</a></h4>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> TransacoesController <span class="kw2">extends</span> AppController <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">function</span> index<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$transacaoTipos</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">Transacao</span><span class="sy0">-&gt;</span><span class="me1">TransacaoTipo</span><span class="sy0">-&gt;</span><span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&#39;list&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$transacaoSituacoes</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">Transacao</span><span class="sy0">-&gt;</span><span class="me1">TransacaoSituacao</span><span class="sy0">-&gt;</span><span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&#39;list&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$filterOptions</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">AdvancedFilter</span><span class="sy0">-&gt;</span><span class="me1">filterOptions</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$transacoes</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">paginate</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="sy0">,</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">AdvancedFilter</span><span class="sy0">-&gt;</span><span class="me1">filter</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">Transacao</span><span class="sy0">-&gt;</span><span class="me1">recursive</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">set</span><span class="br0">&#40;</span><span class="kw3">compact</span><span class="br0">&#40;</span><span class="st0">&#39;transacoes&#39;</span><span class="sy0">,</span> <span class="st0">&#39;filterOptions&#39;</span><span class="sy0">,</span> <span class="st0">&#39;transacaoTipos&#39;</span><span class="sy0">,</span> <span class="st0">&#39;transacaoSituacoes&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>No controller, acessamos o model &#8220;Transacao&#8221; diretamente, sem utilizar o prefixo &#8220;Financeiro&#8221;.</p>
<h4><a name="nos-links"></a>Nos Links<a href="#pni-top3" class="toplink">^</a></h4>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">Html</span><span class="sy0">-&gt;</span><span class="me1">link</span><span class="br0">&#40;</span><span class="st0">&#39;Transações&#39;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;plugin&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;financeiro&#39;</span><span class="sy0">,</span> <span class="st0">&#39;controller&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;transacoes&#39;</span><span class="sy0">,</span> <span class="st0">&#39;action&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;index&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Para criar um link para um módulo, utilizamos o índice &#8220;plugin&#8221; no método &#8220;link&#8221; do helper &#8220;Html&#8221;, conforme o código acima. Ele gerará a seguinte URL:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">/</span>financeiro<span class="sy0">/</span>transacoes<span class="sy0">/</span>index</div>
</li>
</ol>
</div>
<h3><a name="concluso-2"></a>Conclusão<a href="#pni-top3" class="toplink">^</a></h3>
<p>O CakePHP é um framework extremamente versátil que possibilita organizar o código de diversas maneiras, como pudemos ver no exemplo deste artigo.</p>
<p>Este é o primeiro artigo da série &#8220;Sistemas Corporativos&#8221;, até a próxima.<br />
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpjedi.com.br/2010/09/sistemas-corporativos-em-cakephp-separacao-de-modulos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tipagem Forte em PHP</title>
		<link>http://www.phpjedi.com.br/2010/08/tipagem-forte-em-php/</link>
		<comments>http://www.phpjedi.com.br/2010/08/tipagem-forte-em-php/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 20:19:36 +0000</pubDate>
		<dc:creator>Ariel Patschiki</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[tipagem]]></category>

		<guid isPermaLink="false">http://www.phpjedi.com.br/?p=11</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<div class="pni-navigtion"><a name="pni-top4"></a><ol><li><a href="#o-que-tipagem">O que é Tipagem</a></li><li><a href="#vantagens-e-desvantagens">Vantagens e Desvantagens</a></li><li><a href="#tcnicas-para-deixar-o-php-tipado-fortemente">Técnicas para deixar o PHP tipado fortemente</a><ol><li><a href="#tipagem-forte-utilizando-type-hinting">Tipagem Forte utilizando Type Hinting</a></li><li><a href="#tipagem-forte-utilizando-spl_types">Tipagem Forte utilizando SPL_Types</a></li><li><a href="#tipagem-forte-utilizando-popotypesafe">Tipagem Forte utilizando POPOTypeSafe</a></li></ol></li><li><a href="#referncias-2">Referências</a></li></ol></div><div class="pni-content"></p>
<h3><a name="o-que-tipagem"></a>O que é Tipagem<a href="#pni-top4" class="toplink">^</a></h3>
<p>Tipagem é o modo em que o interpretador/compilador de uma linguagem diferencia os tipos de variáveis, como <span style="font-family: courier new;">inteiro</span>, <span style="font-family: courier new;">string</span>, etc. No PHP, a tipagem é &#8220;dinâmica&#8221; ou &#8220;fraca&#8221;, isto é, você pode executar o código abaixo, que ele irá retornar &#8220;20&#8243;:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$a</span> <span class="sy0">=</span> <span class="st0">&quot;10&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="re1">$a</span> <span class="sy0">*</span> <span class="nu0">2</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Neste artigo serão descritos três métodos para utilizar tipagem forte em PHP.</p>
<h3><a name="vantagens-e-desvantagens"></a>Vantagens e Desvantagens<a href="#pni-top4" class="toplink">^</a></h3>
<p>Não há um consenso na comunidade de programadores PHP se a tipagem fraca do PHP é boa ou não e isto é assunto de vários <em>flames</em> em fóruns. Porém, pode-se enumerar vantagens e desvantagens do uso, não entrando no mérito se uma é melhor do que a outra.</p>
<p>Vantagens de Tipagem Forte (C++, Ruby)</p>
<ul>
<li>Pode assegurar a regra de negócio pelo tipo da variável/atributo</li>
<li>Evita erros na compilação/interpretação, ao contrário da execução</li>
</ul>
<p>Vantagens de Tipagem Fraca (PHP, Python):</p>
<ul>
<li>Menos burocracia</li>
<li>Mais flexibilidade</li>
</ul>
<h3><a name="tcnicas-para-deixar-o-php-tipado-fortemente"></a>Técnicas para deixar o PHP tipado fortemente<a href="#pni-top4" class="toplink">^</a></h3>
<h4><a name="tipagem-forte-utilizando-type-hinting"></a>Tipagem Forte utilizando Type Hinting<a href="#pni-top4" class="toplink">^</a></h4>
<p>Desde o PHP 5 é possível forçar um tipo de parâmetro em métodos, como exemplificado abaixo:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">function</span> teste<span class="br0">&#40;</span>NomeDaClasse <span class="re1">$var</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="re1">$var</span><span class="sy0">-&gt;</span><span class="me1">teste2</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>No exemplo, se for passado uma variável de um tipo diferente de &#8220;NomeDaClasse&#8221;, o PHP produzirá um <em>Fatal Error</em>.</p>
<p>Isso  é útil para definir regras de negócios orientada a objeto, porém não  exclui as fraquezas do PHP, por não tratar tipos básicos como <span style="font-family: courier new;">int</span> e <span style="font-family: courier new;">string</span> além de ser somente útil em atributos, deixando as variáveis de fora.</p>
<h4><a name="tipagem-forte-utilizando-spl_types"></a>Tipagem Forte utilizando SPL_Types<a href="#pni-top4" class="toplink">^</a></h4>
<p>É uma extensão PECL que permite trabalhar com tipos básicos fortemente tipados, como no exemplo abaixo:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$int</span> <span class="sy0">=</span> <span class="kw2">new</span> SplInt<span class="br0">&#40;</span><span class="nu0">3</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$float</span> <span class="sy0">=</span> <span class="kw2">new</span> SplFloat<span class="br0">&#40;</span><span class="nu0">3.151521</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$float</span> <span class="sy0">+=</span> <span class="re1">$int</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$float</span> <span class="sy0">=</span> <span class="st0">&#39;1&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>O código acima irá retornar uma exception <em>UnexpectedValueException</em>.
</pre>
<h4><a name="tipagem-forte-utilizando-popotypesafe"></a>Tipagem Forte utilizando POPOTypeSafe<a href="#pni-top4" class="toplink">^</a></h4>
<p>Usando as classes <span style="font-family: courier new;">POPOTypeSafe</span> e <span style="font-family: courier new;">POPO</span> descritas no artigo <a id="k.pd" title="typesafe objects in PHP" href="http://jan.kneschke.de/projects/typesafe-objects-in-php/">typesafe objects in PHP</a>, escrito por <a id="c.03" title="Jan Kneschke" href="http://jan.kneschke.de/about/">Jan Kneschke</a>, é possível criar classes com atributos tipados. Veja o exemplo abaixo:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Pessoa <span class="kw2">extends</span> POPOTypeSafe <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/** @var int */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="re1">$idade</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/** @var string */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="re1">$nome</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$e</span> <span class="sy0">=</span> <span class="kw2">new</span> Pessoa<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$e</span><span class="sy0">-&gt;</span><span class="me1">nome</span> <span class="sy0">=</span> “Ariel”<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$e</span><span class="sy0">-&gt;</span><span class="me1">idade</span> <span class="sy0">=</span> “21″<span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>No exemplo acima, a última linha irá gerar uma <span style="font-family: courier new;">Exception</span>. O tipo do atributo é descrito pelo comentário.</p>
<h3><a name="referncias-2"></a>Referências<a href="#pni-top4" class="toplink">^</a></h3>
<ul>
<li><a href="http://www.php.net/manual/en/language.types.php">http://www.php.net/manual/en/language.types.php</a></li>
<li><a href="http://cstruter.com/blog/44">http://cstruter.com/blog/44</a></li>
<li><a href="http://www.loudthinking.com/arc/000074.html">http://www.loudthinking.com/arc/000074.html</a></li>
<li><a href="http://www.slideshare.net/sebastian_bergmann/typesafe-objects-in-php">http://www.slideshare.net/sebastian_bergmann/typesafe-objects-in-php</a></li>
<li><a href="http://jan.kneschke.de/projects/typesafe-objects-in-php/">http://jan.kneschke.de/projects/typesafe-objects-in-php/</a></li>
<li><a href="http://en.wikipedia.org/wiki/Type_system">http://en.wikipedia.org/wiki/Type_system</a></li>
<li><a href="http://en.wikipedia.org/wiki/Strongly_typed_programming_language">http://en.wikipedia.org/wiki/Strongly_typed_programming_language</a></li>
</ul>
<p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpjedi.com.br/2010/08/tipagem-forte-em-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHAR &#8211; O JAR do PHP</title>
		<link>http://www.phpjedi.com.br/2010/07/phar-o-jar-do-php/</link>
		<comments>http://www.phpjedi.com.br/2010/07/phar-o-jar-do-php/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 21:31:49 +0000</pubDate>
		<dc:creator>Ariel Patschiki</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[phar]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.phpjedi.com.br/?p=19</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<div class="pni-navigtion"><a name="pni-top5"></a><ol><li><a href="#o-que-o-phar">O que é o Phar</a></li><li><a href="#exemplos-de-uso">Exemplos de uso</a></li><li><a href="#instalao">Instalação</a></li><li><a href="#tutorial">Tutorial</a><ol><li><a href="#habilite-a-escrita-no-php-ini">Habilite a escrita no php.ini</a></li><li><a href="#crie-a-aplicao-de-teste">Crie a aplicação de teste</a></li><li><a href="#gere-o-php-que-ir-criar-o-phar">Gere o .php que irá criar o .phar</a></li><li><a href="#teste-o-arquivo-criado-por-linha-de-comando">Teste o arquivo criado, por linha de comando</a></li></ol></li><li><a href="#configure-o-apache-para-executar-arquivos-phar">Configure o Apache para executar arquivos .phar</a></li><li><a href="#5-executando-phar-pelo-navegador-sem-usar-o-apache">Executando .phar pelo navegador sem usar o Apache.</a></li><li><a href="#6-outras-funes">Outras Funções</a></li><li><a href="#8-referncias">Referências</a></li></ol></div><div class="pni-content"> </p>
<h3><a name="o-que-o-phar"></a>O que é o Phar<a href="#pni-top5" class="toplink">^</a></h3>
<p>Análago ao .jar do Java, o Phar é utilizado  para encapsular arquivos .php e outros em um único arquivo .phar. Uma  aplicação inteira pode ser distribuida e executada em um único arquivo, junto com seus arquivos de auxiliares como imagens, css, etc. Não  existe ferramenta para gerar .phar, estes são gerados pela classe Phar.</p>
<h3><a name="exemplos-de-uso"></a>Exemplos de uso<a href="#pni-top5" class="toplink">^</a></h3>
<ul>
<li>Publicar sua aplicação inteira com somente um arquivo;</li>
<li>Usar como um padrão para distribuição de plugins/drivers/etc. para uma aplicação;</li>
<li>Gerar arquivos de instalação &#8220;auto-instaláveis&#8221;.</li>
</ul>
<h3><a name="instalao"></a>Instalação<a href="#pni-top5" class="toplink">^</a></h3>
<p>O  Phar já vem junto com o PHP desde a versão 5.3.0. Porém, nas versões  anteriores é possível instala-lo através de uma extensão, como visto no  seguinte link: <a id="e.e5" title="http://pecl.php.net/package/phar" href="http://pecl.php.net/package/phar">http://pecl.php.net/package/phar</a>.</p>
<h3><a name="tutorial"></a>Tutorial<a href="#pni-top5" class="toplink">^</a></h3>
<p>Neste  tutorial será mostrado passo-a-passo como gerar um arquivo .phar a  partir de arquivos .php e como executa-lo pelo navegador.</p>
<h4><a name="habilite-a-escrita-no-php-ini"></a>Habilite a escrita no php.ini<a href="#pni-top5" class="toplink">^</a></h4>
<p>Por  razões de segurança, a geração de arquivos .phar é desabilitada por padrão no php.ini. Para habilitar a geração, mude a configuração <span style="font-family: courier new;">phar.readonly</span> para <span style="font-family: courier new;">Off</span>. Em um servidor de produção não é necessário deixar essa configuração inativa.</p>
<h4><a name="crie-a-aplicao-de-teste"></a>Crie a aplicação de teste<a href="#pni-top5" class="toplink">^</a></h4>
<p><b>index.php</b></p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include</span><span class="br0">&#40;</span>‘<span class="kw1">include</span><span class="sy0">.</span>php’<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">funcao<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p><b>include.php</b></p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> funcao<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> ‘Sim<span class="sy0">,</span> funciona<span class="sy0">!</span>’<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<h4><a name="gere-o-php-que-ir-criar-o-phar"></a>Gere o .php que irá criar o .phar<a href="#pni-top5" class="toplink">^</a></h4>
<p><b>gera_phar.php</b></p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Cria o arquivo e define o tipo dele como phar não comprimido</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$phar</span> <span class="sy0">=</span> <span class="kw2">new</span> Phar<span class="br0">&#40;</span>‘testephar<span class="sy0">.</span>phar’<span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> ‘testephar<span class="sy0">.</span>phar’<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$phar</span> <span class="sy0">=</span> <span class="re1">$phar</span><span class="sy0">-&gt;</span><span class="me1">convertToExecutable</span><span class="br0">&#40;</span>Phar<span class="sy0">::</span><span class="me2">PHAR</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Adiciona os arquivos index.php e include.php no testephar.phar</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$phar</span><span class="sy0">-&gt;</span><span class="me1">addFile</span><span class="br0">&#40;</span>‘index<span class="sy0">.</span>php’<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$phar</span><span class="sy0">-&gt;</span><span class="me1">addFile</span><span class="br0">&#40;</span>‘<span class="kw1">include</span><span class="sy0">.</span>php’<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Define o index.php como arquivo padrão ao executar</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$phar</span><span class="sy0">-&gt;</span><span class="me1">setMetaData</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span>‘bootstrap’ <span class="sy0">=&gt;</span> ‘index<span class="sy0">.</span>php’<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Execute o gera_phar.php, na linha de comando ou pelo navegador:</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">$ php gera_phar.php</div>
</li>
</ol>
</div>
<h4><a name="teste-o-arquivo-criado-por-linha-de-comando"></a>Teste o arquivo criado, por linha de comando<a href="#pni-top5" class="toplink">^</a></h4>
<p>Agora nosso arquivo já pode ser executado por linha de comando:</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">$ php testephar.phar</div>
</li>
</ol>
</div>
<p>Deve retornar:</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">Sim, funciona<span class="sy0">!</span></div>
</li>
</ol>
</div>
<h3><a name="configure-o-apache-para-executar-arquivos-phar"></a>Configure o Apache para executar arquivos .phar<a href="#pni-top5" class="toplink">^</a></h3>
<p>Se  você acessar pelo navegador o arquivo .phar agora, ele irá baixar o  arquivo ao invés de interpreta-lo, portanto precisamos configurar ou  Apache (ou outro Servidor Web).</p>
<p>Adicione a seguinte linha ao arquivo <span style="font-family: courier new;">httpd.conf<span style="font-family: verdana;">:</span><br />
</span></p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">AddType application<span class="sy0">/</span>x-httpd-php .phar</div>
</li>
</ol>
</div>
<p><span style="font-family: verdana;">Após reiniciar</span> o Apache, o .phar já pode ser executado pelo navegador, como mostrado abaixo:</p>
<div id="vb7h"><img src="https://docs.google.com/File?id=dhqwgh7t_75gmf2zbd8_b" alt="" /></div>
<h3><a name="5-executando-phar-pelo-navegador-sem-usar-o-apache"></a>Executando .phar pelo navegador sem usar o Apache.<a href="#pni-top5" class="toplink">^</a></h3>
<p>É possível executar arquivos .phar pelo navegador sem alterar as configurações do Apache, basta renomear o arquivo <span style="font-family: courier new;">testephar.phar</span> para <span style="font-family: courier new;">testephar.phar.php</span>, facilitando a distribuição de aplicações.</p>
<h3><a name="6-outras-funes"></a>Outras Funções<a href="#pni-top5" class="toplink">^</a></h3>
<p>Além do que foi visto neste artigo, o pacote .phar tem várias funções, veja algumas delas:</p>
<ul>
<li>Incluir arquivos de diretórios recursivamente;</li>
<li>Diversos tipos de compactação, como: zip, tar, gzip, bz2;</li>
<li>Adicionar e excluir arquivos <em>on-the-fly</em>;</li>
<li>&#8220;Incluir&#8221; arquivos de dentro do .phar a partir de um .php que esteja fora;</li>
<li>Utilizar funções de tratamento de arquivos (como fopen, etc.) dentro do .phar;</li>
<li>Converter arquivos .tar.gz (ou outros) em .phar prontos para execução.</li>
</ul>
<h3><a name="8-referncias"></a>Referências<a href="#pni-top5" class="toplink">^</a></h3>
<ul>
<li><a href="http://www.php.net/manual/en/book.phar.php">http://www.php.net/manual/en/book.phar.php</a></li>
</ul>
<p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.phpjedi.com.br/2010/07/phar-o-jar-do-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

