fev 11
13
Namespaces: Aprendendo a usar contextos
Namespace é um conceito trazido na versão 5.3.0 do PHP. Sua funcionalidade é a de proporcionar um contexto para definições de constantes, funções e classes, não suportando variáveis, chamadas de funções ou qualquer outro tipo de código. Ao migrar para o PHP 5.3 você não será forçado a utilizar os namespaces, tampouco adaptar um código que você pretente reutilizar. Nestes casos, você estará sempre trabalhando num contexto/escopo global. Um breve exemplo:
/* Arquivo Namespace.php */ namespace MeuProjeto; const version = '1.0'; public function MinhaFuncao() { /* ... seu código aqui ... */ }
E você utilizará da seguinte forma na prática:
/* Arquivo teste.php */require 'Namespace.php';
echo "Isso é um teste: " .version;
echo "Isso é outro teste: " .MeuProjeto\version;
$Variavel = \MeuProjeto\version;
Ao executar o arquivo teste.php você notará que para o echo da linha 3 será impresso “Isso é um teste: version” ao passo que o echo da linha 4 imprimirá “Isso é outro teste: 1.0″. Também será lançado um E_NOTICE devido ao fato da constante version não existir no contexto em que foi invocada. A linha 4 corrige este problema, invocando a variável version do seu contexto próprio.
A princípio não parece grande coisa, mas traz a possibilidade de um código mais organizado, dentre diversas outras possibilidades, incluindo sobrecarregar funções da linguagem.
Exemplo de como sobrecarregar uma função do sistema:
/* Arquivo namespace.php */ namespace \MeuProjeto; function &fopen() { /* aqui vai código personalizado... */ $args = func_get_args(); $args[0] = realpath($args[0]) .DIRECTORY_SEPARATOR .basename($args[0]); if ( is_file( $args[0] ) && is_readable( $args[0] ) ) { $Resource = call_user_func_array('\\fopen', $args); } else { $Resource = false; } return $Resource; }
Em outro arquivo, você pode utilizar a função sobrecarregada da seguinte forma:
/* Arquivo teste.php */ @ include 'namespace.php'; use \MeuProjeto; $fp1 = fopen('meu_log.xml', 'a+'); $fp2 = \fopen('meu_log.xml', 'a+');
Claro que se o arquivo namespace.php não existir o interpretador irá chamar a função fopen da linguagem. Neste exemplo, se o arquivo ‘meu_log.xml’ não existir, $fp1 receberá false porque mesmo explicitando ao fopen que ele deve criar um arquivo caso ele não exista (+), a função que defini retorna false caso não exista um arquivo no caminho indicado. Já $fp2 receberá um resource apontando para o arquivo “meu_log.xml” que foi criado devido a especificação no segundo argumento dado ao \fopen(). A variável $fp2 funciona corretamente porque chama a função built-in do php no escopo global e não utilizará a função personalizada definida no escopo \MeuProjeto.
Hoje eu termino sobre Namespaces por aqui, se aparecer alguma novidade sobre o assunto eu faço um novo post. Se alguém tiver uma correção pra fazer, deixe um comentário.
Mais sobre Namespaces:
http://www.php.net/manual/pt_BR/language.namespaces.php