Diário Code - Uma xícara de café e um bule em cima de uma mesa.

Diário Code

Aprenda JavaScript e PHP

Como funcionam as Namespaces em PHP

Ao fundo, um código em PHP e na frente há a palavra name e space na cor branca.

Na hierarquia da Programação Orientada a Objetos (POO), o Namespace é a estrutura de maior nível hierárquico dentre todas as outras. Ela encapsula todas as outras entidades. Neste artigo, você vai aprender a usar essa entidade tão importante na programação.

Mas, qual a vantagem de usar uma namespace? A principal vantagem é a organização do código. O código fica mais intuitivo se você tiver uma palavra que possa se lembrar quando quiser acessar um conjunto de funções do seu projeto. Além disso, os nomes de funções e classes ficarão atrelados à namespace que eles pertencem. Assim, você poderá repeti-los em outras partes do código.

Já que essa há essa grande vantagem ao usar namespaces, vamos ver agora como declarar essas estruturas.

Para entender melhor esse assunto, o vídeo abaixo vai resumir uma parte deste conteúdo e mostrar na prática como usar Namespaces em PHP. Em seguida, volte e termine a leitura deste artigo para compreender os detalhes.

Para declarar namespaces, você deve usar a palavra-chave namespace seguida do nome da sua namespace. Esse nome segue as mesmas regras para se declarar variáveis e outras estruturas do PHP. Observe o código abaixo:

namespace minha_namespace {
 
function get_var_a ( ) {
  return $variavel_a = 80 ;
 }
 // outras classes, funções e variáveis
}

Aqui, nós temos a namespace minha_namespace declarada corretamente com a palavra-chave e o nome que a indentifica. Assim como acontece com funções e classes, basta inserir o conteúdo da sua namespace entre as chaves.

Vou citar aqui outras regras importantes ao usar namespaces em PHP.

Regra 1. Declarar a namespace deve ser a primeira linha de código do seu script. Com exceção de comentários, não pode haver nada antes da declaração de uma namespace. Veja o exemplo abaixo:

// inicio do arquivo
$variavel_a = 80 ;

namespace minha_namespace {

 function get_var_b ( ) {
  return $variavel_b = $variavel_a + 40 ;
 }

}
// fim do arquivo

No código acima, ocorrerá um erro porque variavel_a foi declarada antes da namespace. O correto é assim:

// inicio do arquivo
namespace minha_namespace {

 function get_var_b ( ) {
  $variavel_a = 80 ;
  return $variavel_b = $variavel_a + 40 ;
 }

} // fim do arquivo

Agora, o código está correto, porque não há nada acima da declaração da namespace a não ser um comentário, que não surte efeitos no código.

Regra 2. Como o PHP trabalha com vários scripts, é permitido apenas 1 namespace por script. Sendo assim, observe o código abaixo:

Arquivo_1.php:

namespace minha_namespace {

 function get_var_a ( ) {
  return $variavel_a = 80 ;
 }
 // outras classes, funções e variáveis
}

namespace minha_segunda_namespace {

 function get_var_b ( ) {
  return $variavel_b = 40 ;
 }
 // outras classes, funções e variáveis
}

Esse script resultará em erro e o seu código não funcionará. É necessário separar as namespaces em vários arquivos da seguinte forma:

Arquivo_1.php:

namespace minha_namespace {
 
 function get_var_a ( ) {
  return $variavel_a = 80 ;
 }
 // outras classes, funções e variáveis
} // fim do Arquivo 1

Arquivo_2.php:

namespace minha_segunda_namespace {
 
 function get_var_b ( ) {
  return $variavel_b = 40 ;
 }
 // outras classes, funções e variáveis
} // fim do Arquivo 2

Esse código não resultará em erros porque as namespaces foram declaradas em arquivos diferentes.

Regra 3. Se você declarar uma namespace num arquivo, não é permitido declarar nada fora do escopo da namespace. Veja o código abaixo:

