<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Lucas Soler - TI Orientada à prática</title>
	<atom:link href="http://lucassoler.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://lucassoler.wordpress.com</link>
	<description>Blog dedicado à tecnologia da informação. Dicas e tutoriais sobre PHP, Java, JS, AJAX, MySql, POO, UML, (X)HTML e CSS</description>
	<lastBuildDate>Fri, 05 Jun 2009 21:30:35 +0000</lastBuildDate>
	<language>pt</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='lucassoler.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Lucas Soler - TI Orientada à prática</title>
		<link>http://lucassoler.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://lucassoler.wordpress.com/osd.xml" title="Lucas Soler - TI Orientada à prática" />
	<atom:link rel='hub' href='http://lucassoler.wordpress.com/?pushpress=hub'/>
		<item>
		<title>PHP5 e Design Patterns – Pattern Observer (conceito e exemplo com a SPL)</title>
		<link>http://lucassoler.wordpress.com/2009/06/03/php5-e-design-patterns-%e2%80%93-pattern-observer-conceito-e-exemplo-com-a-spl/</link>
		<comments>http://lucassoler.wordpress.com/2009/06/03/php5-e-design-patterns-%e2%80%93-pattern-observer-conceito-e-exemplo-com-a-spl/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 16:37:57 +0000</pubDate>
		<dc:creator>Lucas Soler</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[design pattern observer]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[observer]]></category>
		<category><![CDATA[padrão de projeto]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[spl]]></category>

		<guid isPermaLink="false">http://lucassoler.wordpress.com/?p=85</guid>
		<description><![CDATA[Em um sistema de informação orientado à objetos continuamente precisamos que um determinado objeto de uma classe, ao executar um de seus métodos, informe a outros objetos esta ação. Para exemplificar, imagine que uma empresa possui um sistema de controle de produtos e estoque orientado à objetos e necessita que toda vez que o preço [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucassoler.wordpress.com&amp;blog=7649407&amp;post=85&amp;subd=lucassoler&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Em um sistema de informação orientado à objetos continuamente precisamos que um determinado objeto de uma classe, ao executar um de seus métodos, informe a outros objetos esta ação.</p>
<p style="text-align:justify;">Para exemplificar, imagine que uma empresa possui um sistema de controle de produtos e estoque orientado à objetos e necessita que toda vez que o preço de algum de seus produtos mude os representantes sejam informados. Assim sendo, toda vez que o atributo preço de algum produto seja alterado, o produto terá que informar automaticamente todos representantes que seu preço mudou.Para resolver este tipo de problema podemos usar o pattern Observer. Este pattern consiste em termos um objeto OBSERVADO e objetos OBSERVADORES. O objeto observado deverá ter a capacidade de agregar observadores e de notificá-los de alguma mudança.</p>
<p style="text-align:justify;">O PHP5 nativamente possui as interfaces SplObserver e SplSubject. A interface SplSubject serve para implementarmos classes cujos objetos serão observados por outros, por isto esta interface quando implementada  nos obriga a criar os métodos públicos attach (para inserir um observador a coleção de observadores), detach (para retirar um observador da coleção) e o mais importante, notify (usado para informar todos observadores presentes na coleção de alguma coisa). Já a interface SplObserver serve para implementarmos observadores. Esta nos obriga a criar o método update (que recebe o objeto observado como parâmetro) disparado pelo objeto observado.</p>
<p style="text-align:justify;">Segue abaixo as interfaces presentes na biblioteca SPL nativa no PHP5:</p>
<p style="text-align:justify;"><code><span style="color:#000000;"><span style="color:#007700;">interface </span><span style="color:#0000bb;">SplObserver<br />
</span><span style="color:#007700;">{<br />
    function </span><span style="color:#0000bb;">update</span><span style="color:#007700;">(</span><span style="color:#0000bb;">SplSubject $subject</span><span style="color:#007700;">);<br />
}</span></span></code></p>
<p style="text-align:justify;"><code><span style="color:#000000;"><span style="color:#0000bb;"><code><span style="color:#000000;"><span style="color:#007700;">interface </span></span></code>SplSubject<br />
</span><span style="color:#007700;">{<br />
    function </span><span style="color:#0000bb;">attach</span><span style="color:#007700;">(</span><span style="color:#0000bb;">SplObserver $observer</span><span style="color:#007700;">);<br />
    function </span><span style="color:#0000bb;">detach</span><span style="color:#007700;">(</span><span style="color:#0000bb;">SplObserver $observer</span><span style="color:#007700;">);<br />
    function </span><span style="color:#0000bb;">notify</span><span style="color:#007700;">();<br />
} </span></span></code></p>
<p style="text-align:justify;">Agora vamos resolver um problema real como exemplo de uso do pattern Observer. Neste exemplo teremos uma classe Editora que terá como capacidade principal lançar um livro. Como uma Editora tem clientes esta classe também deverá fornecer a seus objetos a capacidade de agregar clientes para que estes sejam informados automáticamente caso um novo livro seja lançado. Portanto os objetos da classe Editora poderão ser observados pelos clientes (seus observadores). Para isto  a classe Editora implementará a interface SplSubject e a classe Cliente implementará SplObserver.</p>
<p style="text-align:justify;">Segue o código:</p>
<p style="text-align:justify;"><code><span style="color:#000000;"><span style="color:#0000bb;">&lt;?php<br />
</span><span style="color:#ff8000;">/**<br />
 * Classe responsável pela criação de editoras<br />
 * @author           Lucas Soler<br />
 * @copyright        Copyright 2009 Lucas Soler<br />
 * @package          www<br />
 * @subpackage       www<br />
 * @version          1.0<br />
 */ <br />
</span><span style="color:#007700;">class </span><span style="color:#0000bb;">Editora </span><span style="color:#007700;">implements </span><span style="color:#0000bb;">SplSubject</span><span style="color:#007700;">{<br />
    </span><span style="color:#ff8000;">/**<br />
     * Coleção de observadores da editora<br />
     * @access private<br />
     * @name $observadores<br />
     */ <br />
    </span><span style="color:#007700;">private </span><span style="color:#0000bb;">$observadores</span><span style="color:#007700;">;<br />
    </span><span style="color:#ff8000;">/**<br />
     * Recebe o nome do último livro lançado<br />
     * @access private<br />
     * @name $livroLancado<br />
     */ <br />
    </span><span style="color:#007700;">private </span><span style="color:#0000bb;">$livroLancado</span><span style="color:#007700;">;<br />
    </span><span style="color:#ff8000;">/**<br />
     * Recebe o nome da editora<br />
     * @access private<br />
     * @name $nome<br />
     */ <br />
    </span><span style="color:#007700;">private </span><span style="color:#0000bb;">$nome</span><span style="color:#007700;">;<br />
    </span><span style="color:#ff8000;">/**<br />
     * Cria uma editora atribuindo um nome a ela e iniciando a coleção de observadores<br />
     * @access public <br />
     * @param string $nome Nome da editora<br />
     * @return void<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">__construct</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$nome</span><span style="color:#007700;">){<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">observadores </span><span style="color:#007700;">= array();<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">nome </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$nome</span><span style="color:#007700;">;<br />
    }<br />
    </span><span style="color:#ff8000;">/**<br />
     * Método mágico __set. Atribui valor a qualquer atributo<br />
     * @access public <br />
     * @param string $nm Nome do atributo<br />
     * @param mixed $value Valor para o atributo<br />
     * @return void<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">__set</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$nm</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$value</span><span style="color:#007700;">)<br />
    {<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">$nm </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$value</span><span style="color:#007700;">;<br />
    }</span></span></code></p>
<p style="text-align:justify;"><code><span style="color:#000000;"><span style="color:#007700;">    </span></span></code><code><span style="color:#000000;"><span style="color:#ff8000;">/**<br />
     * Método mágico __get. Retorna o valor de qualquer atributo<br />
     * @access public <br />
     * @param string $nm Nome do atributo<br />
     * @return mixed O valor do atributo passado como parâmetro (pode ser de qualquer tipo)<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">__get</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$nm</span><span style="color:#007700;">)<br />
    {<br />
        return </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">$nm</span><span style="color:#007700;">;<br />
    }<br />
    <br />
    </span><span style="color:#ff8000;">/**<br />
     * Acrescenta um observador à editora<br />
     * @access public <br />
     * @param SplObserver $observador Objeto observador a ser inserido na coleção<br />
     * @return void<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">attach</span><span style="color:#007700;">(</span><span style="color:#0000bb;">SplObserver $observador</span><span style="color:#007700;">){<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">observadores</span><span style="color:#007700;">[] = </span><span style="color:#0000bb;">$observador</span><span style="color:#007700;">;<br />
    }</span></span></code></p>
<p style="text-align:justify;"><code><span style="color:#000000;"><span style="color:#007700;">    </span><span style="color:#ff8000;">/**<br />
     * Retira um observador da editora<br />
     * @access public <br />
     * @param SplObserver $observador Objeto observador a ser retirado da coleção<br />
     * @return void<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">detach</span><span style="color:#007700;">(</span><span style="color:#0000bb;">SplObserver $observador</span><span style="color:#007700;">){<br />
        </span><span style="color:#0000bb;">$newObservadores </span><span style="color:#007700;">= array();<br />
        foreach(</span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">observadores </span><span style="color:#007700;">as </span><span style="color:#0000bb;">$key </span><span style="color:#007700;">=&gt; </span><span style="color:#0000bb;">$ob</span><span style="color:#007700;">){<br />
            if(</span><span style="color:#0000bb;">$ob </span><span style="color:#007700;">!== </span><span style="color:#0000bb;">$observador</span><span style="color:#007700;">){<br />
                </span><span style="color:#0000bb;">$newObservadores</span><span style="color:#007700;">[] = </span><span style="color:#0000bb;">$ob</span><span style="color:#007700;">;<br />
            }<br />
        }<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">observadores </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$newObservadores</span><span style="color:#007700;">;<br />
    }<br />
 <br />
    </span><span style="color:#ff8000;">/**<br />
     * Dispara o método "update" de todos observadores <br />
     * @access public <br />
     * @return void<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">notify</span><span style="color:#007700;">(){<br />
        foreach(</span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">observadores </span><span style="color:#007700;">as </span><span style="color:#0000bb;">$ob</span><span style="color:#007700;">){<br />
            </span><span style="color:#0000bb;">$ob</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">update</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$this</span><span style="color:#007700;">);<br />
        }<br />
    }</span></span></code></p>
<p style="text-align:justify;"><code><span style="color:#000000;"><span style="color:#007700;">    </span><span style="color:#ff8000;">/**<br />
     * Lança um livro e informa todos observadores sobre o lançamento<br />
     * @access public <br />
     * @param string $nomeLivro Nome do livro lançado<br />
     * @return void<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">lancarLivro</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$nomeLivro</span><span style="color:#007700;">){<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">livroLancado </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$nomeLivro</span><span style="color:#007700;">;<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">notify</span><span style="color:#007700;">();<br />
    }</span></span></code></p>
<p style="text-align:justify;"><code><span style="color:#000000;"><span style="color:#007700;">}</span></span></code></p>
<p style="text-align:justify;"><code><span style="color:#000000;"><span style="color:#ff8000;">/</span></span></code><code><span style="color:#000000;"><span style="color:#ff8000;">**<br />
 * Classe responsável pela criação de clientes<br />
 * @author           Lucas Soler<br />
 * @copyright        Copyright 2009 Lucas Soler<br />
 * @package          www<br />
 * @subpackage       www<br />
 * @version          1.0<br />
 */ <br />
</span><span style="color:#007700;">class </span><span style="color:#0000bb;">Cliente </span><span style="color:#007700;">implements </span><span style="color:#0000bb;">SplObserver</span><span style="color:#007700;">{<br />
    </span><span style="color:#ff8000;">/**<br />
     * Recebe o nome do cliente<br />
     * @access private<br />
     * @name $nome<br />
     */ <br />
    </span><span style="color:#007700;">private </span><span style="color:#0000bb;">$nome</span><span style="color:#007700;">;</span><span style="color:#ff8000;">/**<br />
     * Cria um cliente atribuindo a ele um nome<br />
     * @access public <br />
     * @param string $nome Nome do cliente<br />
     * @return void<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">__construct</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$nome</span><span style="color:#007700;">){<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">nome </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$nome</span><span style="color:#007700;">;<br />
    }<br />
    <br />
    </span><span style="color:#ff8000;">/**<br />
     * Método mágico __get. Retorna o valor de qualquer atributo<br />
     * @access public <br />
     * @param string $nm Nome do atributo<br />
     * @return mixed O valor do atributo passado como parâmetro (pode ser de qualquer tipo)<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">__get</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$nm</span><span style="color:#007700;">)<br />
    {<br />
        return </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">$nm</span><span style="color:#007700;">;<br />
    }<br />
    <br />
    </span><span style="color:#ff8000;">/**<br />
     * Recebe o objeto observado quando este lança um livro e informa características do lançamento<br />
     * @access public <br />
     * @param SplSubject $objObservado Objeto observado<br />
     * @return void<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">update</span><span style="color:#007700;">(</span><span style="color:#0000bb;">SplSubject $objObservado</span><span style="color:#007700;">){<br />
        echo </span><span style="color:#dd0000;">"A editora "</span><span style="color:#007700;">.</span><span style="color:#0000bb;">$objObservado</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">__get</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"nome"</span><span style="color:#007700;">).</span><span style="color:#dd0000;">" comunicou a "</span><span style="color:#007700;">.</span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">nome</span><span style="color:#007700;">.</span><span style="color:#dd0000;">" em "</span><span style="color:#007700;">.</span><span style="color:#0000bb;">date</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"d/m/Y"</span><span style="color:#007700;">).</span><span style="color:#dd0000;">" às "</span><span style="color:#007700;">.</span><span style="color:#0000bb;">date</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"H:i:s"</span><span style="color:#007700;">).</span><span style="color:#dd0000;">" que o livro "</span><span style="color:#007700;">.</span><span style="color:#0000bb;">$objObservado</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">livroLancado</span><span style="color:#007700;">.</span><span style="color:#dd0000;">" foi lançado&lt;br/&gt;"</span><span style="color:#007700;">;    <br />
    }</span></span></code></p>
<p style="text-align:justify;"><code><span style="color:#000000;"><span style="color:#007700;">}</span></span></code></p>
<p style="text-align:justify;"><code><span style="color:#000000;"><span style="color:#0000bb;">$editora </span><span style="color:#007700;">= new </span><span style="color:#0000bb;">Editora</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"LucasTec"</span><span style="color:#007700;">);<br />
</span><span style="color:#0000bb;">$lucas </span><span style="color:#007700;">= new </span><span style="color:#0000bb;">Cliente</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"Lucas Soler"</span><span style="color:#007700;">);<br />
</span><span style="color:#0000bb;">$suemi </span><span style="color:#007700;">= new </span><span style="color:#0000bb;">Cliente</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"Suemi Shimizu"</span><span style="color:#007700;">);<br />
</span><span style="color:#0000bb;">$tiago </span><span style="color:#007700;">= new </span><span style="color:#0000bb;">Cliente</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"Tiago Soler"</span><span style="color:#007700;">);<br />
</span><span style="color:#ff8000;">//Inserindo os clientes como observadores da editora<br />
</span><span style="color:#0000bb;">$editora</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">attach</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$lucas</span><span style="color:#007700;">);<br />
</span><span style="color:#0000bb;">$editora</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">attach</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$suemi</span><span style="color:#007700;">);<br />
</span><span style="color:#0000bb;">$editora</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">attach</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$tiago</span><span style="color:#007700;">);<br />
</span><span style="color:#ff8000;">//Caso tenha que retirar um observador da coleção este é o código<br />
//$editora-&gt;detach($suemi);<br />
//Editora lança livro e informa os observadores sobre o lançamento<br />
</span><span style="color:#0000bb;">$editora</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">lancarLivro</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"Lucas Soler - TI Orientada à Prática"</span><span style="color:#007700;">);</span></span></code></p>
<p style="text-align:justify;"><code><span style="color:#000000;"><span style="color:#0000bb;">?&gt; </span></span></code></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lucassoler.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lucassoler.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lucassoler.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lucassoler.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lucassoler.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lucassoler.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lucassoler.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lucassoler.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lucassoler.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lucassoler.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lucassoler.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lucassoler.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lucassoler.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lucassoler.wordpress.com/85/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucassoler.wordpress.com&amp;blog=7649407&amp;post=85&amp;subd=lucassoler&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lucassoler.wordpress.com/2009/06/03/php5-e-design-patterns-%e2%80%93-pattern-observer-conceito-e-exemplo-com-a-spl/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a13b7e2242c5d5914a75668eace33317?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lsoler</media:title>
		</media:content>
	</item>
		<item>
		<title>O que é Programação Orientada a Objetos (POO)</title>
		<link>http://lucassoler.wordpress.com/2009/05/21/programacao-orientada-a-objetos-poo/</link>
		<comments>http://lucassoler.wordpress.com/2009/05/21/programacao-orientada-a-objetos-poo/#comments</comments>
		<pubDate>Thu, 21 May 2009 18:24:44 +0000</pubDate>
		<dc:creator>Lucas Soler</dc:creator>
				<category><![CDATA[Programação Orientada a Objetos - Conceitos]]></category>
		<category><![CDATA[conceito]]></category>
		<category><![CDATA[fatorial]]></category>
		<category><![CDATA[função]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[programação orientada a objetos]]></category>
		<category><![CDATA[programação procedural]]></category>

		<guid isPermaLink="false">http://lucassoler.wordpress.com/?p=81</guid>
		<description><![CDATA[Programação Orientada a Objetos (POO) Este post tem como objetivo explicar claramente o que é o paradigma de programação orientada a objetos (POO). Outros posts explicarão conceitos agregados a este, como o de classes, objetos, herança, polimorfismo etc. Para começar vamos revisar o modelo de programação procedural, para que assim possamos ter uma base para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucassoler.wordpress.com&amp;blog=7649407&amp;post=81&amp;subd=lucassoler&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3>Programação Orientada a Objetos (POO)</h3>
<p>Este post tem como objetivo explicar claramente o que é o paradigma de programação orientada a objetos (POO). Outros posts explicarão conceitos agregados a este, como o de classes, objetos, herança, polimorfismo etc.</p>
<p>Para começar vamos revisar o modelo de programação procedural, para que assim possamos ter uma base para comparação entre este modelo e a POO. Um sistema de informação que faz uso da programação procedural tem como princípio a criação e execução de procedimentos ou funções. Neste paradigma podemos criar certas rotinas para resolver um determinado problema. Estas rotinas, ou funções, são compostas de um número limitado de comandos para a solução do problema. Por exemplo, para calcular o fatorial de um número podemos criar uma função para fazer isto. A função receberá um número (parâmetro) e terá que nos fornecer um resultado, neste caso o número fatorial do parâmetro passado. Após criá-la é só chamar a função no nosso código passando um número como parâmetro. Em PHP, uma linguagem procedural mas que pode ser Orientada a Objetos, isto ficaria assim:</p>
<p><code><span style="color:#000000;"><span style="color:#0000bb;">&lt;?php<br />
    </span><span style="color:#007700;">function </span><span style="color:#0000bb;">factorial</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$num</span><span style="color:#007700;">) {<br />
        if((</span><span style="color:#0000bb;">$num </span><span style="color:#007700;">== </span><span style="color:#0000bb;">0</span><span style="color:#007700;">)||(</span><span style="color:#0000bb;">$num </span><span style="color:#007700;">== </span><span style="color:#0000bb;">1</span><span style="color:#007700;">)) {<br />
            return </span><span style="color:#0000bb;">1</span><span style="color:#007700;">;<br />
        }<br />
        else {<br />
            return </span><span style="color:#0000bb;">$num</span><span style="color:#007700;">*</span><span style="color:#0000bb;">factorial</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$num</span><span style="color:#007700;">-</span><span style="color:#0000bb;">1</span><span style="color:#007700;">);<br />
        }<br />
    }<br />
    echo </span><span style="color:#0000bb;">factorial</span><span style="color:#007700;">(</span><span style="color:#0000bb;">7</span><span style="color:#007700;">); <br />
    </span><span style="color:#007700;"><br />
</span><span style="color:#0000bb;">?&gt;</span> </span></code></p>
<p>Pronto, desta forma isolamos a rotina para solucionar o problema de cálculo de fatorial e poderemos chamar esta rotina sempre que precisarmos. Esta é exatamente e idéia desta forma de programar, isolar soluções para problemas em funções podendo assim reutilizá-las. Isto nos poupa muito tempo e trabalho repetitivo além de deixar o código mais legível.</p>
<p>Porém atualmente outro paradigma de programação vem sendo amplamente adotado, forma esta que possui muitas facilidades e benefícios. É a Programação Orientada a Objetos. Esta baseia-se na criação e interação entre objetos. O que a POO tenta fazer é aproximar a solução de um problema computacional ao mundo real. Assim sendo, usar este paradigma facilitará a construção de sistemas de informação. Para entendê-lo mais a fundo vamos ver como funcionam os sistemas naturais. Por exemplo, o sistema respiratório. Vários órgãos(objetos) fazem parte dele e é a interação entre estes órgãos que possiblita o funcionamento deste sistema. Cada órgão é responsável por uma ou várias funções, e para realizar seu trabalho eles se “comunicam” trocando mensagens e até mesmo interagem com órgãos de outros sistemas de nosso organismo, permitindo assim que vivamos. No mundo da POO é isto que temos, objetos executando suas funções e trocando mensagens entre si, para que juntos formem um sistema computacional. Obviamente tais objetos não são “reais” mas sim são estruturas computacionais armazenadas na memória do computador ou em outro meio (Ex.: Bancos de dados). Agora que sabemos o que é POO, vamos conhecer mais a fundo outros conceitos envolvidos nisto, como o conceito de classe e objeto que abordaremos no próximo post.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lucassoler.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lucassoler.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lucassoler.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lucassoler.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lucassoler.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lucassoler.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lucassoler.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lucassoler.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lucassoler.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lucassoler.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lucassoler.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lucassoler.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lucassoler.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lucassoler.wordpress.com/81/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucassoler.wordpress.com&amp;blog=7649407&amp;post=81&amp;subd=lucassoler&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lucassoler.wordpress.com/2009/05/21/programacao-orientada-a-objetos-poo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a13b7e2242c5d5914a75668eace33317?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lsoler</media:title>
		</media:content>
	</item>
		<item>
		<title>PHP5 e Design Patterns(Padrões de Projeto) &#8211; Conceito de Design Patterns e exemplo com pattern Factory</title>
		<link>http://lucassoler.wordpress.com/2009/05/15/php5-e-design-patternspadroes-de-projeto-conceito-de-design-patterns-e-exemplo-com-pattern-factory/</link>
		<comments>http://lucassoler.wordpress.com/2009/05/15/php5-e-design-patternspadroes-de-projeto-conceito-de-design-patterns-e-exemplo-com-pattern-factory/#comments</comments>
		<pubDate>Fri, 15 May 2009 20:45:38 +0000</pubDate>
		<dc:creator>Lucas Soler</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[conceito design patterns]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[Factory]]></category>
		<category><![CDATA[padrões de projeto]]></category>
		<category><![CDATA[php padrão factory]]></category>
		<category><![CDATA[php padrões de projeto]]></category>
		<category><![CDATA[php5]]></category>

		<guid isPermaLink="false">http://lucassoler.wordpress.com/?p=67</guid>
		<description><![CDATA[Não é incomum ao desenvolvermos um sistema de informação encontrarmos várias vezes o mesmo problema de programação. A solução que muitos encontram é copiar e colar código. Em um projeto grande o que acaba acontecendo é que no MESMO sistema o MESMO problema é programado de forma diferente por cada programador. Isto realmente não é [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucassoler.wordpress.com&amp;blog=7649407&amp;post=67&amp;subd=lucassoler&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Não é incomum ao desenvolvermos um sistema de informação encontrarmos várias vezes o mesmo problema de programação. A solução que muitos encontram é copiar e colar código. Em um projeto grande o que acaba acontecendo é que no MESMO sistema o MESMO problema é programado de forma diferente por cada programador. Isto realmente não é uma boa solução. Por isto alguns programadores enfrentam um problemão quando precisam alterar ou continuar um projeto feito por outro que não seguiu padrão nenhum. Uma solução muito melhor e largamente aceita é o uso de Design Patterns (Padrões de Projeto). Um Design Pattern é um padrão para solução de um problema comum amplamente testado e aceito. Por isto, sempre que possível, é aconselhado o uso destes padrões, pois isto facilitará a manutenção e legibilidade de nosso código. Outra vantagem é que outros programadores (se conhecerem Padrões de Projeto) poderão continuar nossos trabalhos com facilidade já que conhecem a solução que adotamos. Assim sendo toda a equipe de desenvolvimento será beneficiada. Por esta razão os Design Patterns são considerados formas de descrever as melhores práticas em programação*.</p>
<p style="text-align:justify;">* Design Patterns não se referem apenas a padrões a serem usados em sistemas de informação. Outras áreas das ciências utilizam este conceito</p>
<p style="text-align:justify;">O próximo passo é conhecermos e implementarmos um design pattern como exemplo.</p>
<p style="text-align:justify;"><strong>Factory</strong></p>
<p style="text-align:justify;">Segundo a documentação do PHP &#8220;o padrão Factory permite a instanciação de objetos em tempo de execução. É chamado de Factory uma vez que é responsável por &#8216;produzir&#8217; um objeto. O Factory parametrizado recebe como argumento o nome da classe para instanciar.&#8221;<br />
Vamos agora implementar nosso próprio factory. Para isto criaremos uma classe chamada &#8216;FactoryPattern&#8217; com apenas um método estático &#8211; factory. Este método receberá como parâmetro o nome da classe para instanciar e retornará um novo objeto desta classe OU uma Exception caso o arquivo desta classe não seja encontrado. Criaremos assim um padrão factory exatamente aos moldes da solução proposta pela documentação do PHP.</p>
<p style="text-align:justify;">Na solução que produzi utilizei a classe RecursiveDirectoryIterator. A finalidade disto é explicada no próprio código da classe &#8216;FactoryPattern&#8217;. Caso você queira saber mais sobre DirectoryIterator <a href="http://lucassoler.wordpress.com/2009/05/07/percorrer-diretorio-php5/">clique aqui</a>.</p>
<p style="text-align:justify;">Obs.: Não foi incluída no código a classe &#8220;Cliente&#8221; usada no exemplo</p>
<p style="text-align:justify;"><code><span style="color:#000000;"><span style="color:#0000bb;">&lt;?php<br />
</span><span style="color:#ff8000;">/**<br />
 * Classe responsável pela criação dos objetos do sistema<br />
 * @author           Lucas Soler<br />
 * @copyright        Copyright 2009 Lucas Soler<br />
 * @package          www<br />
 * @subpackage       www<br />
 * @version          1.0<br />
 */ <br />
</span><span style="color:#007700;">class </span><span style="color:#0000bb;">FactoryPattern<br />
</span><span style="color:#007700;">{<br />
    </span><span style="color:#ff8000;">/**<br />
     * Cria um objeto da classe passada como parâmetro varrendo <br />
     * o diretório informado recursivamente em busca do arquivo da classe<br />
     * @access public <br />
     * @param string $class Classe do objeto a ser instanciado<br />
     * @exception A classe informada não foi localizada<br />
     * @return object Retorna um objeto genérico<br />
     */<br />
    </span><span style="color:#007700;">public static function </span><span style="color:#0000bb;">factory</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$classe</span><span style="color:#007700;">)<br />
    {<br />
        </span><span style="color:#ff8000;">//Nome do diretório onde estão as classes ou/e subdiretórios de classes do sistema. No nosso caso será o diretório "classes"<br />
        </span><span style="color:#0000bb;">$diretorio </span><span style="color:#007700;">= </span><span style="color:#dd0000;">"."</span><span style="color:#007700;">;<br />
        </span><span style="color:#0000bb;">$arqs </span><span style="color:#007700;">= new </span><span style="color:#0000bb;">RecursiveIteratorIterator</span><span style="color:#007700;">(new </span><span style="color:#0000bb;">RecursiveDirectoryIterator</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$diretorio</span><span style="color:#007700;">));<br />
        foreach(</span><span style="color:#0000bb;">$arqs </span><span style="color:#007700;">as </span><span style="color:#0000bb;">$name </span><span style="color:#007700;">=&gt; </span><span style="color:#0000bb;">$arq</span><span style="color:#007700;">){<br />
            if(</span><span style="color:#0000bb;">$arq</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">isFile</span><span style="color:#007700;">()){<br />
                </span><span style="color:#ff8000;">/* Se o arquivo corrente for o que armazena a classe <br />
                   do parâmetro um objeto desta classe é instanciado e retornado */<br />
                </span><span style="color:#007700;">if(</span><span style="color:#0000bb;">$arq</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getFilename</span><span style="color:#007700;">() == </span><span style="color:#0000bb;">$classe</span><span style="color:#007700;">.</span><span style="color:#dd0000;">".php" </span><span style="color:#007700;">|| </span><span style="color:#0000bb;">$arq</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getFilename</span><span style="color:#007700;">() == </span><span style="color:#0000bb;">$classe</span><span style="color:#007700;">.</span><span style="color:#dd0000;">".class.php"</span><span style="color:#007700;">){<br />
                    include_once </span><span style="color:#0000bb;">$arq</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getPathname</span><span style="color:#007700;">();    <br />
                    return new </span><span style="color:#0000bb;">$classe</span><span style="color:#007700;">;<br />
                }<br />
            }<br />
        }<br />
        </span><span style="color:#ff8000;">// Caso a classe não exista uma exceção é lançada <br />
        </span><span style="color:#007700;">throw new </span><span style="color:#0000bb;">Exception </span><span style="color:#007700;">(</span><span style="color:#dd0000;">"A classe {$classe} não foi encontrada!"</span><span style="color:#007700;">);<br />
    }</span></span></code></p>
<p style="text-align:justify;"><code><span style="color:#000000;"><span style="color:#007700;">}</span></span></code></p>
<p style="text-align:justify;"><code><span style="color:#000000;"></span></code><code><span style="color:#000000;"><span style="color:#0000bb;">$cliente </span><span style="color:#007700;">= </span><span style="color:#0000bb;">FactoryPattern</span><span style="color:#007700;">::</span><span style="color:#0000bb;">factory</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"Cliente"</span><span style="color:#007700;">);<br />
echo </span><span style="color:#0000bb;">$cliente</span><span style="color:#007700;">-&gt;__get(<span style="color:#dd0000;">"nome"</span></span><span style="color:#007700;">);</span><span style="color:#007700;"><br />
</span><span style="color:#0000bb;">?&gt;</span> </span></code></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lucassoler.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lucassoler.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lucassoler.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lucassoler.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lucassoler.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lucassoler.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lucassoler.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lucassoler.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lucassoler.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lucassoler.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lucassoler.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lucassoler.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lucassoler.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lucassoler.wordpress.com/67/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucassoler.wordpress.com&amp;blog=7649407&amp;post=67&amp;subd=lucassoler&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lucassoler.wordpress.com/2009/05/15/php5-e-design-patternspadroes-de-projeto-conceito-de-design-patterns-e-exemplo-com-pattern-factory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a13b7e2242c5d5914a75668eace33317?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lsoler</media:title>
		</media:content>
	</item>
		<item>
		<title>Transformar objeto em XML utilizando ReflectionClass</title>
		<link>http://lucassoler.wordpress.com/2009/05/12/transformar-objeto-em-xml-utilizando-reflectionclass/</link>
		<comments>http://lucassoler.wordpress.com/2009/05/12/transformar-objeto-em-xml-utilizando-reflectionclass/#comments</comments>
		<pubDate>Tue, 12 May 2009 03:08:14 +0000</pubDate>
		<dc:creator>Lucas Soler</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[transformar]]></category>
		<category><![CDATA[objeto]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[ReflectionClass]]></category>
		<category><![CDATA[persistencia]]></category>
		<category><![CDATA[persistir]]></category>
		<category><![CDATA[reflexão]]></category>

		<guid isPermaLink="false">http://lucassoler.wordpress.com/?p=49</guid>
		<description><![CDATA[Neste post mostrarei como transformar um objeto em XML com o auxílio da API para reflexão de objetos que o PHP5 nos fornece. Primeiramente, vamos entender para que serve uma classe de reflexão. Uma classe assim nos permite obter informações de classes, interfaces, métodos etc. Por exemplo, podemos conhecer todos atributos de um objeto, os [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucassoler.wordpress.com&amp;blog=7649407&amp;post=49&amp;subd=lucassoler&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Neste post mostrarei como transformar um objeto em XML com o auxílio da API para reflexão de objetos que o PHP5 nos fornece.</p>
<p style="text-align:justify;">Primeiramente, vamos entender para que serve uma classe de reflexão. Uma classe assim nos permite obter informações de classes, interfaces, métodos etc. Por exemplo, podemos conhecer todos atributos de um objeto, os valores deles, qual a sua visibilidade (public, private ou protected) dentre outras informações.  Além disto conseguimos obter também seus métodos e invocá-los. Sabendo disto vamos utilizar agora a classe ReflectionClass para conseguirmos uma reflexão de nossos objetos e assim gerar conteúdo XML contendo os dados deles. Vamos criar uma classe &#8220;Xml&#8221; com um método chamado toXml(). Todas as outras classes criadas herdarão os comportamentos de &#8220;Xml&#8221;, e assim os objetos instanciados apartir delas poderão se transformar em conteúdo XML. Para poder ser convertido para XML o objeto terá que ter o método mágico __get.</p>
<p style="text-align:justify;">Uma das aplicações que vejo para isto é a persistência de objetos. Em determinado momento geralmente precisaremos manter nossos objetos em um meio externo a aplicação. O método mais usado para isto é guardá-los em um banco de dados. Mas as vezes temos uma aplicação tão pequena que nem precisamos de um banco de dados. Assim sendo podemos persistir nossas informações em um arquivo XML. Usando o método toXml() isto ficará mais fácil!</p>
<p><code><span style="color:#000000;"><span style="color:#0000bb;">&lt;?php<br />
</span><span style="color:#ff8000;">/**<br />
 * A classe XML serve para criar e manipular XML<br />
 * @author           Lucas Soler<br />
 * @copyright        Copyright 2009 Lucas Soler<br />
 * @package          www<br />
 * @subpackage       www<br />
 * @version          1.0<br />
 */ <br />
</span><span style="color:#007700;">class </span><span style="color:#0000bb;">Xml</span><span style="color:#007700;">{<br />
    </span><span style="color:#ff8000;">/**<br />
     * Transforma um objeto em XML<br />
     * @access public <br />
     * @return string O objeto em formato XML<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">toXml</span><span style="color:#007700;">(){<br />
        </span><span style="color:#0000bb;">$obj </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">;<br />
        </span><span style="color:#ff8000;">//A classe ReflectionClass permite fazer a engenharia-reversa da classe <br />
        </span><span style="color:#0000bb;">$classe </span><span style="color:#007700;">= new </span><span style="color:#0000bb;">ReflectionClass</span><span style="color:#007700;">(</span><span style="color:#0000bb;">get_class</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$obj</span><span style="color:#007700;">));<br />
        </span><span style="color:#0000bb;">$metodoGet </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$classe</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getMethod</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"__get"</span><span style="color:#007700;">);<br />
        </span><span style="color:#0000bb;">$atributos </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$classe</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getProperties</span><span style="color:#007700;">();<br />
        </span><span style="color:#0000bb;">$xml </span><span style="color:#007700;">.= </span><span style="color:#dd0000;">"\t&lt;"</span><span style="color:#007700;">.</span><span style="color:#0000bb;">$classe</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getName</span><span style="color:#007700;">().</span><span style="color:#dd0000;">"&gt;\n"</span><span style="color:#007700;">;    <br />
        foreach(</span><span style="color:#0000bb;">$atributos </span><span style="color:#007700;">as </span><span style="color:#0000bb;">$att</span><span style="color:#007700;">){<br />
            </span><span style="color:#0000bb;">$xml </span><span style="color:#007700;">.= </span><span style="color:#dd0000;">"\t\t&lt;"</span><span style="color:#007700;">.</span><span style="color:#0000bb;">$att</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getName</span><span style="color:#007700;">().</span><span style="color:#dd0000;">"&gt;"</span><span style="color:#007700;">;<br />
            </span><span style="color:#0000bb;">$xml </span><span style="color:#007700;">.= </span><span style="color:#0000bb;">$metodoGet</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">invoke</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$obj</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$att</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getName</span><span style="color:#007700;">());<br />
            </span><span style="color:#0000bb;">$xml </span><span style="color:#007700;">.= </span><span style="color:#dd0000;">"&lt;/"</span><span style="color:#007700;">.</span><span style="color:#0000bb;">$att</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getName</span><span style="color:#007700;">().</span><span style="color:#dd0000;">"&gt;\n"</span><span style="color:#007700;">;<br />
        }<br />
        </span><span style="color:#0000bb;">$xml </span><span style="color:#007700;">.= </span><span style="color:#dd0000;">"\t&lt;/"</span><span style="color:#007700;">.</span><span style="color:#0000bb;">$classe</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getName</span><span style="color:#007700;">().</span><span style="color:#dd0000;">"&gt;\n"</span><span style="color:#007700;">;    <br />
        return </span><span style="color:#0000bb;">$xml</span><span style="color:#007700;">;<br />
    }<br />
}</span></span></code></p>
<p><code><span style="color:#000000;"><span style="color:#ff8000;">/**<br />
 * Esta classe é responsável pela criação de uma pessoa<br />
 * @author           Lucas Soler<br />
 * @copyright        Copyright 2009 Lucas Soler<br />
 * @package          www<br />
 * @subpackage       www<br />
 * @version          1.0<br />
 */ <br />
</span><span style="color:#007700;">class </span><span style="color:#0000bb;">Pessoa </span><span style="color:#007700;">extends </span><span style="color:#0000bb;">Xml</span><span style="color:#007700;">{<br />
   </span><span style="color:#ff8000;">/**<br />
     * Recebe o nome da pessoa<br />
     * @access private<br />
     * @name $nome<br />
     */ <br />
    </span><span style="color:#007700;">protected </span><span style="color:#0000bb;">$nome</span><span style="color:#007700;">;<br />
    </span><span style="color:#ff8000;">/**<br />
     * Recebe a data de nascimento da pessoa<br />
     * @access private<br />
     * @name $dtNascimento<br />
     */ <br />
    </span><span style="color:#007700;">protected </span><span style="color:#0000bb;">$dtNascimento</span><span style="color:#007700;">;<br />
    </span><span style="color:#ff8000;">/**<br />
     * Recebe o peso da pessoa<br />
     * @access private<br />
     * @name $peso<br />
     */ <br />
    </span><span style="color:#007700;">protected </span><span style="color:#0000bb;">$peso</span><span style="color:#007700;">;<br />
    </span><span style="color:#ff8000;">/**<br />
     * Recebe a altura da pessoa<br />
     * @access private<br />
     * @name $altura<br />
     */ <br />
    </span><span style="color:#007700;">protected </span><span style="color:#0000bb;">$altura</span><span style="color:#007700;">;<br />
    <br />
    </span><span style="color:#ff8000;">/**<br />
     * Cria a pessoa atribuindo a ela um nome, uma data de nascimento, um peso e uma altura<br />
     * @access public <br />
     * @param string $nome Nome do cachorro<br />
     * @param string $peso Peso do cachorro<br />
     * @return void<br />
     */<br />
    </span><span style="color:#007700;">function </span><span style="color:#0000bb;">__construct</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$nome</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$dtNascimento</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$peso</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$altura</span><span style="color:#007700;">){<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">__set</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"nome"</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$nome</span><span style="color:#007700;">);<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">__set</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"dtNascimento"</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$dtNascimento</span><span style="color:#007700;">);<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">__set</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"peso"</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$peso</span><span style="color:#007700;">);<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">__set</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"altura"</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$altura</span><span style="color:#007700;">);<br />
    }</span></span></code></p>
<p><code><span style="color:#000000;"><span style="color:#007700;">    </span><span style="color:#ff8000;">/**<br />
     * Método mágico __set. Atribui valor a qualquer atributo<br />
     * @access public <br />
     * @param string $nm Nome do atributo<br />
     * @param mixed $value Valor para o atributo<br />
     * @return void<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">__set</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$nm</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$value</span><span style="color:#007700;">)<br />
    {<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">$nm </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$value</span><span style="color:#007700;">;<br />
    }</span></span></code></p>
<p><code><span style="color:#000000;"><span style="color:#007700;">    </span><span style="color:#ff8000;">/**<br />
     * Método mágico __get. Retorna o valor de qualquer atributo<br />
     * @access public <br />
     * @param string $nm Nome do atributo<br />
     * @return mixed O valor do atributo passado como parâmetro (pode ser de qualquer tipo)<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">__get</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$nm</span><span style="color:#007700;">)<br />
    {<br />
        return </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">$nm</span><span style="color:#007700;">;<br />
    }</span></span></code></p>
<p><code><span style="color:#000000;"><span style="color:#007700;">}</span></span></code></p>
<p><code><span style="color:#000000;"><span style="color:#0000bb;"><code><span style="color:#000000;"><span style="color:#007700;">try { </span></span></code></span></span></code></p>
<p><code><span style="color:#000000;"><span style="color:#0000bb;"><code><span style="color:#000000;"><span style="color:#007700;">    </span></span></code>$pessoas </span><span style="color:#007700;">= array();<br />
    </span><span style="color:#ff8000;">/* Se o arquivo pessoas.xml já existir, todas pessoas <br />
       persistidas são carregadas na memória e guardadas na coleção $pessoas */<br />
    </span><span style="color:#007700;">if(</span><span style="color:#0000bb;">is_file</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"pessoas.xml"</span><span style="color:#007700;">)){<br />
        </span><span style="color:#ff8000;">//Transforma o arquivo XML em uma coleção de objetos<br />
        </span><span style="color:#0000bb;">$xml </span><span style="color:#007700;">= </span><span style="color:#0000bb;">simplexml_load_file</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"pessoas.xml"</span><span style="color:#007700;">);<br />
        </span><span style="color:#ff8000;">//Percorre a coleção de objetos já persistidos e cria uma coleção de objetos "Pessoa".<br />
        </span><span style="color:#007700;">foreach(</span><span style="color:#0000bb;">$xml </span><span style="color:#007700;">as </span><span style="color:#0000bb;">$pessoa</span><span style="color:#007700;">){<br />
            </span><span style="color:#0000bb;">$pessoas</span><span style="color:#007700;">[</span><span style="color:#dd0000;">"$pessoa-&gt;nome"</span><span style="color:#007700;">] = new </span><span style="color:#0000bb;">Pessoa</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$pessoa</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">nome</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$pessoa</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">dtNascimento</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$pessoa</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">peso</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$pessoa</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">altura</span><span style="color:#007700;">);<br />
        }<br />
    }<br />
    </span><span style="color:#ff8000;">//Criação de uma nova coleção ($novasPessoas) caso as pessoas indicadas ainda não existam no XML<br />
    </span><span style="color:#007700;">if(!</span><span style="color:#0000bb;">$pessoas</span><span style="color:#007700;">[</span><span style="color:#dd0000;">'Lucas Soler'</span><span style="color:#007700;">]){<br />
        </span><span style="color:#0000bb;">$lucas </span><span style="color:#007700;">= new </span><span style="color:#0000bb;">Pessoa</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"Lucas Soler"</span><span style="color:#007700;">,</span><span style="color:#dd0000;">"16/02/1986"</span><span style="color:#007700;">,</span><span style="color:#dd0000;">"79"</span><span style="color:#007700;">,</span><span style="color:#dd0000;">"1.77"</span><span style="color:#007700;">);<br />
        </span><span style="color:#0000bb;">$novasPessoas</span><span style="color:#007700;">[] = </span><span style="color:#0000bb;">$lucas</span><span style="color:#007700;">;<br />
    }<br />
    if(!</span><span style="color:#0000bb;">$pessoas</span><span style="color:#007700;">[</span><span style="color:#dd0000;">'Suemi Shimizu'</span><span style="color:#007700;">]){<br />
        </span><span style="color:#0000bb;">$suemi </span><span style="color:#007700;">= new </span><span style="color:#0000bb;">Pessoa</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"Suemi Shimizu"</span><span style="color:#007700;">,</span><span style="color:#dd0000;">"20/08/1987"</span><span style="color:#007700;">,</span><span style="color:#dd0000;">"54"</span><span style="color:#007700;">,</span><span style="color:#dd0000;">"1.73"</span><span style="color:#007700;">);<br />
        </span><span style="color:#0000bb;">$novasPessoas</span><span style="color:#007700;">[] = </span><span style="color:#0000bb;">$suemi</span><span style="color:#007700;">;<br />
    }<br />
    </span><span style="color:#ff8000;">//Caso existam novas pessoas o arquivo onde estão persistidos os objetos é reescrito<br />
    </span><span style="color:#007700;">if(!empty(</span><span style="color:#0000bb;">$novasPessoas</span><span style="color:#007700;">)){<br />
        </span><span style="color:#0000bb;">$fp </span><span style="color:#007700;">= </span><span style="color:#0000bb;">fopen</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"pessoas.xml"</span><span style="color:#007700;">,</span><span style="color:#dd0000;">"w+"</span><span style="color:#007700;">); <br />
        </span><span style="color:#0000bb;">$pessoas </span><span style="color:#007700;">= </span><span style="color:#0000bb;">array_merge</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$pessoas</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$novasPessoas</span><span style="color:#007700;">);<br />
        </span><span style="color:#0000bb;">fwrite</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$fp</span><span style="color:#007700;">,</span><span style="color:#dd0000;">"&lt;?xml version='1.0' encoding='ISO-8859-1'?&gt;\n"</span><span style="color:#007700;">);<br />
        </span><span style="color:#0000bb;">fwrite</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$fp</span><span style="color:#007700;">,</span><span style="color:#dd0000;">"&lt;Pessoas&gt;\n"</span><span style="color:#007700;">);<br />
        foreach(</span><span style="color:#0000bb;">$pessoas </span><span style="color:#007700;">as </span><span style="color:#0000bb;">$pessoa</span><span style="color:#007700;">){<br />
            </span><span style="color:#0000bb;">fwrite</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$fp</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$pessoa</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">toXml</span><span style="color:#007700;">());<br />
        }    <br />
        </span><span style="color:#0000bb;">fwrite</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$fp</span><span style="color:#007700;">,</span><span style="color:#dd0000;">"&lt;/Pessoas&gt;"</span><span style="color:#007700;">);<br />
    }<br />
    <br />
} catch(</span><span style="color:#0000bb;">Exception $exception</span><span style="color:#007700;">) {<br />
    echo </span><span style="color:#0000bb;">$exception</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getMessage</span><span style="color:#007700;">();<br />
}<br />
</span><span style="color:#007700;"><br />
</span><span style="color:#0000bb;">?&gt; </span></span></code></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lucassoler.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lucassoler.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lucassoler.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lucassoler.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lucassoler.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lucassoler.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lucassoler.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lucassoler.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lucassoler.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lucassoler.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lucassoler.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lucassoler.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lucassoler.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lucassoler.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucassoler.wordpress.com&amp;blog=7649407&amp;post=49&amp;subd=lucassoler&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lucassoler.wordpress.com/2009/05/12/transformar-objeto-em-xml-utilizando-reflectionclass/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a13b7e2242c5d5914a75668eace33317?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lsoler</media:title>
		</media:content>
	</item>
		<item>
		<title>Percorrendo diretórios através da classe DirectoryIterator do PHP5</title>
		<link>http://lucassoler.wordpress.com/2009/05/07/percorrer-diretorio-php5/</link>
		<comments>http://lucassoler.wordpress.com/2009/05/07/percorrer-diretorio-php5/#comments</comments>
		<pubDate>Thu, 07 May 2009 21:33:19 +0000</pubDate>
		<dc:creator>Lucas Soler</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[diretórios]]></category>
		<category><![CDATA[iterar]]></category>
		<category><![CDATA[Iterators]]></category>
		<category><![CDATA[percorrer]]></category>

		<guid isPermaLink="false">http://lucassoler.wordpress.com/?p=32</guid>
		<description><![CDATA[Quando ainda estávamos na era do PHP4 e criávamos um código para percorrer um diretório, nosso produto final ficava mais ou menos assim: &#60;?php //Abre o diretório do arquivo atual $pasta = opendir(getcwd()); //Cria um loop para percorrer todos os registros de um diretório while (($arquivo = readdir($pasta)) !== false) {     echo $arquivo."&#60;br /&#62;"; } //Fecha o diretório closedir($pasta); ?&#62; Já no PHP5 contamos com o advento dos Iterators, objetos que nos permitem percorrer uma [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucassoler.wordpress.com&amp;blog=7649407&amp;post=32&amp;subd=lucassoler&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Quando ainda estávamos na era do PHP4 e criávamos um código para percorrer um diretório, nosso produto final ficava mais ou menos assim:</p>
<p><code><span style="color:#000000;"><span style="color:#0000bb;">&lt;?php<br />
</span><span style="color:#ff8000;">//Abre o diretório do arquivo atual<br />
</span><span style="color:#0000bb;">$pasta </span><span style="color:#007700;">= </span><span style="color:#0000bb;">opendir</span><span style="color:#007700;">(</span><span style="color:#0000bb;">getcwd</span><span style="color:#007700;">());<br />
</span><span style="color:#ff8000;">//Cria um loop para percorrer todos os registros de um diretório<br />
</span><span style="color:#007700;">while ((</span><span style="color:#0000bb;">$arquivo </span><span style="color:#007700;">= </span><span style="color:#0000bb;">readdir</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$pasta</span><span style="color:#007700;">)) !== </span><span style="color:#0000bb;">false</span><span style="color:#007700;">) {<br />
    echo </span><span style="color:#0000bb;">$arquivo</span><span style="color:#007700;">.</span><span style="color:#dd0000;">"&lt;br /&gt;"</span><span style="color:#007700;">;<br />
}<br />
</span><span style="color:#ff8000;">//Fecha o diretório<br />
</span><span style="color:#0000bb;">closedir</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$pasta</span><span style="color:#007700;">);</span></span></code></p>
<p><code><span style="color:#000000;"><span style="color:#0000bb;">?&gt;</span></span></code></p>
<p style="text-align:justify;">Já no PHP5 contamos com o advento dos Iterators, objetos que nos permitem percorrer uma cadeia de dados(esta definição não serve para a interface Iterator). Uma das classes nativas do PHP5 que implementa a interface Iterator é DirectoryIterator. A classe DirectoryIterator nos possibilita percorrer um diretório tratando o arquivo da iteração corrente como um objeto e podemos assim por exemplo obter o nome de um arquivo, seu tamanho e tipo através de métodos.  Abaixo segue um exemplo de iteração de um diretório por meio de um objeto proveniente de DirectoryIterator. A cada iteração mostraremos o nome e o tipo do arquivo corrente.</p>
<p><code><span style="color:#000000;"><span style="color:#007700;">foreach(new </span><span style="color:#0000bb;">DirectoryIterator</span><span style="color:#007700;">(</span></span></code><code><span style="color:#000000;"><span style="color:#0000bb;">getcwd</span><span style="color:#007700;">()</span></span></code><code><span style="color:#000000;"><span style="color:#007700;">) as </span><span style="color:#0000bb;">$arq</span><span style="color:#007700;">){<br />
    echo </span><span style="color:#0000bb;">$arq</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getFilename</span><span style="color:#007700;">().</span><span style="color:#dd0000;">' - '</span><span style="color:#007700;">.</span><span style="color:#0000bb;">$arq</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getType</span><span style="color:#007700;">().</span><span style="color:#dd0000;">"&lt;br/&gt;"</span><span style="color:#007700;">;<br />
} </span></span></code></p>
<p style="text-align:justify;">Uma solução com certeza mais elegante!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lucassoler.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lucassoler.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lucassoler.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lucassoler.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lucassoler.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lucassoler.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lucassoler.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lucassoler.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lucassoler.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lucassoler.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lucassoler.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lucassoler.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lucassoler.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lucassoler.wordpress.com/32/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucassoler.wordpress.com&amp;blog=7649407&amp;post=32&amp;subd=lucassoler&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lucassoler.wordpress.com/2009/05/07/percorrer-diretorio-php5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a13b7e2242c5d5914a75668eace33317?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lsoler</media:title>
		</media:content>
	</item>
		<item>
		<title>Primeiro post &#8211; Convertendo datas com PHP</title>
		<link>http://lucassoler.wordpress.com/2009/05/06/converter-data-php/</link>
		<comments>http://lucassoler.wordpress.com/2009/05/06/converter-data-php/#comments</comments>
		<pubDate>Wed, 06 May 2009 22:10:51 +0000</pubDate>
		<dc:creator>Lucas Soler</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[converter]]></category>
		<category><![CDATA[data]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Este primeiro post servirá apenas para uma aquecimento e mostrará o método que sempre vou usar em meus exemplos. Sempre definirei um problema claramente e em seguida mostrarei uma solução possível (digo &#8220;uma&#8221; porque cada programador pode ter uma solução diferente para o mesmo problema) usando a programação orientada ao objeto(POO). Com o passar do [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucassoler.wordpress.com&amp;blog=7649407&amp;post=1&amp;subd=lucassoler&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Este primeiro post servirá apenas para uma aquecimento e mostrará o método que sempre vou usar em meus exemplos. Sempre definirei um problema claramente e em seguida mostrarei uma solução possível (digo &#8220;uma&#8221; porque cada programador pode ter uma solução diferente para o mesmo problema) usando a programação orientada ao objeto(POO). Com o passar do tempo vou inserir no blog fundamentos de programação e de POO para que mesmo os iniciantes nestas técnicas possam tirar proveito do material aqui disponibilizado.</p>
<p style="text-align:justify;"><strong>Primeira classe</strong><strong></strong></p>
<p style="text-align:justify;">Para começar vamos resolver um pequeno problema comum nos programas que registram datas em bancos de dados. Nossos usuários brasileiros digitam datas no formato brasileiro(dd/mm/aaaa) ou nossas interfaces com o usuário tratam as datas para que fiquem neste formato. Mas o formato padrão para armazenarmos esta informação em um BD é o formato americano (aaaa-mm-dd). Os frameworks para PHP possuem API para tratar isto, mas como só vamos exercitar algumas técnicas de POO e queremos neste caso resolver nossos próprios problemas vamos implementar uma classe chamada Data que nos proverá uma API para validarmos e convertermos uma data. Poderemos assim  tanto converter uma data para formato banco quanto transformar uma vinda do banco para formato brasileiro (embora isto seja possível com SQL). Outra funcionalidade interessante da classe é que ela validará a data gerando exceções caso necessário.<code><span style="color:#000000;"> </span></code></p>
<p><code><span style="color:#000000;"><span style="color:#0000bb;">&lt;?php<br />
</span><span style="color:#ff8000;">/**<br />
 * Esta classe é responsável pela validação e conversão de uma data<br />
 * @author           Lucas Soler<br />
 * @copyright        Copyright 2009 Lucas Soler<br />
 * @package          www<br />
 * @subpackage       www<br />
 * @version          1.0<br />
 */ <br />
</span><span style="color:#007700;">class </span><span style="color:#0000bb;">Data</span><span style="color:#007700;">{<br />
    </span><span style="color:#ff8000;">/**<br />
     * Recebe a data a ser validada ou convertida<br />
     * @access private<br />
     * @name $data<br />
     */ <br />
    </span><span style="color:#007700;">private </span><span style="color:#0000bb;">$data</span><span style="color:#007700;">;<br />
    </span><span style="color:#ff8000;">/**<br />
     * Recebe o tipo do formato da data recebida. Pode ser 'br'(brasileiro) ou 'usa' (americano)<br />
     * @access private<br />
     * @name $tipo<br />
     */ <br />
    </span><span style="color:#007700;">private </span><span style="color:#0000bb;">$tipo</span><span style="color:#007700;">;<br />
    </span><span style="color:#ff8000;">/**<br />
     * Array que recebe a posição do dia,mês e ano dos formatos 'br' e 'usa' no atributo $data <br />
     * @access private<br />
     * @name $formatos<br />
     */ <br />
    </span><span style="color:#007700;">private </span><span style="color:#0000bb;">$formatos</span><span style="color:#007700;">;<br />
    <br />
    </span><span style="color:#ff8000;">/**<br />
     * Atribui um valor inicial na criação do objeto Data para os atributos $data e $tipo<br />
     * @access public <br />
     * @param string $data Data a ser manipulada ou validada<br />
     * @param string $tipo Tipo do formato da data recebida. Pode ser 'br'(brasileiro) ou 'usa' (americano)<br />
     * @return void<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">__construct</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$data</span><span style="color:#007700;">,</span><span style="color:#0000bb;">$tipo</span><span style="color:#007700;">){<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">data </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$data</span><span style="color:#007700;">;<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">tipo </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$tipo</span><span style="color:#007700;">;<br />
        </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">formatos </span><span style="color:#007700;">= array(</span><span style="color:#dd0000;">"br" </span><span style="color:#007700;">=&gt; array(</span><span style="color:#dd0000;">"dia" </span><span style="color:#007700;">=&gt; array(</span><span style="color:#0000bb;">0</span><span style="color:#007700;">,</span><span style="color:#0000bb;">2</span><span style="color:#007700;">),<br />
                                              </span><span style="color:#dd0000;">"mes" </span><span style="color:#007700;">=&gt; array(</span><span style="color:#0000bb;">3</span><span style="color:#007700;">,</span><span style="color:#0000bb;">2</span><span style="color:#007700;">),<br />
                                              </span><span style="color:#dd0000;">"ano" </span><span style="color:#007700;">=&gt; array(</span><span style="color:#0000bb;">6</span><span style="color:#007700;">,</span><span style="color:#0000bb;">4</span><span style="color:#007700;">)),<br />
                                </span><span style="color:#dd0000;">"usa" </span><span style="color:#007700;">=&gt; array(</span><span style="color:#dd0000;">"dia" </span><span style="color:#007700;">=&gt; array(</span><span style="color:#0000bb;">8</span><span style="color:#007700;">,</span><span style="color:#0000bb;">2</span><span style="color:#007700;">),<br />
                                               </span><span style="color:#dd0000;">"mes" </span><span style="color:#007700;">=&gt; array(</span><span style="color:#0000bb;">5</span><span style="color:#007700;">,</span><span style="color:#0000bb;">2</span><span style="color:#007700;">),<br />
                                               </span><span style="color:#dd0000;">"ano" </span><span style="color:#007700;">=&gt; array(</span><span style="color:#0000bb;">0</span><span style="color:#007700;">,</span><span style="color:#0000bb;">4</span><span style="color:#007700;">)));<br />
    }<br />
    <br />
    </span><span style="color:#ff8000;">/**<br />
     * Verifica se o atributo $data contém uma data válida<br />
     * @access public <br />
     * @return boolean<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">ehValida</span><span style="color:#007700;">(){<br />
        if(</span><span style="color:#0000bb;">strlen</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">data</span><span style="color:#007700;">) == </span><span style="color:#0000bb;">10</span><span style="color:#007700;">){<br />
            </span><span style="color:#0000bb;">$arrayData </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">dataParaFormato</span><span style="color:#007700;">();<br />
            if(</span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">verificaDia</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$arrayData</span><span style="color:#007700;">[</span><span style="color:#dd0000;">"dia"</span><span style="color:#007700;">]) &amp;&amp; <br />
               </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">verificaMes</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$arrayData</span><span style="color:#007700;">[</span><span style="color:#dd0000;">"mes"</span><span style="color:#007700;">]) &amp;&amp; <br />
               </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">verificaAno</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$arrayData</span><span style="color:#007700;">[</span><span style="color:#dd0000;">"ano"</span><span style="color:#007700;">]))<br />
                return </span><span style="color:#0000bb;">true</span><span style="color:#007700;">;<br />
        }<br />
        throw new </span><span style="color:#0000bb;">Exception</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"Data inválida para o formato '{$this-&gt;tipo}'"</span><span style="color:#007700;">);<br />
    }</span><span style="color:#ff8000;">/**<br />
     * Converte o atributo $data para o formato americano yyyy-mm-dd<br />
     * @access public <br />
     * @return string Data convertida para formato americano<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">dataParaUsa</span><span style="color:#007700;">(){<br />
        if(</span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">ehValida</span><span style="color:#007700;">()){<br />
            </span><span style="color:#0000bb;">$arrayData </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">dataParaFormato</span><span style="color:#007700;">();<br />
            return </span><span style="color:#dd0000;">"{$arrayData[ano]}-{$arrayData[mes]}-{$arrayData[dia]}"</span><span style="color:#007700;">;<br />
        }<br />
    }<br />
    <br />
    </span><span style="color:#ff8000;">/**<br />
     * Converte o atributo $data para o formato brasileiro dd/mm/yyyy<br />
     * @access public <br />
     * @return string Data convertida para formato brasileiro<br />
     */<br />
    </span><span style="color:#007700;">public function </span><span style="color:#0000bb;">dataParaBr</span><span style="color:#007700;">(){<br />
        if(</span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">ehValida</span><span style="color:#007700;">()){<br />
            </span><span style="color:#0000bb;">$arrayData </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">dataParaFormato</span><span style="color:#007700;">();<br />
            return </span><span style="color:#dd0000;">"{$arrayData[dia]}/{$arrayData[mes]}/{$arrayData[ano]}"</span><span style="color:#007700;">;<br />
        }<br />
    }<br />
    <br />
    </span><span style="color:#ff8000;">/**<br />
     * Converte o atributo $data do formato string para um array com dia, mes e ano<br />
     * @access private <br />
     * @return array Data convertida para array<br />
     */<br />
    </span><span style="color:#007700;">private function </span><span style="color:#0000bb;">dataParaFormato</span><span style="color:#007700;">(){<br />
        </span><span style="color:#0000bb;">$formato </span><span style="color:#007700;">= </span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">formatos</span><span style="color:#007700;">[</span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">tipo</span><span style="color:#007700;">];<br />
        if(</span><span style="color:#0000bb;">is_array</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$formato</span><span style="color:#007700;">)){<br />
            </span><span style="color:#0000bb;">$ano </span><span style="color:#007700;">= </span><span style="color:#0000bb;">substr</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">data</span><span style="color:#007700;">, </span><span style="color:#0000bb;">$formato</span><span style="color:#007700;">[</span><span style="color:#0000bb;">ano</span><span style="color:#007700;">][</span><span style="color:#0000bb;">0</span><span style="color:#007700;">],</span><span style="color:#0000bb;">$formato</span><span style="color:#007700;">[</span><span style="color:#0000bb;">ano</span><span style="color:#007700;">][</span><span style="color:#0000bb;">1</span><span style="color:#007700;">]);<br />
            </span><span style="color:#0000bb;">$mes </span><span style="color:#007700;">= </span><span style="color:#0000bb;">substr</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">data</span><span style="color:#007700;">, </span><span style="color:#0000bb;">$formato</span><span style="color:#007700;">[</span><span style="color:#0000bb;">mes</span><span style="color:#007700;">][</span><span style="color:#0000bb;">0</span><span style="color:#007700;">],</span><span style="color:#0000bb;">$formato</span><span style="color:#007700;">[</span><span style="color:#0000bb;">mes</span><span style="color:#007700;">][</span><span style="color:#0000bb;">1</span><span style="color:#007700;">]);<br />
            </span><span style="color:#0000bb;">$dia </span><span style="color:#007700;">= </span><span style="color:#0000bb;">substr</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$this</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">data</span><span style="color:#007700;">, </span><span style="color:#0000bb;">$formato</span><span style="color:#007700;">[</span><span style="color:#0000bb;">dia</span><span style="color:#007700;">][</span><span style="color:#0000bb;">0</span><span style="color:#007700;">],</span><span style="color:#0000bb;">$formato</span><span style="color:#007700;">[</span><span style="color:#0000bb;">dia</span><span style="color:#007700;">][</span><span style="color:#0000bb;">1</span><span style="color:#007700;">]);<br />
            return array(</span><span style="color:#dd0000;">"dia" </span><span style="color:#007700;">=&gt; </span><span style="color:#0000bb;">$dia</span><span style="color:#007700;">,</span><span style="color:#dd0000;">"mes" </span><span style="color:#007700;">=&gt; </span><span style="color:#0000bb;">$mes</span><span style="color:#007700;">,</span><span style="color:#dd0000;">"ano" </span><span style="color:#007700;">=&gt; </span><span style="color:#0000bb;">$ano</span><span style="color:#007700;">);<br />
        }<br />
        throw new </span><span style="color:#0000bb;">Exception</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"Formato inexistente para o tipo '{$this-&gt;tipo}'"</span><span style="color:#007700;">);<br />
    }</span><span style="color:#ff8000;">/**<br />
     * Verifica se o parâmetro $dia é um dia válido<br />
     * @access private <br />
     * @param string $dia Dia a ser validado<br />
     * @return boolean<br />
     */<br />
    </span><span style="color:#007700;">private function </span><span style="color:#0000bb;">verificaDia</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$dia</span><span style="color:#007700;">){<br />
        </span><span style="color:#0000bb;">$dia </span><span style="color:#007700;">= (int) </span><span style="color:#0000bb;">$dia</span><span style="color:#007700;">;<br />
        if((</span><span style="color:#0000bb;">is_int</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$dia</span><span style="color:#007700;">)) &amp;&amp; (</span><span style="color:#0000bb;">$dia </span><span style="color:#007700;">&gt; </span><span style="color:#0000bb;">0 </span><span style="color:#007700;">&amp;&amp; </span><span style="color:#0000bb;">$dia </span><span style="color:#007700;">&lt;= </span><span style="color:#0000bb;">31</span><span style="color:#007700;">))<br />
            return </span><span style="color:#0000bb;">true</span><span style="color:#007700;">;<br />
        return </span><span style="color:#0000bb;">false</span><span style="color:#007700;">;<br />
    }<br />
    </span><span style="color:#ff8000;">/**<br />
     * Verifica se o parâmetro $mes é um mês válido<br />
     * @access private <br />
     * @param string $mes Mês a ser validado<br />
     * @return boolean<br />
     */<br />
    </span><span style="color:#007700;">private function </span><span style="color:#0000bb;">verificaMes</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$mes</span><span style="color:#007700;">){<br />
        </span><span style="color:#0000bb;">$mes </span><span style="color:#007700;">= (int) </span><span style="color:#0000bb;">$mes</span><span style="color:#007700;">;<br />
        if((</span><span style="color:#0000bb;">is_int</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$mes</span><span style="color:#007700;">)) &amp;&amp; (</span><span style="color:#0000bb;">$mes </span><span style="color:#007700;">&gt; </span><span style="color:#0000bb;">0 </span><span style="color:#007700;">&amp;&amp; </span><span style="color:#0000bb;">$mes </span><span style="color:#007700;">&lt;= </span><span style="color:#0000bb;">12</span><span style="color:#007700;">))<br />
            return </span><span style="color:#0000bb;">true</span><span style="color:#007700;">;<br />
        return </span><span style="color:#0000bb;">false</span><span style="color:#007700;">;<br />
    }<br />
    </span><span style="color:#ff8000;">/**<br />
     * Verifica se o parâmetro $ano é um ano válido<br />
     * @access private <br />
     * @param string $ano Ano a ser validado<br />
     * @return boolean<br />
     */<br />
    </span><span style="color:#007700;">private function </span><span style="color:#0000bb;">verificaAno</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$ano</span><span style="color:#007700;">){<br />
        </span><span style="color:#0000bb;">$ano </span><span style="color:#007700;">= (int) </span><span style="color:#0000bb;">$ano</span><span style="color:#007700;">;<br />
        if((</span><span style="color:#0000bb;">is_int</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$ano</span><span style="color:#007700;">)) &amp;&amp; (</span><span style="color:#0000bb;">strlen</span><span style="color:#007700;">(</span><span style="color:#0000bb;">$ano</span><span style="color:#007700;">) == </span><span style="color:#0000bb;">4</span><span style="color:#007700;">))<br />
            return </span><span style="color:#0000bb;">true</span><span style="color:#007700;">;<br />
        return </span><span style="color:#0000bb;">false</span><span style="color:#007700;">;<br />
    }</span></span></code></p>
