Namespaces no PHP 5.3


Olá, pessoal!

Hoje estou aqui para tratar de um assunto relativamente novo: Namespaces no PHP.

Eu digo relativamente novo pois eu ainda não tinha trabalhado com ele, mas na verdade o recurso foi lançado oficialmente no PHP 5.3.0, em 30 de junho de 2009. Uau, há mais de dois anos!

Infelizmente uma boa parte dos serviços de hospedagem por aí ainda não suporta oficialmente esta versão. O que é uma pena, pois acabamos ficando presos a versões antigas e sem poder usar novos recursos, como o sistema de Namespace.

[caption id="attachment_1114" align="aligncenter" width="240" caption="Namespaces no PHP"]Namespaces do PHP[/caption]

Bem, antes de entrarmos na implementação de namespaces no PHP, acho interessante explicar primeiro o conceito de Namespace.

Apenas traduzindo o termo já temos uma ideia do que ele faz, ele é um "espaço de nomes". Mas como assim um espaço de nomes?

Uma das estruturas mais simples que temos no PHP são as funções. Cada função tem o seu próprio espaço de nomes, ou escopo, isso já é assim desde que eu conheço o PHP. O que quero dizer com cada função tem seu espaço de nomes é que você pode ter duas variáveis $nome em duas funções diferentes e, mesmo tendo o mesmo nome, elas não são a mesma variável. Isso acontece pois cada uma está em um bloco lógico diferente. Veja um exemplo:



function funcao1() {
$nome = "Jimi";
}

function funcao2() {
$nome = "Hendrix";
}


Legal, isso funciona para variáveis com o mesmo nome. Mas e se eu preciso ter funções com o mesmo nome? Bem, isso também é possível usando classes e métodos estáticos. Mas neste caso, estou usando métodos de uma classe, e não exatamente funções independentes. Veja este exemplo:



// Definindo as classes

class classe1 {
public static function exibeNome($nome) {
print("classe1: ".$nome);
}
}

class classe2 {
public static function exibeNome($nome) {
print("classe2: ".$nome);
}
}

// Usando os métodos estáticos

classe1::exibeNome('Jimi');

classe2::exibeNome('Hendrix');


Mas o que acontece quando eu preciso de funções soltas? Sou obrigado a usar uma estrutura de classes classes? Ou quem sabe dar nomes maiores para as funções? Nomes como minhalib1_funcao() e minhalib2_funcao()? Não prático, né? É aí que entram a o sistema de Namespaces do PHP.

Acho melhor mostrar o código do que explicar muito. Vamos lá, vou criar um arquivo 'names.php' com dois namespaces e um arquivo 'programa.php' que usa as funções nos namespaces.

Arquivo 'names.php':



namespace form_tabela {
// Este namespace exibe um form usando tabelas
function imprime_form($form) {
// Imprimindo o form em tabela
echo "tabela...";
}
}

namespace form_tableless {
// Este namespace imprime um form sem usar uma tabela
function imprime_form($form) {
// Imprimindo o form sem tabela
echo "tableless!";
}
}


Arquivo 'programa.php':



include('names.php');

// Usando as funções
form_tabela\imprime_form('form1');

form_tableless\imprime_form('form2');


Percebam que os dois namespaces têm funções com o mesmo nome "imprime_form()", mas não problema em definir uma função que já existe. Aliás, eu poderia até mesmo criar funções com nomes que já existem na biblioteca padrão do PHP:


namespace minhaLib {
// strtr já existe na biblioteca padrão do PHP
function strtr($str) {
echo TRUE;
}
}


O uso de namespaces pode simplificar bastante o desenvolvimento de sistemas mais complexos e também de bibliotecas para distribuir. Ao utilizar o sistema de namespaces você também evita problemas de colisão de nomes com outras bibliotecas, sem ter que dar nomes grandes para suas funções.

Então essa foi a dica de hoje. Use os namespaces e organize melhor seus projetos.

E para quem quer aprender a utilizar um framework para desenvolver sistemas, eu recomendo o curso "Turbine-se com CodeIgniter". Este é um curso que eu leciono, online, você pode fazer no conforto da sua casa, usando o seu computador para acessar a sala de aula virtual. Acesso o site do curso, conheça o conteúdo e se inscreva.



Let's code!

InFog

Evaldo Junior

Desenvolvedor web, palestrante, escritor e usuário e contribuidor do Software Livre.

comments powered by Disqus