Arquivo_1.php:

namespace minha_namespace {
 
 function get_var_a ( ) {
  return $variavel_a = 80 ;
 }
 // outras classes, funções e variáveis
}

$variavel_b = 40 ;

O código acima causará um erro, porque $variavel_b foi declarada fora do escopo de minha_namespace. O correto é encerrar o arquivo na chave de fechamento da namespace.

Regra 4: É permitido aninhar várias namespaces, ou seja, colocar uma dentro da outra. Para fazer isso, basta separar as namespaces com uma barra da seguinte forma:

namespace namespace_1\namespace_2\namespace_3 {
 
 function get_var_b ( ) {
  return $variavel_b = 40 ;
 }
 // outras classes, funções e variáveis
}

No código acima, estamos declarando o conteúdo de namespace_3, que está dentro de namespace_2 e que está dentro de namespace_1. Note que não há necessidade de declarar as namespaces uma dentro da outra. Basta digitar a hierarquia desejada como mostrado.

Outras maneiras de usar namespace

E se caso você desejar dividir 1 namespace em vários arquivos? Nessa situação, basta repetir a declaração da namespace em cada um dos arquivos. Veja o exemplo abaixo:

Arquivo 1.php:

namespace minha_namespace {

 function get_var_a ( ) {
  return $variavel_a = 80 ;
 }

}

Arquivo 2.php:

namespace minha_namespace {

 function get_var_b ( ) {
  return $variavel_b = 40 ;
 }

}

No exemplo acima, a minha_namespace começou a ser declarada em Arquivo 1.php e seu conteúdo continuou em Arquivo 2.php. Dessa forma, tanto $variavel_a quanto $variavel_b ficarão acessíveis através da mesma namespace e não haverá erros.

Isso significa que, quando o PHP vê que foram declaradas a mesma namespace em 2 arquivos diferentes, ele conjuga todas as declarações dos 2 arquivos dentro de uma única namespace.

Outra coisa para você saber é que não é necessário usar chaves { } para declarar uma namespace. Você também pode fazer isso usando ponto-e-vírgula ;da seguinte forma:

namespace minha_namespace ;

 function get_var_a ( ) {
  return $variavel_a = 80 ;
 }

// fim do arquivo

No exemplo, minha_namespace foi declarada corretamente. Todo o conteúdo abaixo dessa linha será considerado como dentro da namespace.

E para acessar o conteúdo de uma namespace? Só é possível acessar classes, funções e enumeradores dentro de uma namespace, e essas estruturas te darão acesso às respectivas propriedades. No caso, basta fazer como mostra o código abaixo:

Arquivo_1.php:

namespace minha_namespace ;

 function get_var_a ( ) {
  return $variavel_a = 80 ;
 }
// fim do Arquivo 1

Arquivo_2.php:

namespace segunda_namespace ;

 function get_var_b ( ) {
  return $variavel_b = 40 ;
 }
// fim do Arquivo 2

Arquivo_3.php:

echo minha_namespace->get_var_a ( ) ;
echo segunda_namespace->get_var_b ( ) ;

Como você pode observar, o Arquivo_1.php possui a namespace minha_namespace. Nessa namespace há a função get_var_a ( ) que retorna a variavel_a que tem o valor 80. o Arquivo_2.php possui uma estrutura semelhante.

Já em Arquivo_3.php, foram invocadas as funções dentro das namespaces dos arquivos 1 e 2. Para fazer isso, usou-se o sinal -> que invoca um método dentro de uma entidade.

Conclusão

Acredito que isso seja tudo que você precisará saber sobre namespaces para começar a usá-las. Se este é o seu primeiro contato com a Programação Orientada a Objetos, com certeza será mais desafiador entender este artigo. Em breve, haverá novos artigos que explicarão cada uma das estruturas mencionadas aqui.

Aprenda mais com outros artigos relacionados