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:

  1. /* Arquivo teste.php */
  2.    require 'Namespace.php';
  3.    echo "Isso é um teste: " .version;
  4.    echo "Isso é outro teste: " .MeuProjeto\version;
  5.    $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

Tags: , ,

Leave a Comment

Usuários do Twitter
Clique no botão abaixo para efetuar o login usando sua conta do Twitter.

Performance Optimization WordPress Plugins by W3 EDGE