<?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>caioariede.com weblog &#187; PHP</title>
	<atom:link href="http://caioariede.com/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://caioariede.com</link>
	<description>— coding for great good</description>
	<lastBuildDate>Wed, 08 Sep 2010 03:48:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Bitwise Operators</title>
		<link>http://caioariede.com/2009/bitwise-operators</link>
		<comments>http://caioariede.com/2009/bitwise-operators#comments</comments>
		<pubDate>Mon, 09 Nov 2009 01:53:11 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=578</guid>
		<description><![CDATA[Uma forma muito elegante de armazenar uma série de regras, utilizando um só valor, é utilizando os Bitwise Operators.
O PHP faz isso a um bom tempo já, e um bom exemplo é a função error_reporting, onde podemos utilizar uma série de regras para denominar quais os erros devem ser reportados.
error_reporting(E_ERROR &#124; E_WARNING);
No exemplo acima, foi [...]]]></description>
			<content:encoded><![CDATA[<p>Uma forma muito elegante de armazenar uma série de regras, utilizando um só valor, é utilizando os Bitwise Operators.</p>
<p>O PHP faz isso a um bom tempo já, e um bom exemplo é a função <a href="http://br2.php.net/manual/en/function.error-reporting.php">error_reporting</a>, onde podemos utilizar uma série de regras para denominar quais os erros devem ser reportados.</p>
<pre lang="php">error_reporting(E_ERROR | E_WARNING);</pre>
<p>No exemplo acima, foi denominado que somente os tipos de erro E_ERROR e E_WARNING devem ser reportados. Se quiséssemos que o tipo de erro E_PARSE fosse reportado também, bastariamos adiciona-lo na regra:</p>
<pre lang="php">error_reporting(E_ERROR | E_WARNING | E_PARSE);</pre>
<h3>Mas como isso funciona?</h3>
<p>Utilizando como exemplo, essas contantes do PHP contém os seguintes valores:</p>
<pre>E_ERROR		1
E_WARNING	2
E_PARSE		4</pre>
<p>O operador | é uma operação &#8220;Or&#8221; inclusiva, o que indica que, <em>todo bit que estiver presente em A <strong>ou</strong> B, será utilizado</em>.</p>
<pre>0001 ou
0010
=
0011</pre>
<p>Podemos verificar o valor em binário de cada uma das constantes, utilizando a função <a href="http://br2.php.net/manual/en/function.printf.php">printf</a>:</p>
<pre lang="bash">$ php -r 'printf("%04b", E_ERROR);'
0001
$ php -r 'printf("%04b", E_WARNING);'
0010
$ php -r 'printf("%04b", E_PARSE);'
0100</pre>
<p>Portanto, voltando ao exemplo inicial da função error_reporting, temos:</p>
<pre lang="php">E_ERROR | E_WARNING</pre>
<p>E se fizermos a operação, obteremos 0011, vejamos:</p>
<pre lang="php">$ php -r 'printf("%04b", E_ERROR | E_WARNING);'
0011</pre>
<p>E como verificamos se <code>E_ERROR</code> esta contido em <code>E_ERROR | E_WARNING</code>?</p>
<p>Simples. Basta utilizar o operador &amp;, que realiza uma operação &#8220;And&#8221;, onde <em>somente são utilizados os bits presentes em A <strong>e</strong> B</em>.</p>
<pre lang="php">(E_ERROR | E_WARNING) &amp; E_ERROR</pre>
<p>Traduzindo em bits, ficaria:</p>
<pre>0011 e
0001
=
0001</pre>
<p>Veja que o resultado tem o mesmo valor de B, e é assim que funciona, basta comparar <code>E_ERROR</code> com o resultado de <code>(E_ERROR | E_WARNING) &amp; E_ERROR</code>.</p>
<p>Agora em PHP, já que um exemplo vale mais que mil palavras:</p>
<pre lang="php">if (E_ERROR == ((E_ERROR | E_WARNING) &amp; E_ERROR))
{
	echo 'E_ERROR presente nas regras';
}</pre>
<h3>Criando a sua própria série de regras</h3>
<p>Imagine uma situação, onde você possui um sistema com vários usuários, e cada usuário pode conter as permissões P_READ (leitura), P_WRITE (escrita), P_REMOVE (remoção).</p>
<p>Criamos então, uma permissão &#8220;base&#8221;, chamada P_NONE (nada).</p>
<pre lang="php">
define('P_NONE',	100);
</pre>
<p>E em seguida, as outras permissões:</p>
<pre lang="php">
define('P_READ',	P_NONE << 1);
define('P_WRITE',	P_NONE << 2);
define('P_REMOVE',	P_NONE << 3);
</pre>
<p>Logo, podemos criar uma regra para um usuário:</p>
<pre lang="php">
$mode = P_READ | P_WRITE;
</pre>
<p>E armazena-la em um banco de dados. Aqui utilizei um campo <code>int</code>, em um banco de dados MySQL.</p>
<pre lang="php">
mysql_query("update users set mode = $mode where id = $id");
</pre>
<p>Posteriormente, você pode listar os usuários que tem permissão para escrita:</p>
<pre lang="php">
$mode = P_WRITE;
$users = mysql_query("select * from users where (mode &#038; $mode) = $mode");
</pre>
<p>Para verificar com PHP:</p>
<pre lang="php">
if (P_READ == ($user->mode &amp; P_READ))
{
	echo 'Este usuário possui permissão para leitura.';
}
</pre>
<h3>Conclusão</h3>
<p>Você pode especificar várias e várias regras, utilizando apenas um valor, uma variável ou um campo no banco de dados. Basta utilizar alguns bits e operações lógicas.</p>
<p>Para maiores informações sobre os Bitwise Operators do PHP, basta acessar a URL:</p>
<p><a href="http://br2.php.net/language.operators.bitwise">http://br2.php.net/language.operators.bitwise</a></p>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2009/bitwise-operators/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando o seu próprio encurtador de URL&#8217;s usando a API do 307.to</title>
		<link>http://caioariede.com/2009/criando-o-seu-proprio-encurtador-de-urls-usando-php-e-a-api-do-307to</link>
		<comments>http://caioariede.com/2009/criando-o-seu-proprio-encurtador-de-urls-usando-php-e-a-api-do-307to#comments</comments>
		<pubDate>Fri, 21 Aug 2009 18:51:45 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=547</guid>
		<description><![CDATA[Demonstrar de forma simples objetiva, que é totalmente possível criar o seu próprio encurtador de URL&#8217;s de maneira simples, sem se preocupar com banco de dados, estatísticas, etc&#8230;
A explicação demonstra como requisitar links, como criar uma página de erro personalizada, e como utilizar o seu domínio para acessa-los.
Porém não há limites. Basta usar o seu [...]]]></description>
			<content:encoded><![CDATA[<p>Demonstrar de forma simples objetiva, que é totalmente possível criar o seu próprio encurtador de URL&#8217;s de maneira simples, sem se preocupar com banco de dados, estatísticas, etc&#8230;</p>
<p>A explicação demonstra como requisitar links, como criar uma página de erro personalizada, e como utilizar o seu domínio para acessa-los.</p>
<p>Porém não há limites. Basta usar o seu conhecimento junto da sua criatividade para criar o seu próprio encurtador, sem maiores preocupações.</p>
<p><a href="http://caioariede.com/arquivos/my-shortener.zip">Faça o download do código completo.</a></p>
<h3>Vamos tomar como exemplo o seguinte cenário:</h3>
<p>Você possui um blog ou uma agência digital, e quer espalhar os seus links através de um domínio próprio, no qual os seus clientes confiem meramente, e que não tenham medo de acessar achando que é algum vírus.</p>
<h3>Neste tutorial, teremos 4 arquivos:</h3>
<p><strong>.htaccess</strong></p>
<p><em>Para melhor o &#8220;visual&#8221; das URL&#8217;s</em></p>
<p><strong>307.class.php</strong><br />
<em>Classe para manipulação de links do 307.to</em></p>
<p><strong>shorturl.php</strong><br />
<em>Onde utilizamos a classe do 307.to</em></p>
<p><strong>404.php</strong><br />
<em>Página de erro personalizada</em></p>
<h3>A classe do 307</h3>
<p>A classe <em>class307</em> possui os seguintes métodos:</p>
<pre lang="php">public function set_format($format)</pre>
<p>Específica o formato do retorno, podendo ser json ou text.</p>
<pre lang="php">public function set_account_key($key)</pre>
<p>Específica a chave da sua conta.</p>
<pre lang="php">public function get($u)</pre>
<p>Requisita um link.</p>
<pre lang="php">public function post($u)</pre>
<p>Cria um link, se <em>account_key</em> for específicado o link será anexado a sua conta.</p>
<h3>Utilizando a classe</h3>
<p>Esse é o script principal do sistema, onde é utilizada a classe do 307 para requisitar os links.</p>
<p>Como você pode ver abaixo, o método <em>set_account_key</em> foi comentado para fins de demonstração, porém ele é extremamente importante, pois permita que somente os links criados por você possam ser acessados através do seu domínio.</p>
<pre lang="php">&lt;?php

require '307.class.php';

$class307 = new class307;
// optional
//$class307-&gt;set_account_key('&lt;YOUR ACCOUNT KEY&gt;');

try
{
	if (is_array($_GET['link']) || empty($_GET['link']))
	{
		throw new Exception();
	}

	$link = $_GET['link'];
	$url = $class307-&gt;get($link);

	//header('Location: ' . $url, TRUE, 307);
	header('Location: http://307.to/' . $link);
}
catch (Exception $error)
{
	include '404.php';
}</pre>
<p>Indo logo para a parte mais importante do código, verificamos se a variável &#8220;link&#8221; é do tipo Array ou se esta vazia. Caso um dos dois casos ocorra, geramos uma exceção.</p>
<pre lang="php">if (is_array($_GET['link']) || empty($_GET['link']))
{
...
}</pre>
<p>Logo depois, requisitamos o endereço através do método <strong>get</strong>:</p>
<pre lang="php">$url = $class307-&gt;get($link);</pre>
<p>Caso o link não exista, o método <strong>get</strong> gerará uma exceção, caso contrário continuará a execução.</p>
<p>Veja que ocorrendo alguma exceção, o arquivo <strong>404.php</strong> será chamado e logo em seguida a execução terminará.</p>
<h3>Utilizando a URL retornada</h3>
<p>Se o método <strong>get</strong> conseguir encontrar a URL, ela será armazenada na variável <strong>$url</strong>, no script de exemplo, eu somente utilizei o método <em>get</em> para verificar se o link existe ou não, e então redirecionei para a página do próprio 307.to onde serão geradas estatísticas de acesso e tudo mais. Mas nada impede que você faça a sua própria coleta de estatísticas e então redirecione o usuário para a página final.</p>
<h3>Testando o script</h3>
<p>Para testar o script, basta realizar as seguintes requisições:</p>
<pre>http://seusite.com.br/shorturl.php?link=rG</pre>
<p>e</p>
<pre>http://seusite.com.br/shorturl.php?link=ESSE_LINK_NAO_EXISTE</pre>
<p>Veja que a primeira requisição irá redirecionar para http://307.to/rG, enquanto a segunda exibirá uma página de erro (404.php).</p>
<h3>Personalizando a URL (Escondendo o shorturl.php)</h3>
<p>Para encurtar o link, você pode usar algumas regras no .htaccess, que permitem que você esconda o nome do arquivo, no caso &#8220;shorturl.php&#8221;.</p>
<p>.htaccess</p>
<pre lang="apache">RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ shorturl.php?link=$1</pre>
<p>Agora para acessar o seu link, basta requisitar o endereço:</p>
<pre>http://seusite.com.br/rG</pre>
<h3>Personalizando a página de erro (404.php)</h3>
<p>Para personalizar a página de erro, basta ter um pouco de conhecimento de HTML:</p>
<p>404.php</p>
<pre lang="php">&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="content-type" content="text/html;charset=UTF-8" /&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;h1&gt;Erro - Link não encontrado&lt;/h1&gt;

&lt;em&gt;
&lt;?php
printf('%d - %s', $error-&gt;getCode(), $error-&gt;getMessage());
?&gt;
&lt;/em&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<h3>Download do código</h3>
<p>Para fazer o download do código completo citado, basta clicar no link abaixo:</p>
<p><a href="http://caioariede.com/arquivos/my-shortener.zip">Download<br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2009/criando-o-seu-proprio-encurtador-de-urls-usando-php-e-a-api-do-307to/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Kohana PHP: Brincando com os Hooks</title>
		<link>http://caioariede.com/2009/kohana-php-brincando-com-os-hooks</link>
		<comments>http://caioariede.com/2009/kohana-php-brincando-com-os-hooks#comments</comments>
		<pubDate>Tue, 26 May 2009 13:59:11 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=525</guid>
		<description><![CDATA[Os Hooks do Kohana PHP são realmente úteis. Demonstrarei como utiliza-los, exemplificando a sua utilização em uma situação real.
O que são Hooks?
Hooks são arquivos que são carregados na inicialização do Kohana, permitindo você adicionar ou modificar funções, chamadas callbacks, que são disparadas pelo Kohana.
Essas funções (ou callbacks) são colocados em uma lista dentro do seu [...]]]></description>
			<content:encoded><![CDATA[<p>Os Hooks do <a href="http://kohanaphp.com/">Kohana <a href="http://sledge.boo-box.com/list/page/ZnJhbWV3b3JrJTJDK3BocCs1JTJDK2VkaXRvciUyQytsaW51eCUyQytvcmllbnRhJUU3JUUzbythK29iamV0b3NfIyNfYm94XyMjX3RhZ2dpbmctdG9vbC13cF8jI18yODM0ODQ=-136" class="bbli">PHP<img src="http://boo-box.com/bbli" alt="[bb]" class="bbic" /></a></a> são realmente úteis. Demonstrarei como utiliza-los, exemplificando a sua utilização em uma situação real.</p>
<h3>O que são Hooks?</h3>
<p>Hooks são arquivos que são carregados na inicialização do Kohana, permitindo você adicionar ou modificar funções, chamadas <em>callbacks</em>, que são disparadas pelo Kohana.</p>
<p>Essas funções (ou <em>callbacks</em>) são colocados em uma lista dentro do seu evento específico, chamada Event Queue.</p>
<h3>O que são Eventos?</h3>
<p>Durante a inicialização, e até mesmo durante a execução, em alguns casos, o núcleo do Kohana dispara vários eventos. Eventos que são definidos pelo próprio núcleo.</p>
<p>Você pode ver a lista completa de eventos disparados pelo Kohana, na documentação: <a href="http://docs.kohanaphp.com/general/events">http://docs.kohanaphp.com/general/events</a></p>
<h3>Habilitando os Hooks no Kohana</h3>
<p>Para começar a brincar com os Hooks, é necessário habilitá-los. Para isso, basta configurar a opção <em>enable_hooks</em> no <em>config/config.php</em>, para <em>TRUE</em>:</p>
<pre lang="php">$config['enable_hooks'] = TRUE;</pre>
<h3>Exemplo de utilização de Hooks</h3>
<p>Suponha que tenhamos um site com sistema de autenticação.</p>
<p>Quando um visitante chega, ele é logo direcionado ao <em>controller</em> padrão, definido em <em>config/routes.php</em>, pela seguinte linha:</p>
<pre lang="php">$config['_default'] = 'site';</pre>
<p style="text-align: justify;">O <em>controller</em> site, contém os métodos (páginas): Home (com formulário de autenticação), Quem Somos, Ajuda&#8230;</p>
<p>Agora, o que fazer quando este visitante já estava autenticado anteriormente, e retorna ao site?</p>
<p>A solução mais simples a se fazer, é criar uma verificação no <em>controller</em> site, e caso o usuário já esteja autenticado ele será redirecionado à outro <em>controller</em>, chamado <span style="text-decoration: underline;">painel</span>.</p>
<h4>Problema</h4>
<p>A cada redirecionamento do <em>controller</em> site ao controller <em>painel</em>, seria realizado outra inicialização do sistema completo.</p>
<h4>Solução</h4>
<p>Uma solução elegante e correta para isso, é utilizar um Hook para informar ao <em>Router</em>, o <em>controller</em> correto a ser chamado.</p>
<p>O <em>Router</em> é quem define através da URL, qual <em>controller</em> deverá ser chamado, portanto a única coisa que terá de ser feita, é dizer à ele qual <em>controller</em> ele deverá chamar.</p>
<p>Criamos então, o arquivo <em>hooks/site.php</em>, o nome não importa, a não ser por fácil identificação posteriormente.</p>
<p>No arquivo, é especificado que no momento do evento <em>system.routing</em>, uma função (leia-se <em>callback</em>) será chamada, antes do <em>Router::setup</em>.</p>
<p>Esse <em>callback</em> definirá o <em>controller</em> correto à ser carregado.</p>
<pre lang="php">&lt;?php defined('SYSPATH') OR die('No direct access allowed.');

function hook_define_controller_padrao()
{
	if (!empty(Router::$current_uri)) return;
	if (Session::instance()-&gt;get('user'))
		// usuário logado
		Router::$current_uri = 'painel';
}</pre>
<p>Você pode também impossibilitar o acesso à página de autenticação, quando o usuário já estiver autenticado, modificação a função <em>callback</em> acima, da seguinte forma:</p>
<pre lang="php">function hook_define_controller_padrao()
{
	$logado = Session::instance()-&gt;get('user');
	if (empty(Router::$current_uri) &amp;&amp; $logado)
		// usuário autenticado
		Router::$current_uri = 'painel';
	elseif (Router::$current_uri == 'site/login' &amp;&amp; $logado)
		// exibir "página não encontrada"
		Event::run('system.404');
}</pre>
<p>Criada a função, é necessário que seja adicionada à lista de eventos a serem realizados, isso pode ser feito logo abaixo da função, ou no final do arquivo Hook.</p>
<pre lang="php">Event::add_before(
	'system.routing',
	array('Router', 'setup'),
	'hook_define_controller_padrao'
);</pre>
<p>Existe também como definir novos eventos, mas isso fica para outro artigo, pois este é somente uma introdução sobre o assunto.</p>
<p>Utilize os Hooks sempre que possível, eles poderão reduzir inúmeras linhas no seu código, tornando-o mais enxuto, legível e organizado.</p>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2009/kohana-php-brincando-com-os-hooks/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kohana PHP: Boas práticas de desenvolvimento</title>
		<link>http://caioariede.com/2009/kohanaphp-boas-praticas-de-desenvolvimento</link>
		<comments>http://caioariede.com/2009/kohanaphp-boas-praticas-de-desenvolvimento#comments</comments>
		<pubDate>Wed, 20 May 2009 13:03:19 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php + framework]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=453</guid>
		<description><![CDATA[Este artigo tem como objetivo relembrar algumas das funcionalidades disponibilizadas pelo excelente framework Kohana PHP. Funcionalidades estas que podem facilitar, e muito, na hora de desenvolver ou refatorar uma aplicação.
Serve também para aqueles que estão começando a se familiarizar com o framework e querem aprender um pouco mais sobre as possibilidades que ele oferece.
Singleton
Singleton é [...]]]></description>
			<content:encoded><![CDATA[<p>Este artigo tem como objetivo relembrar algumas das funcionalidades disponibilizadas pelo excelente framework <a href="http://kohanaphp.com/">Kohana PHP</a>. Funcionalidades estas que podem facilitar, e muito, na hora de desenvolver ou refatorar uma aplicação.</p>
<p>Serve também para aqueles que estão começando a se familiarizar com o framework e querem aprender um pouco mais sobre as possibilidades que ele oferece.</p>
<h3>Singleton</h3>
<p>Singleton é um padrão (Design Pattern) que garante que suas classes serão instânciadas somente uma vez, podendo ser acessadas de forma global, evitando a criação de várias instâncias desnecessarias da mesma.</p>
<p>No KohanaPHP isso pode ser aplicado nas bibliotecas, pois todas as bibliotecas tem suporte a Singleton.</p>
<p>Ao invés de criar uma nova instância:</p>
<pre lang="php">$this-&gt;session = new Session;</pre>
<p>Você utiliza o método estático <em>instance</em>:</p>
<pre lang="php">$this-&gt;session = Session::instance();</pre>
<p>O que o método <em>instance</em> cria uma nova instância, armazena-a em uma variável, e a retorna. Na próxima chamada é feita uma verificação, caso uma variável com a instância já exista, ao invés de criar uma nova, ele retorna a instância contida na variável.</p>
<h3>Utilize o Query Builder</h3>
<p>Muita gente odeia Query Builders por serem um tanto limitados, porém se você quiser que a sua aplicação seja independente de banco de dados, use-o. Deixe para escrever SQL&#8217;s somente quando for realmente necessários.</p>
<p>O Query Builder suporta <em>method chaining</em>, o que pode deixar o código mais elegante.</p>
<p><em>Exemplos de Method Chaining com Query Builder</em></p>
<pre lang="php">$result = $this-&gt;db-&gt;select('id, nome')
                   -&gt;from('tabela')
                   -&gt;where(array('categoria' =&gt; 1))
                   -&gt;limit(10)
                   -&gt;get();</pre>
<pre lang="php">$result = $this-&gt;db-&gt;select('id')
                   -&gt;getwhere('tabela', array('categoria' =&gt; 2));</pre>
<p><em>Contando total de registros em uma tabela</em></p>
<pre lang="php">$total_usuarios = $this-&gt;db-&gt;count_records('usuarios');</pre>
<h3>Utilize segmentos, de preferência nomeados</h3>
<p>Ao invés de usar variáveis <em>$_GET</em>, dê preferência aos segmentos. Além de mais elegantes, são mais fáceis de serem manipulados.</p>
<p>http://meusite/clientes/busca/<strong>cidade</strong>/Bauru/<strong>estado</strong>/SP</p>
<p>Onde <em>clientes</em> é o controller, <em>busca</em> é o método, e <em>cidade</em> e <em>estado</em> são segmentos.</p>
<pre lang="php">$cidade = uri::segment('cidade');</pre>
<pre lang="php">$estado = uri::segment('estado');</pre>
<h3>Nunca modifique os arquivos do diretório <em>system</em></h3>
<p>Os recursos disponíveis pelo Kohana, são carregados no formato de cascata, ou seja, primeiro ele verifica se o arquivo existe no diretório <em>application</em>, caso não exista, então procura nos diretórios de cada módulo, em seguida no diretório <em>system</em>.</p>
<p>Um bom exemplo são os arquivos de configuração, localizados no diretório <em>system/config/</em>.</p>
<p>O caminho percorrido até ele chegar em qualquer arquivo dentro deste diretório, é o seguinte:</p>
<pre>application/config/auth.php
--&gt; modules/archive/config/auth.php
--&gt; modules/flot/config/auth.php
--&gt; modules/auth/config/auth.php (encontrado)</pre>
<p>Caso não fosse encontrado, ele continuaria a pesquisar, terminando no diretório <em>system</em>:</p>
<pre>system/config/auth.php</pre>
<p>Por isso é muito importante transferir todos os arquivos necessários para o diretório <em>application</em>, e nunca modifica-los nos seus diretórios de origem.</p>
<h3>Use os helpers e bibliotecas disponíveis</h3>
<p>O Kohana disponibiliza uma série de helpers e bibliotecas que podem facilitar e muito o desenvolvimento. Não invente a roda à todo momento.</p>
<p><em>Exemplo de utilização do helper Upload</em></p>
<pre lang="php">$filename = $_FILES['arquivo']['name'];
$tmp_name = $_FILES['arquivo']['tmp_name'];

$filename_path = upload::save(array
(
	'name' =&gt; $filename,
	'tmp_name' =&gt; $tmp_name
), $filename);

$filename = basename($filename_path);</pre>
<p><em>Exemplo de utilização da biblioteca Pagination</em></p>
<pre lang="php">$this-&gt;pagination = new Pagination(array
(
	'base_url'       =&gt; 'noticias/page/',
	'uri_segment'    =&gt; 'page',
	'total_items'    =&gt; $total_num_rows,
	'items_per_page' =&gt; $rows,
	'style'          =&gt; 'digg'
));

echo $this-&gt;pagination;</pre>
<p>No exemplo acima, será impressa uma paginação no estilo Digg.</p>
<p>Existem outros estilos de paginação que podem ser conferidos através da documentação:</p>
<p>http://docs.kohanaphp.com/libraries/pagination</p>
<h3>Estenda os helpers, sempre que necessário</h3>
<p>Uma prática muito encorajada no Kohana é a extensão dos helpers para se adequar as suas necessidades.</p>
<p>Por exemplo, podemos estender o helper <em>format</em>, para formatar também o tamanho de arquivos, criando o arquivo <em>MY_format.php</em> dentro do diretório helpers da sua apliação, geralmente <em>application/helpers</em>.</p>
<p><em>applications/helpers/MY_format.php</em></p>
<pre lang="php">&lt;?php defined('SYSPATH') or die('No direct script access.');

class format extends format_Core
{
	public static function filesize($size)
	{
		$sizes = array('B', 'kB', 'MB', 'GB',
		            'TB', 'PB', 'EB', 'ZB', 'YB');
		$c = count($sizes) - 1;
		for ($i = 0; $size &gt; 1024 &amp;&amp; $i &lt; $c; $i++)
			$size /= 1024;
		return round($size, 2) . $sizes[$i];
	}
}</pre>
<pre lang="php">echo format::filesize(1024*4); // 4kB</pre>
<p>Lembre-se, todo arquivo de extensão deve ser iniciado por <em>MY_</em>, é um padrão definido pelo Kohana.</p>
<h3>Internacionalização</h3>
<p>Criar uma aplicação multi-idiomas com o Kohana é relativamente simples.</p>
<p>Primeiro crie o diretório <em>i18n</em> dentro de <em>applications</em>, e em seguida crie o diretório <em>pt_BR</em>.</p>
<p><em>applications/i18n/pt_BR/</em></p>
<p>Após isso, as strings são divididas entre arquivos, dentro desse diretório, por exemplo:</p>
<p><em>applications/i18n/pt_BR/caption.php</em></p>
<p>Dentro de cada arquivo, são especificadas as strings:</p>
<pre lang="php">&lt;?php defined('SYSPATH') OR die('No direct access allowed.');

$lang = array
(
	'submit' =&gt; 'Enviar',
	'cancel' =&gt; 'Cancelar',
	'confirm' =&gt; 'Confirmar',
);</pre>
<pre lang="php">echo Kohana::lang('caption.submit'); // Enviar</pre>
<p>Também é permitido a utilização de Arrays:</p>
<pre lang="php">'confirm' =&gt; array
(
	'edit?' =&gt; 'Editar texto?',
	'remove?' =&gt; 'Remover texto?'
);</pre>
<pre lang="php">echo Kohana::lang('message.confirm.edit?'); // Editar texto?</pre>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2009/kohanaphp-boas-praticas-de-desenvolvimento/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>PHP para Web Designers</title>
		<link>http://caioariede.com/2009/php-para-web-designers</link>
		<comments>http://caioariede.com/2009/php-para-web-designers#comments</comments>
		<pubDate>Sat, 16 May 2009 18:16:23 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=440</guid>
		<description><![CDATA[Objetivo
O objetivo desse material, é disponibilizar um caminho para os Web Designers aprenderem um pouco mais sobre PHP, explicando algumas instruções básicas (se-então-senão, include, por exemplo), e algumas funções que geralmente são úteis, e facilitam o desenvolvimento básico de sites e layouts.
O manual do PHP
Tudo o que será demonstrado nesse artigo, esta documentado no manual [...]]]></description>
			<content:encoded><![CDATA[<h3>Objetivo</h3>
<p>O objetivo desse material, é disponibilizar um caminho para os Web Designers aprenderem um pouco mais sobre PHP, explicando algumas instruções básicas (se-então-senão, include, por exemplo), e algumas funções que geralmente são úteis, e facilitam o desenvolvimento básico de sites e layouts.</p>
<h3>O manual do PHP</h3>
<p>Tudo o que será demonstrado nesse artigo, esta documentado no manual oficial do PHP, onde inclusive existem exemplos e comentários de outras pessoas.</p>
<p>O manual do PHP é uma ótima fonte de referência. Lá você tem uma explicação detalhada para a utilização de praticamente todas as funções, e pode ser encontrado aqui: <a href="http://www.php.net/manual/pt_BR/index.php">http://www.php.net/manual/pt_BR/index.php<br />
</a></p>
<p>Uma forma rápida de acesso ao manual, é ir direto na página da função desejada, por exemplo:</p>
<p><a href="http://php.net/include">http://php.net/include</a><br />
<a href="http://php.net/echo">http://php.net/echo</a><br />
<a href="http://php.net/date">http://php.net/date</a><br />
<a href="http://php.net/string">http://php.net/string</a></p>
<h3>Os tipos de dados</h3>
<p>Os principais tipos de dados em PHP, são: Booleanos, Inteiros, Números de ponto flutuante e Strings.</p>
<p>Não abordarei os demais tipos de dados, pois não serão comentados neste material introdutório.</p>
<p><strong>Booleano</strong>, é o tipo de dado Sim / Não, Verdadeiro / Falso, 1 / 0.</p>
<p>Em PHP são descritos como <strong>true</strong> e <strong>false</strong>, ou <strong>1</strong> e <strong>0</strong>. Onde 1 é true, e 0 é false.</p>
<p><strong>Inteiros</strong> (<strong>Z</strong>), os que você aprendeu no ensino fundamental: &#8230;, -2, -1, 0, 1, 2, &#8230;</p>
<p><strong>Números de Ponto Flutuante</strong>, são números reais: -1.15, 0.333333, 1, 1.5, 400.20, &#8230;</p>
<p>e finalmente, uma <strong>String</strong> é uma cadeia de caracteres (texto, frase, palavra&#8230;):</p>
<p>Uma string em PHP é descrita dentre &#8216; (aspas simples) ou &#8221; (aspas duplas).</p>
<p>A diferença entre uma string entre aspas simples, e outra entre aspas duplas, é que a string entre aspas duplas, sempre espera por receber uma variável (dentro dela), como será visto mais além, durante a leitura.</p>
<p>&#8220;String entre aspas duplas&#8221;</p>
<p>&#8216;String entre aspas simples&#8217;</p>
<h3>Comentários</h3>
<p>Assim como no HTML, o PHP também possui comentários, vejamos:</p>
<p>Em HTML:</p>
<pre lang="xml">&lt;!-- Comentário no meio de um arquivo HTML --&gt;</pre>
<p>em PHP:</p>
<pre lang="php">&lt;?php

// Comentário no meio de um arquivo PHP (somente uma linha)

/*
Comentário para
várias linhas, em PHP
(várias linhas)
*/

?&gt;</pre>
<h3><span id="more-440"></span></h3>
<h3>As condições If-then-else (Se-então-senão)</h3>
<p>Não se assute com essa parte do material, pois é só um pré-requisito para o melhor entendimento do material por um todo. Você conseguirá entender melhor isso conforme o andamento da leitura, vendo a aplicação disso na prática.</p>
<p>O <strong>if-then-else</strong> trabalha em cima de condições, condições que são geralmente são avaliadas através de Operadores Comparativos e Operadores Lógicos.</p>
<p>Os principais <strong>Operadores Comparativos</strong>, são: == (igual), != (diferente), &lt; (menor), &gt; (maior), &lt;= (menor ou igual), &gt;= (maior ou igual).</p>
<p>Os principais <strong>Operadores Lógicos</strong>, são: &amp;&amp; (e), || (ou) e ! (negação).</p>
<p>Na prática, isso tudo é muito simples:</p>
<pre lang="php">1 == 1, 1 é igual à 1
1 != 2, 1 é diferente de 2

1 &lt; 2, 1 é menor que 2
2 &gt; 1, 2 é maior que 1

1 &lt;= 2, 1 é menor ou igual à 2
2 &gt;= 2, 2 é maior ou igual à 2</pre>
<p>Agora em conjunto com os <strong>Operadores Lógicos</strong>:</p>
<pre lang="php">1 == 1 &amp;&amp; 1 &lt; 2, 1 é igual à 1, E, 1 é menor que 2.
2 &gt; 1 &amp;&amp; 2 &gt;= 2, 2 é maior que 1, E, 2 é maior ou igual à 2.</pre>
<p>A sintaxe do <strong>if-then-else</strong> é mais simples ainda:</p>
<p><strong>If</strong></p>
<pre lang="php">se (verdade), então
	faz isso
fim</pre>
<p><strong>If, Else</strong></p>
<pre lang="php">se (verdade), então:
	faz isso
senão
	faz isso 2
fim</pre>
<p>Agora, traduzindo para o PHP, seria:</p>
<p><strong>If</strong></p>
<pre lang="php">if (condicao for verdade)
{
	echo 'faz isso';
}</pre>
<p><strong>If, Else</strong></p>
<pre lang="php">if (condicao for verdade)
{
	echo 'faz isso';
}
else
{
	echo 'faz isso 2';
}</pre>
<p>O PHP também suporta o <strong>Else-If</strong> (Senão-se):</p>
<pre lang="php">&lt;?php
	if (numero &lt; 0)
	{
		// Numéro negativo
	}
	elseif (numero &lt; 5)
	{
		// Número menor que 5
	}
	elseif (numero &lt;= 10)
	{
		// Número menor ou igual a 10
	}
	else
	{
		// Um número qualquer, acima de 10
	}
?&gt;</pre>
<p>Existe também outra forma de se fazer um If, que é chamado de Operador Ternário:</p>
<pre lang="php">CONDICAO ? ENTAO : SENAO</pre>
<p>em PHP:</p>
<pre lang="php">&lt;?php 1 == 1 ? 1 : O; ?&gt;</pre>
<p>Explicando: <strong>Se</strong> 1 é igual a 1, <strong>então</strong> 1, <strong>senão</strong> 0.</p>
<h3>O include</h3>
<p>A instrução <strong>include</strong> pode facilitar muito na criação do layout, pois possibilita separar o layout em arquivos, como no exemplo abaixo:</p>
<pre lang="php">&lt;?php include 'cabecalho.php'; ?&gt;

Olá Mundo!

&lt;?php include 'rodape.php'; ?&gt;</pre>
<p><strong>Notas</strong></p>
<ul>
<li>O arquivo utilizado no <em>include</em> não precisa necessáriamente ser PHP, pode ser qualquer tipo de arquivo de texto plano, ou seja, nada de imagens, claro.</li>
<li>O que o <em>include</em> faz, basicamente, é embutir o arquivo especificado formando um único arquivo.</li>
<li>Um <em>include</em> pode também conter outros <em>include</em>&#8217;s. Você pode ter um include chamado menu.php dentro do seu cabecalho.php.</li>
</ul>
<h3>Utilização de Variáveis</h3>
<p>Suponha que o arquivo <strong>cabecalho.php</strong> contenha o seguinte trecho de código:</p>
<pre lang="xml">&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;Título da Página&lt;/title&gt;
&lt;/head&gt;</pre>
<p>Veja que se você utilizar o arquivo <strong>cabecalho.php</strong>, em todas as suas páginas, todas as páginas terão o mesmo título, pois ele esta definido de forma estática, imutável.</p>
<p>Caso queira que cada página contenha um título diferente, por exemplo: Início, Blog e Contato.</p>
<p>Você deve especificar que o arquivo <strong>cabecalho.php</strong> contém uma área de conteúdo variável, sujeita a modificações, mutável. Isso é feito através da utilização de variáveis.</p>
<p>Como exemplo, um arquivo chamado <strong>contato.php</strong>, conteria o seguinte trecho de código:</p>
<pre lang="php">&lt;?php
	$titulo_da_pagina = 'Contato';
?&gt;

&lt;?php include 'cabecalho.php'; ?&gt;

Entre em contato conosco... Telefone: (99) 9999-9999

&lt;?php include 'rodape.php'; ?&gt;</pre>
<p>E no arquivo <strong>cabecalho.php</strong> seria especificada a variável, no lugar do título:</p>
<pre lang="php">&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;Meu Site | &lt;?php echo $titulo_da_pagina; ?&gt;&lt;/title&gt;
&lt;/head&gt;</pre>
<p>A instrução <strong>echo</strong>, basicamente imprime o que é passado de parâmetro. No caso acima, uma variável, que foi pré-definida com o conteúdo: Contato</p>
<p>A sintaxe da variável é simples. Para a criação, utiliza-se:</p>
<pre lang="php">$nomedavariavel = 'Conteudo da variavel';</pre>
<p>O $ (sifrão) é o que identifica uma variável. O nome das variáveis podem conter somente letras, números e _ (underline), mas nunca devem começar com número. O conteúdo delas pode variar:</p>
<pre lang="php">&lt;?php
	$se_for_um_texto = 'Utilize aspas simples...';
	$se_for_um_texto = "ou aspas duplas";
	$se_for_um_numero = 15;
	$se_for_um_valor = 99.99;
?&gt;</pre>
<p>Para imprimir uma variável é mais simples:</p>
<pre lang="php">&lt;?php echo $nomedavariavel; ?&gt;</pre>
<h3>Utilizando uma variável para especificar um include</h3>
<p>Como nós vimos, a sintaxe para um include é a seguinte:</p>
<p style="padding-left: 30px;">include &lt;STRING&gt;;</p>
<p>Para você poder inserir uma variável dentro da string, a string deverá iniciar e terminar com &#8221; (aspas duplas). Pois uma string com aspas duplas, indica que ela poderá conter variáveis, então tratará o $ (sifrão) de forma diferente, como se fosse uma variável.</p>
<pre lang="php">$pagina = 'historia'; // não haverá nenhuma variável no meio da string

include "includes/$pagina.php"; // existe uma variável no meio da string</pre>
<p>Lembre-se, que se você utilizar aspas simples em uma string que contém uma variável, o sifrão será impresso como se fosse um sifrão mesmo:</p>
<pre lang="php">&lt;?php
	echo 'minha variável $teste';
	// imprimirá: minha variável $teste
?&gt;</pre>
<p><strong>Notas</strong></p>
<ul>
<li>Lembre-se de utilizar o &#8220;<strong>;</strong>&#8220;, caso contrário terá problemas.</li>
<li>Prefira usar <strong>&#8216;</strong> na maioria das vezes, use <strong>&#8220;</strong> apenas quando for necessário colocar uma variável dentro da string.</li>
<li>Em alguns códigos, você pode encontrar a função &#8220;<strong>print</strong>&#8221; no lugar do &#8220;<strong>echo</strong>&#8220;, as duas fazem praticamente a mesma coisa, mas dê sempre preferência ao <strong>echo</strong>.</li>
</ul>
<h3>Verificação de tipos de variáveis</h3>
<p>Você pode verificar se uma variável é do tipo que você espera, exemplos:</p>
<pre lang="php">&lt;?php
	if (is_int(1))
		echo 'verdadeiro';
	if (is_numeric(1.5))
		echo 'verdadeiro';
	if (is_string('foobar'))
		echo 'verdadeiro';
	if (is_string(100))
		echo 'falso';
?&gt;</pre>
<h3>Variáveis Globais: $_GET e $_POST</h3>
<p>Supondo que você tenha uma página chamada <strong>teste.php</strong>, vamos fazer alguns testes com essas variáveis globais.</p>
<p>A variável global <strong>$_GET</strong>, serve para transportar uma variável da URL para dentro do seu código, por exemplo, tendo o <strong>teste.php</strong> com o seguinte conteúdo:</p>
<pre lang="php">&lt;?php echo $_GET['pagina']; ?&gt;</pre>
<p>Ao chamarmos: http://seusite/teste.php?pagina=exemplo, você terá:</p>
<pre lang="html">exemplo</pre>
<p>E basicamente é isso. Porém também temos que trabalhar visando que essa variável pode não existir, então é necessário trata-la, para evitar erros, então usamos a condição <strong>if-then-else</strong> junto à função <strong>empty</strong>.</p>
<p>A função <strong>empty</strong> retorna <strong>TRUE</strong>, caso a variável:</p>
<ol>
<li>Não exista</li>
<li>Seja 0 (zero)</li>
<li>Seja false (booleano)</li>
<li>Esteja em branco</li>
</ol>
<p>Caso contrário, retorna <strong>true</strong>.</p>
<pre lang="php">&lt;?php
	if (empty($_GET['pagina']))
	{
		echo 'a variável página não existe, ou esta vazia';
	}
	else
	{
		echo $_GET['pagina'];
	}
?&gt;</pre>
<p>As variáveis <strong>$_GET</strong> são comumente utilizadas em <strong>includes</strong>, porém deve haver um <strong>cuidado muito grande</strong>.</p>
<p>Sempre verifique qual o conteúdo da variável antes de coloca-la no include, por exemplo:</p>
<pre lang="php">if (empty($_GET['pagina'])) $pagina = NULL;
else $pagina = $_GET['pagina'];

if ($pagina == 'historia') include 'historia.php';
elseif ($pagina == 'contato') include 'contato.php';
elseif ($pagina == 'noticias') include 'noticias.php';
else include 'default.php';</pre>
<p><strong>NUNCA utilize:</strong></p>
<pre lang="php">include $_GET['pagina'] . '.php';</pre>
<p>Pois isso poderá ocasionar uma invasão no seu site, mas isso não é o foco do artigo, apenas não faça-o, tenha total controle do que será incluso.</p>
<p>A variável global <strong>$_POST,</strong> é geralmente utilizada em formulários, de login por exemplo, onde não é recomendado óbviamente mostrar a senha na URL.</p>
<p>Variáveis $_POST são criadas quando um formulário é especificado com <em>method=&#8221;POST&#8221;</em>, por exemplo:</p>
<p><strong>form.php</strong></p>
<pre lang="xml">&lt;form method="POST" action="teste.php"&gt;
	Nome: &lt;input type="text" name="meunome" /&gt;
	Idade: &lt;input type="text" name="idade" /&gt;
	&lt;input type="submit" value="Enviar" /&gt;
&lt;/form&gt;</pre>
<p>Para recuperar o valor desse campo no PHP, você teria de fazer:</p>
<p><strong>teste.php</strong></p>
<pre lang="php">&lt;?php
	// verificando se o método é mesmo POST
	if ($_SERVER['REQUEST_METHOD'] == 'POST')
	{
		if (empty($_POST['meunome']))
			$meunome = ''; // nenhum nome especificado
		else
			$meunome = $_POST['meunome'];

		if (empty($_POST['idade'))
			$idade = 0;
		else
			$idade = $_POST['idade'];

		// função is_int(), utilizada pra verificação do tipo Inteiro
		if (is_int($idade) &amp;&amp; $idade &gt;= 18)
			echo "Bem-vindo $nome"; // imprimindo saudação
		else
			echo "Conteúdo proibido para menores";
	}
?&gt;</pre>
<p>Simples não?</p>
<h3>Trabalhando com Datas</h3>
<p>Você pode automatizar aquele famoso &#8220;Copyright&#8221; no rodapé da página, utilizando a função <strong>date()</strong> do PHP:</p>
<p><strong>rodape.php</strong></p>
<pre lang="php">&lt;div class="rodape"&gt;
Todos os direitos reservados &amp;copy 2008-&lt;?php echo date('Y'); ?&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>O que vai &#8220;dentro&#8221; de uma função, é chamado de argumento. No exemplo acima, foi passado apenas um argumento, do tipo string: &#8216;Y&#8217;, o que diz à função date que queremos o ano (<strong>Y</strong>ear). Então, será impresso:</p>
<pre lang="php">Todos direitos reservados &amp;copy 2008-2009</pre>
<p>Exibindo a data de hoje:</p>
<pre lang="php">&lt;?php echo date('d/m/Y'); ?&gt;</pre>
<p><strong>Verificando se é Manhã, Tarde ou Noite (Comentado)<br />
</strong></p>
<pre lang="php">&lt;?php
	// Hora
	$hora = date('H');
	// se Hora for maior que 18 ou menor que 5
	// de 18:01 até 23:59 ou 0 até 04:59
	if ($hora &gt; 18 || $hora &lt; 5) echo 'Boa Noite';
	// se Hora for menor que 12
	// de 05:00 até 11:59
	elseif ($hora &lt; 12) echo 'Bom dia';
	// senão... é de tarde
	// de 12:00 até 18:00
	else echo 'Boa tarde';
?&gt;</pre>
<p>Uma lista com todos os formatos para a função &#8220;date&#8221; pode ser encontrada no manual do PHP, em: http://www.php.net/manual/en/function.date.php</p>
<h3>Tratamento de Strings</h3>
<p><strong>strtolower()</strong></p>
<p>A função strtolower() transforma todos caracteres em letras minúsculas.</p>
<p><span style="text-decoration: underline;">Exemplo</span></p>
<pre lang="php">&lt;?php echo strtolower('FooBar'); ?&gt;</pre>
<p><span style="text-decoration: underline;">Imprimirá</span></p>
<p>foobar</p>
<p><span style="text-decoration: underline;">Manual</span></p>
<p><a href="http://br2.php.net/strtolower">http://br2.php.net/strtolower</a></p>
<p><strong>strtoupper()</strong></p>
<p>A função strtoupper() é o inverso da strtolower(), transforma todos caracteres em letras maiúsculas.</p>
<p><span style="text-decoration: underline;">Exemplo</span></p>
<pre lang="php">&lt;?php echo strtoupper('foobar'); ?&gt;</pre>
<p><span style="text-decoration: underline;">Imprimirá</span></p>
<p>FOOBAR</p>
<p><span style="text-decoration: underline;">Manual</span></p>
<p><a href="http://br2.php.net/strtoupper">http://br2.php.net/strtoupper</a></p>
<p><strong>number_format()</strong></p>
<p>A função number_format() formata números, valores por exemplo.</p>
<p><span style="text-decoration: underline;">Exemplo</span></p>
<pre lang="php">R$ &lt;?php echo number_format(1300.40, 2, ',', '.'); ?&gt;</pre>
<p><span style="text-decoration: underline;">Imprimirá</span></p>
<p>R$ 1.300,40</p>
<p><span style="text-decoration: underline;">Manual</span></p>
<p><a href="http://br2.php.net/number_format">http://br2.php.net/number_format</a></p>
<p><strong>trim()</strong></p>
<p>A função trim() remove espaços no começo e no fim da string.</p>
<p><span style="text-decoration: underline;">Exemplo</span></p>
<pre lang="php">&lt;?php echo trim('   Texto'); ?&gt;</pre>
<p>É muito útil também para fazer validações:</p>
<pre lang="php">&lt;?php
	if (trim($nome) == '')
		echo 'Nome em branco';
?&gt;</pre>
<p><span style="text-decoration: underline;">Imprimirá</span></p>
<p>Texto (sem nenhum espaço no começo)</p>
<p><span style="text-decoration: underline;">Manual</span></p>
<p><a href="http://br2.php.net/trim">http://br2.php.net/trim</a></p>
<p><strong>wordwrap()</strong></p>
<p>A função wordwrap() quebra um texto em partes, a cada N caracteres.</p>
<p><span style="text-decoration: underline;">Exemplo</span></p>
<pre lang="php">&lt;?php echo wordwrap('um texto muito, mas muito longo.', 8, '&lt;br /&gt;'); ?&gt;</pre>
<p><span style="text-decoration: underline;">Imprimirá</span></p>
<pre lang="xml">um texto&lt;br /&gt;
 muito, &lt;br /&gt;
mas muit&lt;br /&gt;
o longo.</pre>
<p><span style="text-decoration: underline;">Manual</span></p>
<p><a href="http://br2.php.net/wordwrap">http://br2.php.net/wordwrap</a></p>
<p><strong>nl2br()</strong></p>
<p>A função nl2br() transforma quebras de linha em &lt;br /&gt; (HTML). Muito útil também quando retornando um campo texto, de um banco de dados.</p>
<p><span style="text-decoration: underline;">Exemplo</span></p>
<pre lang="php">&lt;?php echo nl2br('um
outro texto
só para exemplo...'); ?&gt;</pre>
<p><span style="text-decoration: underline;">Imprimirá</span></p>
<pre lang="xml">um&lt;br /&gt;
outro texto&lt;br /&gt;
só para exemplo...</pre>
<p><span style="text-decoration: underline;">Manual</span></p>
<p><a href="http://br2.php.net/nl2br">http://br2.php.net/nl2br</a></p>
<p><strong>strlen()</strong></p>
<p>A função strlen() retorna quantos caracteres a string possui.</p>
<p><span style="text-decoration: underline;">Exemplo</span></p>
<pre lang="php">&lt;?php echo strlen('cinco'); ?&gt;</pre>
<p><span style="text-decoration: underline;">Imprimirá</span></p>
<p>5</p>
<p><span style="text-decoration: underline;">Manual</span></p>
<p><a href="http://br2.php.net/strlen">http://br2.php.net/strlen</a></p>
<p><strong>htmlentities()</strong></p>
<p>A função htmlentities() converte caracteres que podem ocasionar problemas no seu HTML, como &lt;, &gt; e &amp; em entidades correspondentes, como: &amp;lt;, &amp;gt; e &amp;amp.</p>
<p><span style="text-decoration: underline;">Exemplo</span></p>
<pre lang="php">&lt;?php echo strlen('&lt;foo&gt;bar&amp;'); ?&gt;</pre>
<p><span style="text-decoration: underline;">Imprimirá</span></p>
<p>&amp;lt;foo&amp;gt;bar&amp;amp;</p>
<p><span style="text-decoration: underline;">Manual</span></p>
<p><a href="http://br2.php.net/htmlentities">http://br2.php.net/htmlentities</a></p>
<p><strong>urlencode()</strong></p>
<p>A função urlencode() serve para você codificar uma string de uma forma que ela fique de acordo com a especificação, do que é permitido utilizar em uma URL.</p>
<p><span style="text-decoration: underline;">Exemplo</span></p>
<pre lang="php">&lt;?php
	$titulo = 'Primeira noticia, teste';
	echo 'http://meusite/noticia.php?id=10&amp;titulo=' . urlencode($titulo);
?&gt;</pre>
<p><span style="text-decoration: underline;">Imprimirá</span></p>
<p>http://meusite/noticia.php?id=10&amp;titulo=Primeira+noticia%2C+teste</p>
<p><span style="text-decoration: underline;">Manual</span></p>
<p><a href="http://br2.php.net/urlencode">http://br2.php.net/urlencode</a></p>
<p><strong>urldecode()</strong></p>
<p>A função urldecode() é o inverso da urlencode().</p>
<p><span style="text-decoration: underline;">Exemplo</span></p>
<pre lang="php">&lt;?php echo urldecode('Primeira+noticia%2C+teste'); ?&gt;</pre>
<p><span style="text-decoration: underline;">Imprimirá</span></p>
<pre lang="php">Primeira noticia, teste</pre>
<p><span style="text-decoration: underline;">Manual</span></p>
<p><a href="http://br2.php.net/urldecode">http://br2.php.net/urldecode</a></p>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2009/php-para-web-designers/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ubuntu: Installing PECL</title>
		<link>http://caioariede.com/2009/ubuntu-installing-pecl</link>
		<comments>http://caioariede.com/2009/ubuntu-installing-pecl#comments</comments>
		<pubDate>Sun, 08 Mar 2009 12:28:19 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=425</guid>
		<description><![CDATA[PECL comes with php-pear package, then just apt-it:
$ sudo apt-get install php-pear
...
$ pecl version
PEAR Version: 1.7.1
PHP Version: 5.2.6-2ubuntu4.1
Zend Engine Version: 2.2.0
]]></description>
			<content:encoded><![CDATA[<p>PECL comes with php-pear package, then just apt-it:</p>
<pre lang="bash">$ sudo apt-get install php-pear
...
$ pecl version
PEAR Version: 1.7.1
PHP Version: 5.2.6-2ubuntu4.1
Zend Engine Version: 2.2.0</pre>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2009/ubuntu-installing-pecl/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&#8220;How to find php.ini&#8221; Linux e MacOSX</title>
		<link>http://caioariede.com/2009/how-to-find-phpini-linux-e-macosx</link>
		<comments>http://caioariede.com/2009/how-to-find-phpini-linux-e-macosx#comments</comments>
		<pubDate>Thu, 19 Feb 2009 13:37:40 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=410</guid>
		<description><![CDATA[Utilize o seguinte comando no terminal:
php -r 'phpinfo();' &#124; grep php.ini
Funciona em Linux e Unix*.
Update
Segundo o Walter Cruz, algumas distribuições como o Debian podem organizar os php.ini&#8217;s da vida de forma diferente, uma para cada situação: php cli, php cgi e mod_php.
Então se você estiver utilizando uma dessas distribuições, pode criar um arquivo test.php:
echo "&#60;?php [...]]]></description>
			<content:encoded><![CDATA[<p>Utilize o seguinte comando no terminal:</p>
<pre lang="bash">php -r 'phpinfo();' | grep php.ini</pre>
<p>Funciona em Linux e Unix*.</p>
<p><strong>Update</strong></p>
<p>Segundo o <a href="#comment-459">Walter Cruz</a>, algumas distribuições como o <strong>Debian</strong> podem organizar os php.ini&#8217;s da vida de forma diferente, uma para cada situação: php cli, php cgi e mod_php.</p>
<p>Então se você estiver utilizando uma dessas distribuições, pode criar um arquivo <em>test.php</em>:</p>
<pre lang="bash">echo "&lt;?php phpinfo(); ?&gt;" &gt; test.php</pre>
<p>Acessá-lo por CGI ou mod_php através do seu browser, e verificar o caminho especificado em <em>Configuration File (php.ini) Path</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2009/how-to-find-phpini-linux-e-macosx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalando o Apache 2 + PHP 5 com DarwinPorts no MacOSX</title>
		<link>http://caioariede.com/2009/instalando-o-apache-2-php-5-com-darwinports-no-macosx</link>
		<comments>http://caioariede.com/2009/instalando-o-apache-2-php-5-com-darwinports-no-macosx#comments</comments>
		<pubDate>Mon, 09 Feb 2009 15:25:45 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=373</guid>
		<description><![CDATA[Primeiro, caso não tenha o DarwinPorts, baixe ele e instale através deste link (é um pacote dmg).
Após isso, os passos seguem pelo terminal. Verifique se o comando port existe:
$ which port
Caso não exista, crie um atalho:
$ sudo ln -s /opt/local/bin/port /usr/bin/port
Atualize a lista de pacotes (é como se fosse um apt-get update do debian):
$ sudo [...]]]></description>
			<content:encoded><![CDATA[<p>Primeiro, caso não tenha o DarwinPorts, baixe ele e instale através <a href="http://darwinports.com/">deste link</a> (é um pacote dmg).</p>
<p>Após isso, os passos seguem pelo terminal. Verifique se o comando <em>port</em> existe:</p>
<pre lang="bash">$ which port</pre>
<p>Caso não exista, crie um atalho:</p>
<pre lang="bash">$ sudo ln -s /opt/local/bin/port /usr/bin/port</pre>
<p>Atualize a lista de pacotes (é como se fosse um <em>apt-get update</em> do debian):</p>
<pre lang="bash">$ sudo port -v selfupdate</pre>
<p>Em seguida, você pode utilizar o comando abaixo para procurar programas:</p>
<pre lang="bash">$ port search apache2</pre>
<p>Como nós vamos instalar o php5. É melhor instalarmos ele e como opção instalar o apache2 e mais alguns pacotes adicionais, como o mysql5, se você desejar. Para listar os pacotes adicionais ao php5, utilize a linha abaixo:</p>
<pre lang="bash">$ port -v variants php5</pre>
<p>Ele vai exibir uma série de variantes, escolha quais você quer instalar e mande instalar:</p>
<pre lang="bash">$ sudo port -v install php5 +apache2 +mysql5</pre>
<p>Após isso, você pode verificar que o apache2 e o php5 foram instalados, com a linha:</p>
<pre lang="bash">$ port installed | grep -i apache2\\\|php5</pre>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2009/instalando-o-apache-2-php-5-com-darwinports-no-macosx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript equivalent function to PHP&#8217;s strtotime()</title>
		<link>http://caioariede.com/2008/javascript-equivalent-function-to-phps-strtotime</link>
		<comments>http://caioariede.com/2008/javascript-equivalent-function-to-phps-strtotime#comments</comments>
		<pubDate>Fri, 26 Dec 2008 02:15:17 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=254</guid>
		<description><![CDATA[This function works in the same way of PHP&#8217;s strtotime, but no exactly. I mean &#8220;not exactly&#8221; because some things in Javascript is different of PHP. You will note that to use a timestamp created from PHP in this function, you will need to multiply this by 1000, because is the timestamp format used in [...]]]></description>
			<content:encoded><![CDATA[<p>This function works in the same way of PHP&#8217;s strtotime, but no exactly. I mean &#8220;not exactly&#8221; because some things in Javascript is different of PHP. You will note that to use a timestamp created from PHP in this function, you will need to multiply this by 1000, because is the timestamp format used in Javascript.</p>
<p>Other PHP functions can be found in the PHP.JS Project: <a href="http://phpjs.org/">http://phpjs.org/</a></p>
<ul>
<li><a href="/arquivos/strtotime.js">Source code</a></li>
</ul>
<h2>Examples of usage</h2>
<pre lang="javascript">var time = new Date(strtotime('now'));

alert([time.getFullYear(),
time.getMonth() + 1, /* in javascript the months start in 0 */
time.getDate()].join('-'));</pre>
<pre lang="javascript">var time = new Date(strtotime('+1 week',&lt;?php echo time()*1000;?&gt;));

alert(time.getDate());</pre>
<pre lang="javascript">var time = new Date(strtotime('Wed, 18 Oct 2005 13:00:00'));

alert(time.getFullYear());</pre>
<pre lang="javascript">var time = new Date(strtotime('2008-12-26 15:30'));

alert(time.getMonth());</pre>
<pre lang="javascript">var time = new Date(strtotime('+1 day'));

alert(time.getDate());</pre>
<pre lang="javascript">var time = new Date(strtotime('last month'));

alert(time.getMonth() + 1);</pre>
<pre lang="javascript">var time = new Date(strtotime('5 years ago'));

alert(time.getFullYear());</pre>
<pre lang="javascript">var time = new Date(strtotime('+1 week 2 days 4 hours 2 seconds'));

alert(time.getDate());</pre>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2008/javascript-equivalent-function-to-phps-strtotime/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kohana PHP: Mini How-To</title>
		<link>http://caioariede.com/2008/kohana-mini-how-to</link>
		<comments>http://caioariede.com/2008/kohana-mini-how-to#comments</comments>
		<pubDate>Sun, 31 Aug 2008 16:31:17 +0000</pubDate>
		<dc:creator>Caio Ariede</dc:creator>
				<category><![CDATA[Kohana]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://caioariede.com/?p=89</guid>
		<description><![CDATA[Neste tutorial, quero demonstrar a criação de uma aplicação usando o framework Kohana, que eu tenho utilizado muito no meu dia-a-dia, e acho que merece a atenção de todos que procuram um framework que facilite o desenvolvimento de aplicações php/web.
Algumas dúvidas relacionadas a este material podem ser retiradas através do documentação do próprio Kohana PHP, [...]]]></description>
			<content:encoded><![CDATA[<p>Neste tutorial, quero demonstrar a criação de uma aplicação usando o framework <a href="http://kohanaphp.com/" target="_blank">Kohana</a>, que eu tenho utilizado muito no meu dia-a-dia, e acho que merece a atenção de todos que procuram um framework que facilite o desenvolvimento de aplicações php/web.</p>
<p>Algumas dúvidas relacionadas a este material podem ser retiradas através do documentação do próprio Kohana PHP, em http://docs.kohanaphp.com/.</p>
<p>Começando *bem* do começo, <em>o começo do começo</em>..</p>
<ol>
<li>Faça o download do Kohana no site <a href="http://kohanaphp.com/" target="_blank">http://kohanaphp.com/</a></li>
<li>Renomeie a pasta <strong>Kohana_vX.X.X</strong> para <strong>agenda</strong>.</li>
<li>Deixe o diretório <strong>application/logs</strong> com permissão para escrita.</li>
<li>Edite o arquivo <strong>application/config.php</strong> e altere <em>site_domain</em> para o respectivo caminho onde se encontra o kohana, <em>/agenda/</em>, caso seja <em>http://localhost/agenda/</em>.</li>
</ol>
<p>E vamos lá..</p>
<p><span id="more-89"></span></p>
<p>Primeiro vamos &#8220;limpar&#8221; o kohana, removendo os exemplos, que nesse tutorial, não serão utilizados.</p>
<ol>
<li>Apague todos arquivos que estão dentro da pasta <strong>application/controllers</strong></li>
<li>Apague todos arquivos que estão dentro da pasta <strong>application/views</strong></li>
</ol>
<p>Crie um novo arquivo, <strong>application/controllers/agenda.php</strong>, que será um <em>controller</em>.</p>
<pre lang="php">&lt;?php defined('SYSPATH') or die('No direct script access.');

class Agenda_Controller extends Controller
{

    public function create()
    {
        /* Aqui iremos chamar a view, que esta localizada dentro
         * da pasta "views/", o .php pode ser omitido.
         */
        $view = new View('create');
        $view-&gt;render(true);
    }

}

?&gt;</pre>
<p>Crie agora, o arquivo <strong>application/views/create.php</strong>, que será a <em>view</em> chamada pelo método <em>create </em>dentro do controller <em>Agenda</em>.</p>
<pre lang="php">&lt;form action="&lt;?php echo url::site('agenda/create'); ?&gt;" method="post"&gt;
    &lt;label for="name"&gt;Nome:&lt;/label&gt;
        &lt;input id="name" name="name" type="text" /&gt;
    &lt;label for="phone"&gt;Telefone:&lt;/label&gt;
        &lt;input id="phone" name="phone" type="text" /&gt;
    &lt;input type="submit" value="Salvar" /&gt;
&lt;/form&gt;</pre>
<p>Repare, que na view <em>create.php</em>, usamos o método url::site(). O método <em>site</em>, faz parte do <strong>helper</strong> <em>url</em>, que contém um conjunto de métodos úteis que ajudaram no desenvolvimento de suas aplicações, o método <em>site</em> retorna o caminho <em>site_domain + controller/metodo</em>.</p>
<p>Aqui já podemos chamar a url <strong>http://localhost/agenda/index.php/agenda/create</strong></p>
<p>E através dessa url você já pode perceber que o formato das url&#8217;s é:</p>
<p><em>index.php/controller/método</em></p>
<p>Caso queira, você também pode usar subdiretórios dentro da pasta <em>applications/controllers</em>, por exemplo <em>agenda/escola/contatos.php</em>, onde <em>contatos.php</em> é um controller com nome <em>Contatos_Controller</em>, e pode ser acessado através da url <em>agenda/index.php/agenda/escola/contatos</em>. Enfim, isso não vem ao caso agora.</p>
<p>Voltando, vamos dar vida a nossa aplicação. Crie um banco de dados para a agenda:</p>
<pre lang="sql">CREATE DATABASE `agenda` ;

CREATE TABLE `agenda`.`contacts` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `phone` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8</pre>
<p>Agora, copie o arquivo <strong>system/config/database.php</strong> para <strong>application/config/database.php</strong>, na pasta <em>system/config</em> ficam todos arquivos de configuração padrão, como nós não vamos usar uma &#8220;base de dados padrão&#8221;, então copiamos o arquivo para a pasta da nossa aplicação.</p>
<p>Edite o arquivo <strong>application/config/database.php</strong>, configurando o acesso ao seu banco de dados:</p>
<p>&#8216;user&#8217;     =&gt; &#8216;usuário&#8217;,<br />
&#8216;pass&#8217;     =&gt; &#8217;senha_do_usuario&#8217;,<br />
&#8216;database&#8217; =&gt; &#8216;agenda&#8217;</p>
<p>E então vamos alterar o método <em>create</em> no nosso controller <em>agenda</em>, para que adicione nossos dados ao banco de dados.</p>
<pre lang="php">public function create()
{
    if (request::method() == 'post')
    {
        $name  = (string) @$_POST['name'];
        $phone = (string) @$_POST['phone'];

        // aqui inserimos os dados no banco
        $db = new Database;
        $db-&gt;insert('contacts', array('name' =&gt; $name, 'phone' =&gt; $phone));

        // redirecionamos para o metodo "contacts"
        url::redirect('agenda/contacts');
    }
    /* Aqui iremos chamar a view, que esta localizada dentro
     * da pasta "views/", o .php pode ser omitido.
     */
    $view = new View('create');
    $view-&gt;render(true);
}</pre>
<p>Você já pode testar o formulário, porém ele dará erro, pois ainda não criamos o método contacts, que será criado agora:</p>
<pre lang="php">public function contacts()
{
    /* Primeiro vamos retornar a lista de contatos do banco de dados
     * e guarda-la na variável $result
     */
    $db = new Database;
    $result = $db-&gt;get('contacts');
    /* Aqui iremos chamar a view (views/contacts.php),
     * passando a variável de nome "result".
     */
    $view = new View('contacts', array('result' =&gt; $result));
    $view-&gt;render(true);
}</pre>
<p>E a view contacts.php ficará assim:</p>
<pre lang="php">&lt;table border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Nome&lt;/th&gt;
&lt;th&gt;Telefone&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;?php foreach ($result as $r): ?&gt;
&lt;tr&gt;
&lt;td&gt;&lt;?php echo $r-&gt;id; ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $r-&gt;name; ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $r-&gt;phone; ?&gt;&lt;/td&gt;
&lt;td&gt;
    &lt;?php
        echo html::anchor('agenda/edit/' . $r-&gt;id, 'Editar');
    ?&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;?php endforeach; ?&gt;
&lt;/tbody&gt;&lt;/table&gt;</pre>
<p>Observe que foi utilizado mais um <em>helper</em>, html::anchor(), que basicamente cria um link &lt;a href=&#8221;"&gt;&#8230;&lt;/a&gt;.</p>
<p>Bom, agora que já temos o método <em>create</em>, o <em>contacts (list)</em> falta o <em>edit</em>, certo?</p>
<pre lang="php">public function edit($id = null)
{
    $db = new Database;
    $id = (int) $id;
    $result = $db-&gt;limit(1)-&gt;getwhere('contacts', array('id' =&gt; $id));
    if (count($result) == 0)
    {
        /* Caso não exista um contato com este id
         * retorna uma página "not found" do kohana
         */
        Event::run('system.404');
    }
    /* Se chegou até aqui, é porque achou o registro
     */
    $row = $result[0];
    /* Conferimos se é um método http post,
     * se for, salvamos o registro
     */
    if (request::method() == 'post')
    {
        $name  = (string) @$_POST['name'];
        $phone = (string) @$_POST['phone'];

        // aqui inserimos os dados no banco
        $db = new Database;
        $db-&gt;update('contacts',
                    array('name' =&gt; $name, 'phone' =&gt; $phone),
                    array('id' =&gt; $row-&gt;id));

        // redirecionamos para o metodo "contacts"
        url::redirect('agenda/contacts');
    }
    /* E então, chamamos a view responsável..
     */
    $view = new View('edit', array('row' =&gt; $row));
    $view-&gt;render(true);
}</pre>
<p>E então a view edit.php</p>
<pre lang="php">&lt;form action="&lt;?php echo url::site('agenda/edit/' . $row-&gt;id); ?&gt;"
      method="post"&gt;

&lt;label for="name"&gt;Nome:&lt;/label&gt;
&lt;input id="name"
       name="name"
       type="text"
       value="&lt;?php echo $row-&gt;name; ?&gt;" /&gt;

&lt;label for="phone"&gt;Telefone:&lt;/label&gt;
&lt;input id="phone"
       name="phone"
       type="text"
       value="&lt;?php echo $row-&gt;phone; ?&gt;" /&gt;

&lt;input type="submit" value="Salvar" /&gt;

&lt;/form&gt;</pre>
<p>Deixe o seu comentário. ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://caioariede.com/2008/kohana-mini-how-to/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>
