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

<channel>
	<title>Thiago Rigo</title>
	<atom:link href="http://thiagorigo.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://thiagorigo.com/blog</link>
	<description>A Arte de Programar</description>
	<lastBuildDate>Sun, 20 Nov 2011 21:56:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>Porque programadores PHP são os melhores???</title>
		<link>http://thiagorigo.com/blog/2011/11/porque-programadores-php-sao-os-melhores/</link>
		<comments>http://thiagorigo.com/blog/2011/11/porque-programadores-php-sao-os-melhores/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 21:56:21 +0000</pubDate>
		<dc:creator>Thiago Rigo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://thiagorigo.com/blog/?p=247</guid>
		<description><![CDATA[É isso mesmo, você não leu errado! Eu sempre ouço os programadores de outras linguagens falando mal do PHP e de programadores PHP. Mas quer saber, programadores PHP são fantásticos!!! Eu explico o porquê. PHP não é uma linguagem que se aprende na faculdade(pelo menos não normalmente). Ao invés disso, você aprende &#8220;linguagens mais aceitas [...]]]></description>
			<content:encoded><![CDATA[<p>É isso mesmo, você não leu errado!<br />
Eu sempre ouço os programadores de outras linguagens falando mal do PHP e de programadores PHP.<br />
Mas quer saber, programadores PHP são fantásticos!!!<br />
Eu explico o porquê.</p>
<p>PHP não é uma linguagem que se aprende na faculdade(pelo menos não normalmente). Ao invés disso, você aprende &#8220;linguagens mais aceitas no mercado&#8221;. Aqui já começa o preconceito, e também é aqui que nos diferenciamos dos outros.</p>
<p>Os caras que aprendem PHP normalmente fazem isso por conta própria, e isso faz toda a diferença!<br />
Isso mostra o perfil do profissional de PHP, que já tem desde o início que procurar tudo, e se virar por conta própria.</p>
<p>Por não termos &#8220;professores&#8221; para tirar nossas dúvidas, nós mesmos procuramos a solução, o que nos leva à&#8230; COMUNIDADE!<br />
A comunidade do PHP fala por sí mesma. É extremamente forte, e você NUNCA ficará sem ajuda. NUNCA!<br />
O manual do PHP é de longe a melhor documentação de todas as linguagens.<br />
E por ter que procurar a solução, nós (programadores PHP) acabamos por aprender muito mais.<br />
Não digo só em conhecimento referente ao PHP, mas sim, relacionado a tecnologia. Aprendemos a lidar com sistemas<br />
baseados em UNIX, conhecer os protocolos de forma mais específica, conhecer como as coisas funcionam debaixo dos panos, etc&#8230;</p>
<p>Aí você pode falar: &#8220;Porque a sua linguagem não implementa coisas para facilitar a sua vida&#8221;<br />
Engano seu! PHP facilita sim a nossa vida, coisas que eu faço em uma linha com PHP, requerem implementações bem maiores em outras linguagens!<br />
E vou mais além, se você quer ou precisa escovar bits com PHP, é muito simples também. E isso nos dá uma<br />
flexibilidade enorme.</p>
<p>Isso sim, faz um profissional diferenciado. Já ouvi histórias de pessoas que apenas sabiam rodar o software em que estavam trabalhando na sua<br />
própria máquina. Colocar em produção?!?! Que isso, só sei rodar na minha máquina&#8230; </p>
<p>Ou até mesmo programadores que não vivem sem IDE e Debugger, esse caras existem para nos ajudar, não devemos ser dependentes deles.</p>
<p>Cheguei ao limite de ver programador de uma linguagem X, que pediu para implementarem um wrapper para a API do Google+.<br />
Pera aí, como assim?!?!?! Você realmente NÃO é um programador!<br />
A porra da API é RESTFul, qual a dificuldade de usa-lá?!?! Isso é porque o cara só sabe juntar código, e se a linguagem dele<br />
não oferece &#8220;Google+ API Wrapper&#8221; ele não tem como usar&#8230;</p>
<p>Isso acontece por causa de linguagens que dão tudo de mão beijada para os seus<br />
ditos programadores. Estamos chegando numa época que programadores de verdade estão em falta. Eu não quero viver para ver quando chegar essa<br />
época, o que não esta muito longe. Os &#8220;programadores&#8221; de hoje, simplesmente juntam código, e quando eles tem que fazer algo complexo que a sua<br />
maravilhosa linguagem não oferece, eles NÃO fazem. Estamos no ponto de programadores não saberem que existe Ruby sem Rails, PHP sem WordPress!!!</p>
<p>Ah claro, temos também o caso dos programadores de framework e no caso do PHP, também temos os programadores de WordPress.<br />
Porra, me ajudem! O background da grande maioria dos programadores PHP é sim, WebDesign. Porém essas caras que se dizem programadores PHP<br />
mas não sabem programar fora de framework ou de CMS, NÃO SÃO PROGRAMADORES! Esses caras são &#8220;juntadores de código pronto&#8221;.</p>
<p>Se você não esta nem aí para os recursos novos que saem a cada versão do PHP, não vai a eventos de PHP, não contribui ou não<br />
desenvolve nenhum projeto opensource, você não ama PHP.<br />
Você simplesmente trabalha com ele porque é simples, e dá dinheiro.<br />
Então por favor, não se apresente como programador PHP.</p>
<p>Escutem bem, não estou falando mal de programador PHP que começou com WebDesigner ou trabalha com framework X. Eu tambem comecei assim.<br />
Mas caras, todos temos que evoluir, e continuar desenvolvendo somente dentro de uma &#8220;caixa&#8221; não é evolução.<br />
Deixar para conhecer um recurso quando ele já estiver sendo usado globalmente é evolução reativa, nós não queremos isso.<br />
Temos que começar a estudar algo quando ele ainda é um feto!<br />
Isso ao meu ver, sempre diferenciou os programadores de PHP dos outros.</p>
<p>Não é porque sua linguagem abstrai uma conexão, que você não precisa conhecer oque é feito debaixo dos panos,<br />
e se você falou que não precisa conhecer. Você é um preguiçoso. Conhecer oque a linguagem faz para que certas mágicas aconteçam,<br />
vai fazer com que seu código seja muito melhor.</p>
<p>Sempre que algum recurso legal aparecia em linguagem X ou Y, ou até mesmo uma nova forma de desenvolvimento estava sendo estudada ou lançada.<br />
O pessoal de PHP já estava criando implementações para isso ou aquilo. Enquanto o pessoal das outras linguagens estavam esperando que a implementação fosse feita e eles pudessem apenas usar. Parem com isso! Todos temos que ser pró-ativos, e pesquisar coisas novas. Não fique<br />
acomodado, não tenha medo de errar, vá em frente, e tente tudo de novo que você aprende a cada dia. </p>
<p>Começar um projeto novo sem ter nada de novidade para você fazer, não vai te ajudar em nada.<br />
Você apenas estará na sua zona de conforto, e não estará prendendo nada. Comece um projeto novo,<br />
com uma metodologia nova, uma nova arquitetura, um novo framework, qualquer coisa. Isso sim vai te ajudar!</p>
<p>Então que fique bem claro.<br />
Não existem linguagens melhores ou piores, e sim cada uma se propõe a fazer algo diferente da outra.<br />
E não venha falar mal da minha linguagem, porque não é bem assim.</p>
]]></content:encoded>
			<wfw:commentRss>http://thiagorigo.com/blog/2011/11/porque-programadores-php-sao-os-melhores/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>REST em PHP</title>
		<link>http://thiagorigo.com/blog/2011/10/rest-em-php/</link>
		<comments>http://thiagorigo.com/blog/2011/10/rest-em-php/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 01:28:37 +0000</pubDate>
		<dc:creator>Thiago Rigo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Respect]]></category>
		<category><![CDATA[respect]]></category>
		<category><![CDATA[rest]]></category>

		<guid isPermaLink="false">http://thiagorigo.com/blog/?p=223</guid>
		<description><![CDATA[Olá, tudo beeeeeeemmmm??? Primeiro: Carambaaaaa, faz um tempão hein Hoje vou falar sobre aplicações REST em php, e como criar a sua RESTful app! Bom, vamos lá. Oque é REST??? É um estilo de arquitetura para desenvolver aplicações web. Como? A idéia é simples, utilizar o protocolo HTTP que já temos e conhecemos, para desenvolver [...]]]></description>
			<content:encoded><![CDATA[<p>Olá, tudo beeeeeeemmmm???</p>
<p>Primeiro: Carambaaaaa, faz um tempão hein <img src='http://thiagorigo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Hoje vou falar sobre aplicações REST em php, e como criar a sua RESTful app!</p>
<p>Bom, vamos lá.</p>
<h3>Oque é REST???</h3>
<p>É um estilo de arquitetura para desenvolver aplicações web.</p>
<h3>Como?</h3>
<p>A idéia é simples, utilizar o protocolo HTTP que já temos e conhecemos, para desenvolver aplicações que possam ser &#8220;lidas&#8221; tanto por pessoas quanto por computadores.</p>
<p>Ok, vamos começar a falar sobre webservices então.</p>
<p>REST diz que uma página não é um recurso, e sim a representação de um recurso.<br />
Ou seja, uma página web não é um recurso, e sim a representação de um, no formato HTML.</p>
<pre class="brush: plain; title: ; notranslate">http://meusite.com/produtos/111</pre>
<p>O protocolo HTTP, já possui todos os recursos que precisamos, então não precisamos fazer algo assim:</p>
<pre class="brush: plain; title: ; notranslate">http://meusite.com/produtos/11/edit &lt;- Isso não é legal </pre>
<p>Para mostrar que queremos alterar algo.</p>
<p>As URLs, devem ser hierárquicas! Ou seja, <code>/edit</code> é filho de produto? Eu acho que não.<br />
Mas uma lista de fotos é!</p>
<pre class="brush: plain; title: ; notranslate">http://meusite.com/produtos/11/fotos</pre>
<p>Lindo, não? <img src='http://thiagorigo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Mas como eu faço para mostrar que quero alterar um produto então?<br />
HTTP possui vários métodos, e REST diz que as ações são implícitas por esses métodos, e não passando a ação na URL.</p>
<pre class="brush: plain; title: ; notranslate">
GET
POST
PUT
DELETE
</pre>
<p>Esses são os métodos HTTP usados para construir apps RESTful.</p>
<pre class="brush: plain; title: ; notranslate">GET http//meusite.com/produtos
Lista os produtos.

POST http//meusite.com/produtos
Adiciona um produto.

GET http//meusite.com/produtos/1
Mostra um produto específico.

PUT http//meusite.com/produtos/1
Altera um produto específico.

DELETE http//meusite.com/produtos/1
Deleta o produto.
</pre>
<p>Simples, não???</p>
<p>Agora vamos a questão de &#8220;representar&#8221; esses produtos</p>
<p>Esses produtos podem ser representados como?<br />
<code>HTML, JSON, XML, JPG, ...</code></p>
<p>E isso não precisa ser passado na URL.</p>
<pre class="brush: plain; title: ; notranslate">http://meusite.com/produtos.xml &lt;- Você não precisa deixar isso explícito!</pre>
<p>O HTTP faz isso por você!</p>
<p>Para isso existe o cabeçalho Accept, com ele você fala &#8220;implícitamente&#8221; como você quer a representação desse produtos.</p>
<pre class="brush: plain; title: ; notranslate">Accept    text/html,application/json </pre>
<p>Entenderam???</p>
<p>Vamos colocar a mão na massa então!</p>
<p>Para fazer isso, vou usar um cara bem legal chamado Respect\Rest. Com ele fica muito fácil desenvolver apps RESTful em PHP.<br />
<a href="http://github.com/Respect/Rest" target="_blank">http://github.com/Respect/Rest</a></p>
<pre class="brush: php; title: ; notranslate">
$router = new Router();

$router-&gt;get('/produtos', function() {
    return 'Listagem de produtos';
});

$router-&gt;post('/produtos', function() {
    return 'Criando um produto';
});

$router-&gt;get('/produtos/*', function() {
    return 'Mostrando um produto específico';
});

$router-&gt;put('/produtos/*', function() {
    return 'Alterando um produto';
});

$router-&gt;delete('/produtos/*', function() {
    return 'Apagando um produto';
});
</pre>
<p>Simples neh?</p>
<p>Agora vamos dizer de que formas esses produtos podem ser representados.</p>
<pre class="brush: php; title: ; notranslate">
$router = new Router();

$router-&gt;get('/produtos', function() {
    return 'Listagem de produtos';
})-&gt;accept(
    array(
        'text/html' =&gt; function($data) {
            return 'Produto em HTML';
        },
        'application/json' =&gt; function($data) {
            return 'Produto em JSON';
        }
    )
);

$router-&gt;post('/produtos', function() {
     return 'Criando um produto';
});

$router-&gt;get('/produtos/*', function() {
    return 'Mostrando um produto específico';
});

$router-&gt;put('/produtos/*', function() {
    return 'Alterando um produto';
});

$router-&gt;delete('/produtos/*', function() {
    return 'Apagando um produto';
});
</pre>
<p>Está pronto! Agora, a lista de produtos pode ser representada em JSON e HTML.</p>
<p>Espero que tenham gostado da simples introdução que fiz!<br />
Bom, vou ficando por aqui mesmo, num próximo post vou mostrar como realmente &#8220;desenvolver&#8221; uma aplicação completa.</p>
]]></content:encoded>
			<wfw:commentRss>http://thiagorigo.com/blog/2011/10/rest-em-php/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Como se tornar um ZCE 5.3</title>
		<link>http://thiagorigo.com/blog/2010/12/como-se-tornar-um-zce-5-3/</link>
		<comments>http://thiagorigo.com/blog/2010/12/como-se-tornar-um-zce-5-3/#comments</comments>
		<pubDate>Thu, 23 Dec 2010 15:18:48 +0000</pubDate>
		<dc:creator>Thiago Rigo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ZCE]]></category>

		<guid isPermaLink="false">http://thiagorigo.com/blog/?p=185</guid>
		<description><![CDATA[É isso mesmo!!! Finalmente consegui a tão desejada ZCE 5.3!!! Se voce tambem quer a sua, esse post é pra voce, vou apresentar aqui algumas impressões sobre a prova e algumas dicas. Bom vamos ao que interessa! Primeiro de tudo, estude! Isso mesmo, sem estudo será difícil de passar Mas não precisa ficar desesperado, a [...]]]></description>
			<content:encoded><![CDATA[<p>É isso mesmo!!! Finalmente consegui a tão desejada ZCE 5.3!!!</p>
<p>Se voce tambem quer a sua, esse post é pra voce, vou apresentar aqui algumas impressões sobre a prova e algumas dicas.</p>
<p><a href="http://thiagorigo.com/blog/wp-content/uploads/2010/12/zce-php5-3-logo.gif"><img class="size-full wp-image-195 alignleft" title="zce-php5-3-logo" src="http://thiagorigo.com/blog/wp-content/uploads/2010/12/zce-php5-3-logo.gif" alt="zce-php5-3-logo" width="73" height="68" /></a></p>
<p>Bom vamos ao que interessa!</p>
<p>Primeiro de tudo, estude! Isso mesmo, sem estudo será difícil de passar <img src='http://thiagorigo.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /><br />
Mas não precisa ficar desesperado, a prova não é difícil! Se voce estudar e conhecer bem o PHP,<br />
não terá nenhum problema para passar.</p>
<p>A prova possui 10 áreas de conhecimento, são elas:</p>
<ol>
<li>PHP BASICS</li>
<li>DATA FORMATS AND TYPES</li>
<li>STRINGS</li>
<li>ARRAYS</li>
<li>INPUT / OUTPUT</li>
<li>FUNCTIONS</li>
<li>OBJECT-ORIENTED PROGRAMMING</li>
<li>DATABASES</li>
<li>SECURITY</li>
<li>WEB FEATURES</li>
</ol>
<p>PHP Basics, Strings, Arrays, OO são muito cobrados, por isso conheça muito bem esses tópicos.<br />
Input/Output, Functions, Web Features tambem tem um bom número de questões.<br />
Data Formats and Types, Databases, Security são tratados bem por cima.</p>
<p>Outra coisa, aprenda Hexadecimal, Octal e Binário, eles serão importantes tambêm, nada demais, apenas contas simples.</p>
<p>Não se esqueça de conhecer tambêm um pouco sobre precedência de operadores, os principais &#8220;.+-/*&#8221;.</p>
<p>Em relação aos novos recursos do 5.3, foram poucas questões 2 de namespace e 2 de Late Static Binding, na minha prova nem caiu Closures.</p>
<p>Na prova também serão testados conceitos que você não encontrará no manual do PHP, coisa que você deve conhecer pela sua experiência e conhecimento sobre Web.</p>
<h3>Estudando</h3>
<p>Eu recomendo que você compre o livro da php|arch <a href="http://www.amazon.com/architects-Zend-Certification-Study-Guide/dp/0973862149" target="_blank">ZEND PHP 5 Certification Study Guide</a>, também leia esse <a href="http://devzone.zend.com/article/12647-Passing-the-ZCE-PHP-5.3-certification-exam" target="_blank">post na devzone</a>, o post é bem completo e você pode pegar varias dicas bacanas.</p>
<p>Outra coisa, quando você comprar o voucher, deve receber um pdf da zend, que é um beta de guia de estudos para a ZCE 5.3.<br />
Ah, é importante lembrar, que não tem mais teste online, pode ser que futuramente tenha, mas até agora não tem.</p>
<p>Bom é basicamente isso, boa sorte!</p>
]]></content:encoded>
			<wfw:commentRss>http://thiagorigo.com/blog/2010/12/como-se-tornar-um-zce-5-3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>SPL ArrayAccess</title>
		<link>http://thiagorigo.com/blog/2010/07/spl-arrayaccess/</link>
		<comments>http://thiagorigo.com/blog/2010/07/spl-arrayaccess/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 00:30:59 +0000</pubDate>
		<dc:creator>Thiago Rigo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[SPL]]></category>
		<category><![CDATA[ArrayAccess]]></category>

		<guid isPermaLink="false">http://thiagorigo.com/blog/?p=162</guid>
		<description><![CDATA[Eae! Hoje vou falar sobre uma das interfaces do PHP! Bom, o assunto de hoje é a ArrayAccess, que apesar de simples, possibilita que uma classe seja manipulada como um array. A ArrayAccess, obriga que a classe implemente 4 métodos, são eles: Através desses métodos, você conseguirá acessar a sua classe como se fosse um [...]]]></description>
			<content:encoded><![CDATA[<p>Eae! Hoje vou falar sobre uma das interfaces do PHP!</p>
<p>Bom, o assunto de hoje é a <a title="ArrayAccess" href="http://br3.php.net/manual/pt_BR/class.arrayaccess.php" target="_blank">ArrayAccess</a>, que apesar de simples, possibilita que uma classe seja manipulada como um <code>array</code>.</p>
<p>A ArrayAccess, obriga que a classe implemente 4 métodos, são eles:</p>
<pre class="brush: php; title: ; notranslate">
public boolean offsetExists(mixed $offset)
public mixed offsetGet (mixed $offset)
public void offsetSet(mixed $offset, mixed $value)
public void offsetUnset(mixed $offset)
</pre>
<p>Através desses métodos, você conseguirá acessar a sua classe como se fosse um <code>array</code>, com algumas restrições é claro <img src='http://thiagorigo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Para demonstrar o uso da ArrayAccess, usarei as mesmas classes usadas do post anteriror, só adicionei a classe CarrinhoCompras onde será posteriormente implementada a ArrayAccess.</p>
<pre class="brush: php; title: ; notranslate">
class Produto
{
	private $nome;
	private $preco;

	public function __construct($nome, $preco)
	{
		$this-&gt;nome = $nome;
		$this-&gt;preco = $preco;
	}

	/** GETTERS AND SETTERS **/
}

class Item implements Countable
{
	private $produto;
	private $quantidade;

	public function __construct(Produto $produto, $quantidade)
	{
		$this-&gt;produto = $produto;
		$this-&gt;quantidade = $quantidade;
	}

	public function count()
	{
		return $this-&gt;quantidade;
	}
}

class CarrinhoCompras
{
	private $itens;
	private $data;

	public function __construct($data)
	{
		$this-&gt;itens = array();
		$this-&gt;data = $data;
	}
}
</pre>
<p>Nesse exemplo, continuamos com nosso contexto de e-commerce, a classe Item possui um Produto e a quantidade desejada desse produto, e a classe CarrinhoCompras possui todos os Itens que estão sendo vendidos. Bem simples, apenas para demonstração <img src='http://thiagorigo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Agora sim, vamos ao que interessa! O atributo <code>$itens</code>, é um <code>array </code>de Itens, para acessar ele poderíamos criar um método getItens(), ou qualquer outro método que acesse esse atributo, mas aqui vou demonstrar como acessar ele através da ArrayAccess.</p>
<p>A classe CarrinhoCompras deve implementar a interface ArrayAccess, e implementar todos os métodos acima citados, como no exemplo abaixo.</p>
<pre class="brush: php; title: ; notranslate">
class CarrinhoCompras implements ArrayAccess
{
	private $itens;
	private $data;

	public function __construct($data)
	{
		$this-&gt;itens = array();
		$this-&gt;data = $data;
	}

	public function offsetSet($offset, $value)
	{
		var_dump(__METHOD__);
        $this-&gt;itens[$offset] = $value;
    }

    public function offsetExists($offset)
	{
		var_dump(__METHOD__);
        return isset($this-&gt;itens[$offset]);
    }

    public function offsetUnset($offset)
	{
		var_dump(__METHOD__);
        unset($this-&gt;itens[$offset]);
    }

    public function offsetGet($offset)
	{
		var_dump(__METHOD__);
        return isset($this-&gt;itens[$offset]) ? $this-&gt;itens[$offset] : null;
    }
}
</pre>
<p>No exemplo eu coloquei <code>var_dump(__METHOD__)</code> dentro de cada método para que você possa ver quando cada método é chamado. Agora vamos executar alguns testes para que você possa ver a utilização da ArrayAccess.</p>
<pre class="brush: php; title: ; notranslate">
$produto = new Produto('Livro PHP', 78.50);
$item = new Item($produto, 5);

$produto1 = new Produto('Livro Java', 88.50);
$item1 = new Item($produto1, 1);

$carrinho = new CarrinhoCompras(new DateTime());
$carrinho[0] = $item;
$carrinho[1] = $item1;

var_dump($carrinho[0]);
</pre>
<p>Fácil não? Agora a sua classe é acessível como um <code>array</code>! Mas agora vamos as restrições <img src='http://thiagorigo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre class="brush: php; title: ; notranslate">
// Isso não funciona!
// Apesar de a classe ser acessível como um array, ela não é um array...
// Fazendo isso, você terá como resultado um foreach de todos os atributos public
foreach ($carrinho as $c)
var_dump($c);

// Isso também não!
array_push($carrinho, 'teste');

// Isso funciona!
// Mas não como de costume...
// O indice vazio, no caso de um array, teria o mesmo comportamento
// Que array_push(), mas no caso de um objeto
// O indice é covertido para NULL
$carrinho[] = 'teste';
</pre>
<p>Você pode continuar chamando os métodos normalmente, ou seja.</p>
<pre class="brush: php; title: ; notranslate">
// Isso funciona!
$carrinho-&gt;offsetExists(0);
</pre>
<p>Abaixo uma breve explicação de cada método.</p>
<pre class="brush: php; title: ; notranslate">
// Chamado quando usamos isset() ou empty()
public boolean offsetExists(mixed $offset)

// Chamado quando usamos empty()
// NOTA: Só é chamado quando ArrayAccess::offsetExists() retorna true
public mixed offsetGet (mixed $offset)

// Chamado quando usamos $obj['index'] = 'teste'
public void offsetSet(mixed $offset, mixed $value)

// Chamado quando usamos unset()
// NOTA: Fazendo casting para (unset) não chama esse método
public void offsetUnset(mixed $offset)
</pre>
<p>É isso, espero que tenham gostado!<br />
Não esqueçam de comentar e de ler a documentação, <acronym title="Read The Fucking Manual">RTFM</acronym>.</p>
<p><a title="SPL ArrayAccess" href="http://br3.php.net/manual/pt_BR/class.arrayaccess.php" target="_blank">http://br3.php.net/manual/pt_BR/class.arrayaccess.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://thiagorigo.com/blog/2010/07/spl-arrayaccess/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SPL Countable</title>
		<link>http://thiagorigo.com/blog/2010/07/spl-countable/</link>
		<comments>http://thiagorigo.com/blog/2010/07/spl-countable/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 01:27:32 +0000</pubDate>
		<dc:creator>Thiago Rigo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[SPL]]></category>
		<category><![CDATA[Countable]]></category>

		<guid isPermaLink="false">http://thiagorigo.com/blog/?p=154</guid>
		<description><![CDATA[Eae pessoal!!! Hoje venho falar de um assunto muito interessante, SPL. Pra quem não conhece, a SPL, é uma biblioteca com diversas classe e interfaces para PHP, que vão desde estruturas de dados, implementações de Design patterns, Iterators, Exceptions e funções diversas. Nesse post, falarei de uma das interfaces, a Countable que é extremamente simples, [...]]]></description>
			<content:encoded><![CDATA[<p>Eae pessoal!!!</p>
<p>Hoje venho falar de um assunto muito interessante, SPL. <img src='http://thiagorigo.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Pra quem não conhece, a <acronym title="Standard PHP Library">SPL</acronym>, é uma biblioteca com diversas classe e interfaces para PHP, que vão desde estruturas de dados, implementações de Design patterns, Iterators, Exceptions e funções diversas.</p>
<p>Nesse post, falarei de uma das interfaces, a <a title="SPL Countable" href="http://br3.php.net/manual/pt_BR/class.countable.php" target="_blank">Countable</a> que é extremamente simples, porém muito útil!</p>
<p>Antes de ir direto ao assunto, usarei o exemplo abaixo para demonstrar o uso da interface dentro de um contexto de e-commerce.</p>
<pre class="brush: php; title: ; notranslate">
class Produto
{
    private $nome;
    private $preco;

    public function __construct($nome, $preco)
    {
        $this-&gt;nome = $nome;
        $this-&gt;preco = $preco;
    }

    /** GETTERS AND SETTERS **/
}

class Item
{
    private $produto;
    private $quantidade;

    public function __construct(Produto $produto, $quantidade)
    {
        $this-&gt;produto = $produto;
        $this-&gt;quantidade = $quantidade;
    }
}
</pre>
<p>Nesse exemplo, temos a classe Produto e a classe Item, a Item recebe como parâmetro no<br />
construtor uma instância de Produto e a quantidade desejada desse produto.</p>
<p>Agora se você quer saber a quantidade de produtos que um item possui você pode fazer algo assim?</p>
<pre class="brush: php; title: ; notranslate">
$produto = new Produto('Livro PHP', 78.50);
$item = new Item($produto, 5);
echo count($item);
</pre>
<p>Até poderia, mas não seria o resultado esperado. O resultado desse <code>count()</code> seria 1. E agora?</p>
<p>É claro que você poderia criar um método <code>getQuantidade()</code>, ou resolver de alguma outra forma, idéias não faltam <img src='http://thiagorigo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Mas com a SPL você pode sim realizar o código acima e obter o resultado esperado!!!</p>
<p>Vamos lá!</p>
<p>Basta que a classe Item implemente a Countable como no exemplo abaixo.</p>
<pre class="brush: php; title: ; notranslate">

class Item implements Countable
{
    private $produto;
    private $quantidade;

    public function __construct(Produto $produto, $quantidade)
    {
        $this-&gt;produto = $produto;
        $this-&gt;quantidade = $quantidade;
    }

    public function count()
    {
        return $this-&gt;quantidade;
    }
}
</pre>
<p>A interface Countable, obriga você implementar um método count(), mas ai você deve estar se perguntando: &#8220;Tá mas onde esta a graça nisso?&#8221;. Eu respondo, execute novamente o código abaixo.</p>
<pre class="brush: php; title: ; notranslate">
$produto = new Produto('Livro PHP', 78.50);
$item = new Item($produto, 5);
echo count($item);
</pre>
<p>Agora sim! O resultado será 5, isso acontece porque sua classe implementou a interface Countable, e agora o PHP sabe que ele pode chamar o método <code>count()</code> da sua classe quando você utilizar a função <code>count()</code> nativa.</p>
<p>É isso, espero que tenham gostado e até a próxima.</p>
<p><a title="Countable::count" href="http://br3.php.net/manual/pt_BR/countable.count.php" target="_blank">http://br3.php.net/manual/pt_BR/countable.count.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://thiagorigo.com/blog/2010/07/spl-countable/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ScreenCast CrudIgniter &#8211; Basics</title>
		<link>http://thiagorigo.com/blog/2010/05/screencast-crudigniter-basics/</link>
		<comments>http://thiagorigo.com/blog/2010/05/screencast-crudigniter-basics/#comments</comments>
		<pubDate>Mon, 24 May 2010 00:24:15 +0000</pubDate>
		<dc:creator>Thiago Rigo</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[CrudIgniter]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[screencast]]></category>

		<guid isPermaLink="false">http://thiagorigo.com/blog/?p=147</guid>
		<description><![CDATA[Eae pessoal! Hoje vou falar sobre CrudIgniter, esse é o primeiro cast de vários que vou fazer, mostrando desde o básico até o avançado de CrudIgniter. Nesse cast, ensino como gerar a sua aplicação em minutos, e nos próximos irei ensinar a customizar os templates, criar seus próprios templates e até criar as suas próprias [...]]]></description>
			<content:encoded><![CDATA[<p>Eae pessoal!</p>
<p>Hoje vou falar sobre CrudIgniter, esse é o primeiro cast de vários que vou fazer, mostrando desde o básico até o avançado de CrudIgniter.</p>
<p>Nesse cast, ensino como gerar a sua aplicação em minutos, e nos próximos irei ensinar a customizar os templates, criar seus próprios templates e até criar as suas próprias funcionalidades.<br />
Espero que gostem e até a próxima!</p>
<p><strong>PS: Assistam em HD porque aí fica muito mais fácil de entender as letras.</strong><br />
<object width="600" height="375" data="http://vimeo.com/moogaloop.swf?clip_id=11974860&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=11974860&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /></object></p>
<p><a href="http://vimeo.com/11974860">CrudIgniter &#8211; Basics</a> from <a href="http://vimeo.com/user3369819">Thiago Rigo</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://thiagorigo.com/blog/2010/05/screencast-crudigniter-basics/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Design Pattern &#8211; Singleton</title>
		<link>http://thiagorigo.com/blog/2010/05/design-pattern-singleton/</link>
		<comments>http://thiagorigo.com/blog/2010/05/design-pattern-singleton/#comments</comments>
		<pubDate>Mon, 10 May 2010 00:11:13 +0000</pubDate>
		<dc:creator>Thiago Rigo</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://thiagorigo.com/blog/?p=133</guid>
		<description><![CDATA[Olá pessoal! Hoje venho falar um pouco sobre design patterns, para começar hoje irei falar sobre o Singleton. No screencast eu explico oque é, para que serve e como se implementa Singleton em php! Bom vamos ao screencast. Ah, se vocês gostaram, não entenderam nada ou ficaram com alguma dúvida comentem Download dos arquivos Até [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal! Hoje venho falar um pouco sobre design patterns, para começar hoje irei falar sobre o Singleton.</p>
<p>No screencast eu explico oque é, para que serve e como se implementa Singleton em php!</p>
<p>Bom vamos ao screencast. Ah, se vocês gostaram, não entenderam nada ou ficaram com alguma dúvida comentem <img src='http://thiagorigo.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://thiagorigo.com/blog/wp-content/uploads/2010/05/singleton.zip">Download dos arquivos</a></p>
<p>Até a próxima!!!</p>
<p><object width="600" height="375" data="http://vimeo.com/moogaloop.swf?clip_id=11606809&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=11606809&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /></object></p>
<p><a href="http://vimeo.com/11606809">Design Pattern &#8211; Singleton</a> from <a href="http://vimeo.com/user3369819">Thiago Rigo</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://thiagorigo.com/blog/2010/05/design-pattern-singleton/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CrudIgniter lançado</title>
		<link>http://thiagorigo.com/blog/2010/04/crudigniter-lancado/</link>
		<comments>http://thiagorigo.com/blog/2010/04/crudigniter-lancado/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 02:52:13 +0000</pubDate>
		<dc:creator>Thiago Rigo</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[CrudIgniter]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://thiagorigo.com/blog/?p=129</guid>
		<description><![CDATA[Eae pessoal!!!!!!! Depois de tanto tempo sem postar nada, eu finalmente venho com uma novidade fantástica!!! Já tem algum tempo que eu venho trabalhando num projeto, um software que gera código para o CodeIgniter, o software roda no console, e baseado no seu banco de dados gera a sua aplicação toda Não vou entrar em [...]]]></description>
			<content:encoded><![CDATA[<p>Eae pessoal!!!!!!!<br />
Depois de tanto tempo sem postar nada, eu finalmente venho com uma novidade fantástica!!!<br />
Já tem algum tempo que eu venho trabalhando num projeto, um software que gera código para o <a href="http://codeigniter.com/">CodeIgniter</a>, o software roda no console, e baseado no seu banco de dados gera a sua aplicação toda <img src='http://thiagorigo.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Não vou entrar em muitos detalhes agora, mas em breve farei screencasts e artigos mostrando como utilizar, adicionar funcionalidades personalizadas, customizar os templates, enfim tudo!</p>
<p>O CrudIgniter está hospedado no Google code, <a href="http://code.google.com/p/crud-igniter/">neste link</a>.</p>
<p>É só baixar e aproveitar, no download está toda a documentação também.</p>
<p>Espero que o CrudIgniter ajude muita gente! E que ele possa crescer bastante.</p>
<p>Divulguem!!!</p>
<p>E claro, comentem <img src='http://thiagorigo.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://thiagorigo.com/blog/2010/04/crudigniter-lancado/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Upload AJAX</title>
		<link>http://thiagorigo.com/blog/2009/09/upload-ajax/</link>
		<comments>http://thiagorigo.com/blog/2009/09/upload-ajax/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 01:30:33 +0000</pubDate>
		<dc:creator>Thiago Rigo</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://thiagorigo.com/blog/?p=114</guid>
		<description><![CDATA[Eae pessoal, hoje irei mostrar como fazer um upload simples simulando AJAX. Quem quiser conferir como ficará o exemplo, segue o link. E no fim do post, tem um zip com o exemplo funcionando. Vamos lá! Primeiro: AJAX significa Asynchronous JavaScript and XML, e consiste na idéia de se comunicar com um servidor web, sem [...]]]></description>
			<content:encoded><![CDATA[<p>Eae pessoal, hoje irei mostrar como fazer um upload simples simulando AJAX.<br />
Quem quiser conferir como ficará o exemplo, <a href="http://www.thiagorigo.com/exemplos-blog/upload/upload.html" target="_blank">segue o link</a>.<br />
E no fim do post, tem um zip com o exemplo funcionando.</p>
<p>Vamos lá!</p>
<p><strong>Primeiro:</strong> AJAX significa Asynchronous JavaScript and XML, e consiste na idéia de se comunicar com um servidor web, sem a necessidade de recarregar a página.</p>
<p><strong>Segundo:</strong> O objeto XMLHttpRequest é um objeto JavaScript que torna possível essa comunicação assíncrona.</p>
<p><strong>Terceiro:</strong> O XMLHttpRequest não suporta o envio de formulário com <code>enctype="multipart/form-data"</code>, que são utlizados para envios de arquivo. Isso ocorre porque dessa maneira os caracteres não são codificados, não permitindo assim o seu envio pelo objeto.</p>
<p>Então como faremos ?</p>
<p><strong>Simples!</strong></p>
<p>Iremos simular um upload com AJAX, utilizando um iframe.</p>
<p>Essa técnica é bastante utilizada, e não é complicada de se fazer.</p>
<p>Bom, agora que ja temos uma breve explicação, vamos ao código!</p>
<p>Primeiro o nosso código HTML, com o formulário para upload.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
&lt;title&gt;UPLOAD&lt;/title&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.3.2.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;h1&gt;Escolha o arquivo&lt;/h1&gt;

&lt;div style=&quot;display: none;&quot; id=&quot;loader_img&quot;&gt;
	&lt;img src=&quot;img/loader.gif&quot; alt=&quot;Carregando...&quot; title=&quot;Carregando...&quot; /&gt;
&lt;/div&gt;
&lt;div style=&quot;display: none;&quot; id=&quot;upload_msg&quot;&gt;&lt;/div&gt;
&lt;form action=&quot;do_upload.php&quot; id=&quot;form_upload&quot; enctype=&quot;multipart/form-data&quot; method=&quot;post&quot; target=&quot;upload_target&quot;&gt;
&lt;p&gt;
	&lt;label&gt;Arquivo
		&lt;input type=&quot;file&quot; name=&quot;arquivo&quot; id=&quot;arquivo&quot; /&gt;
	&lt;/label&gt;
&lt;/p&gt;
&lt;p&gt;
	&lt;input type=&quot;submit&quot; name=&quot;do_action&quot; id=&quot;do_action&quot; value=&quot;Upload&quot; /&gt;
&lt;/p&gt;
&lt;/form&gt;
&lt;iframe id=&quot;upload_target&quot; name=&quot;upload_target&quot; src=&quot;#&quot;&gt;&lt;/iframe&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>Excplicação</strong></p>
<ol>
<li>Incluimos a jQuery no nosso documento pois iremos utilizá-la, caso voce não conheca a jQuery, <a href="http://thiagorigo.com/blog/?p=49" target="_blank">neste post</a> falo um pouco sobre ela, e apresento alguns seletores básicos. </li>
<li>Note que temos duas divs com <code>display:none</code>, a <code>div#loader_img</code> é mostrada quando o form sofrer um submit, e a <code>div#upload_msg</code> é utilizada para mostrar mensagens para o usuário.
</li>
<li>
O form possui um target apontando para o iframe, aqui esta a mágica! Como esta apontando para o iframe, isso indica que o formulário será processado dentro do iframe, evitando que a página seja recarregada.</li>
</ol>
<p>Agora vamos ao nosso código JavaScript dessa página.</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function() {
	$('#upload_target').hide();

	$('form#form_upload').submit(function() {
		$('#upload_msg').hide(500);
		$(this).hide(500, function() {
			$('#loader_img').show(500);
		});
	});
});
&lt;/script&gt;
</pre>
<p><strong>Explicação</strong></p>
<ol>
<li>Linha 3, escondemos o iframe da página, pois não queremos que ele sejá visto.</li>
<li>Linha 5, selecionamos o form, e colocamos uma função de callback para quando o form sofrer o submit.</li>
<li>Linha 6, escondemos a div de mostrar mensagens para o usuário. Eu sei ela já esta com <code>display:none</code>, mas se ja foi feito um upload, ela estará visível.</li>
<li>Linha 7, Escondemos o form, e na função de callback mostramos a imagem de carregando.</li>
</ol>
<p>O nosso código da página ficou assim</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
&lt;title&gt;UPLOAD&lt;/title&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.3.2.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function() {
	$('#upload_target').hide();

	$('form#form_upload').submit(function() {
		$('#upload_msg').hide(500);
		$(this).hide(500, function() {
			$('#loader_img').show(500);
		});
	});
});
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;h1&gt;Escolha o arquivo&lt;/h1&gt;

&lt;div style=&quot;display: none;&quot; id=&quot;loader_img&quot;&gt;
	&lt;img src=&quot;img/loader.gif&quot; alt=&quot;Carregando...&quot; title=&quot;Carregando...&quot; /&gt;
&lt;/div&gt;
&lt;div style=&quot;display: none;&quot; id=&quot;upload_msg&quot;&gt;&lt;/div&gt;
&lt;form action=&quot;do_upload.php&quot; id=&quot;form_upload&quot; enctype=&quot;multipart/form-data&quot; method=&quot;post&quot; target=&quot;upload_target&quot;&gt;
&lt;p&gt;
	&lt;label&gt;Arquivo
		&lt;input type=&quot;file&quot; name=&quot;arquivo&quot; id=&quot;arquivo&quot; /&gt;
	&lt;/label&gt;
&lt;/p&gt;
&lt;p&gt;
	&lt;input type=&quot;submit&quot; name=&quot;do_action&quot; id=&quot;do_action&quot; value=&quot;Upload&quot; /&gt;
&lt;/p&gt;
&lt;/form&gt;
&lt;iframe id=&quot;upload_target&quot; name=&quot;upload_target&quot; src=&quot;#&quot;&gt;&lt;/iframe&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Bom, agora falta a página de action do form, do_upload.php nela fazemos o upload e escrevos o status do upload na página, além de escondermos a div com a imagem de carregando e mostramos novamente o form.</p>
<p>Vamos lá</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

/******* CONFIGURACOES *******/

// Nome do input FILE
$inputFile = 'arquivo';

// Limitar extensoes (TRUE ou FALSE)
$limitarExt = TRUE;

// Extensoes validas
$extensoesValidas = array('.gif', '.jpg', '.jpeg', '.png', '.txt');

// Limitar tamanho (TRUE ou FALSE)
$limitarTamanho = FALSE;

// Tamanho em bytes
$tamanhoMax = 1024 * 200;

// Caminho do upload
$caminho = 'upload/';

// Sobrescrever arquivo (TRUE ou FALSE)
$sobrescrever = FALSE;

/******* FIM CONFIGURACOES *******/

$nomeArquivo 	 = $_FILES[$inputFile]['name'];
$tamanhoArquivo  = $_FILES[$inputFile]['size'];
$nomeTempArquivo = $_FILES[$inputFile]['tmp_name'];
$erroArquivo 	 = $_FILES[$inputFile]['error'];
$extArquivo 	 = strtolower(strrchr($nomeArquivo, '.'));
$msg = '';

if ( $erroArquivo == 4 ) {
	// Nenhum arquivo enviado
	$msg = 'Selecione um arquivo!';
} elseif ( $erroArquivo == 0 ) {
	// Verifica a extensao
	if ( ($limitarExt === TRUE) &amp;&amp; (! in_array($extArquivo, $extensoesValidas)) ) {
		$msg = 'Tipo de arquivo inválido!';
	// Verifica o tamanho
	} elseif ( ($limitarTamanho === TRUE) &amp;&amp; ($tamanhoArquivo &gt; $tamanhoMax) ) {
		$msg = 'Arquivo muito grande!';
	// Varifica se o arquivo ja existe
	} elseif ( ($sobrescrever === FALSE) &amp;&amp; (file_exists($caminho . $nomeArquivo)) ) {
		$msg = 'Arquivo já existe!';
	} else {
		// Se moveu o arquivo
		if ( move_uploaded_file($nomeTempArquivo, $caminho . $nomeArquivo) ) {
			$msg = 'Arquivo enviado com sucesso!';
		} else {
			$msg = 'Ocorreu um erro durante o envio do arquivo, tente novamente.';
		}
	}
} else {
	$msg = 'Ocorreu um erro durante o envio do arquivo, tente novamente.';
}

sleep(1);

$out  = &lt;&lt;&lt;OUT
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.3.2.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
	$('#loader_img', top.document).hide();
	$('#upload_msg', top.document).html('$msg');
	$('#upload_msg', top.document).show()
	$('form#form_upload p label input:file', top.document).remove();
	$('form#form_upload label', top.document).append('&lt;input type=&quot;file&quot; name=&quot;arquivo&quot; id=&quot;arquivo&quot; /&gt;');
	$('form#form_upload', top.document).show();
&lt;/script&gt;
OUT;

echo $out;
?&gt;
</pre>
<p>Desenvolvi um script de upload bem completo, que voce pode usar inclusive em outros sistemas que voce esteja desenvolvendo.</p>
<p><strong>Explicação</strong></p>
<p><strong>Primeiro possuimos a parte de configurações, onde voce pode configurar:</strong></p>
<ol>
<li>O nome do input file que voce esta usando no form.</li>
<li>Se deve-se limitar extensões para envio de arquivo.</li>
<li>As extensões válidas.</li>
<li>Se deve-se limitar o tamanho do arquivo enviado.</li>
<li>O tamanho máximo permitido.</li>
<li>O caminho do upload.</li>
<li>Se deve-se sobrescrever o arquivo, caso ela já exista.</li>
</ol>
<p><strong>Não irei explicar linha por linha, pois os comentários no código ja são auto explicativos.</strong></p>
<p>O script só vai até a linha 58, após isso, são realizadas operações para escrever o JavaScript que irá manipular a página, como dito anteriormente.</p>
<p>Linha 60, adicionei a função sleep() para caso o arquivo enviado seja muito pequeno, ou não tenha sido enviado nenhuma arquivo, haja tempo necessário para os efeitos esconderem os elementos na página.</p>
<p>Linha 62, começamos a preparar o JavaScript para manipular a página.</p>
<p>Note que utilizamos os seletores dentro de <code>top.document</code>. Ou seja, serão selecionados elementos no documento acima do iframe, que é justamente a página.</p>
<p><strong>No JavaScript</strong></p>
<ol>
<li>Linha 66, escondemos a imagem de carregando.</li>
<li>Linha 67, escrevemos o retorno do upload, variável $msg.</li>
<li>Linha 68, mostramos a div#upload_msg.</li>
<li>Linha 69, removemos o input file do form, pois o atributo value de um input file, não pode ser modificado.</li>
<li>Linha 70, inserimos um novo input file.</li>
<li>Linha 71, mostramos o form.</li>
</ol>
<p><strong>E pronto!</strong></p>
<p>A idéia de funcionamento é bem simples, é selecionado o arquivo, faz o upload que é processado no iframe, e o PHP escreve o JavaScript que manipula a página.</p>
<p><strong>Dica: Se voce tem o FireBug, após um upload verá que dentro do iframe, foi escrito aquele código JavaScript.</strong></p>
<h3><a href="http://thiagorigo.com/blog/wp-content/uploads/2009/09/upload.zip">Download</a></h3>
<p>Caso haja alguma dúvida, poste nos comentários.</p>
]]></content:encoded>
			<wfw:commentRss>http://thiagorigo.com/blog/2009/09/upload-ajax/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Evitando erros no IF</title>
		<link>http://thiagorigo.com/blog/2009/08/evitando-erros-no-if/</link>
		<comments>http://thiagorigo.com/blog/2009/08/evitando-erros-no-if/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 17:01:52 +0000</pubDate>
		<dc:creator>Thiago Rigo</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://thiagorigo.com/blog/?p=109</guid>
		<description><![CDATA[Um erro que é difícil de se detectar e bem fácil de se ocorrer é na hora  de verificar a expressão dentro de um comando IF. Imagine o seguinte código: Ele será executado normalmente, e com certeza te dará um bom trabalho para encontrar o erro, não é o caso, pois aqui temos apenas o [...]]]></description>
			<content:encoded><![CDATA[<p>Um erro que é difícil de se detectar e bem fácil de se ocorrer é na hora  de verificar a expressão dentro de um comando IF.</p>
<p>Imagine o seguinte código:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$a = 10;
if ( $a = 10 ) {
	echo 10;
}
</pre>
<p>Ele será executado normalmente, e com certeza te dará um bom trabalho para encontrar o erro, não é o caso, pois aqui temos apenas o <code>IF</code>, mas imagine que tenha diversas outras linhas e até outras opções no <code>IF</code>.</p>
<p>Esse tipo de erro, pode ocorrer por um simples erro de digitação, ou sem querer você apagou um sinal de igual = e não percebeu.</p>
<p>Por isso, é bom utilizar a variável que você deseja comparar na frete do valor.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$a = 10;
if ( 10 = $a ) {
	echo 10;
}
</pre>
<p>Dessa forma, pode até parecer meio desorganizado, mas se por acaso você esquecer de colocar um sinal de igual =, isso irá gerar um erro no PHP, facilitando assim, a detecção do problema.</p>
<p>Escrevendo dessa forma, 10 seria atribuído a variável $a, e seria avaliado como <code>true</code>, logo seria escrito 10 na tela.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$a = 10;
if ( $a = 10 ) {
	echo 10;
}
</pre>
<p>Já escrevendo assim, ocorreria um erro de parse no PHP.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$a = 10;
if ( 10 = $a ) {
	echo 10;
}
</pre>
<p>Dica removida do livro PHP CookBook 2 edição.<br />
Espero que a dica seja útil para você!</p>
]]></content:encoded>
			<wfw:commentRss>http://thiagorigo.com/blog/2009/08/evitando-erros-no-if/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