<p><code><span style="color:#000000;"><span style="color:#007700;">}</span></span></code></p>
<p><code><span style="color:#000000;"><span style="color:#0000bb;">$data </span><span style="color:#007700;">= new </span><span style="color:#0000bb;">Data</span><span style="color:#007700;">(</span><span style="color:#dd0000;">"2009-04-19"</span><span style="color:#007700;">,</span><span style="color:#dd0000;">"usa"</span><span style="color:#007700;">);<br />
try{<br />
</span><span style="color:#007700;">    echo <span style="color:#0000bb;">$data</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">dataParaBr</span><span style="color:#007700;">();<br />
</span>}catch(</span><span style="color:#0000bb;">Exception $e</span><span style="color:#007700;">){<br />
    echo </span><span style="color:#0000bb;">$e</span><span style="color:#007700;">-&gt;</span><span style="color:#0000bb;">getMessage</span><span style="color:#007700;">();<br />
}<br />
</span><span style="color:#007700;"><br />
</span><span style="color:#0000bb;">?&gt;</span> </span></code></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lucassoler.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lucassoler.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lucassoler.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lucassoler.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lucassoler.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lucassoler.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lucassoler.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lucassoler.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lucassoler.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lucassoler.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lucassoler.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lucassoler.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lucassoler.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lucassoler.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lucassoler.wordpress.com&amp;blog=7649407&amp;post=1&amp;subd=lucassoler&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lucassoler.wordpress.com/2009/05/06/converter-data-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a13b7e2242c5d5914a75668eace33317?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lsoler</media:title>
		</media:content>
	</item>
	</channel>
</rss>
