Link: https://adrianosites.com.br/conteudo/o-que-vem-a-ser-namespace-no-php-
Trata-se de uma forma de organizar o código das classes e métodos, para evitar colisão destas classes devido a terem o mesmo nome.
Imagine a seguinte situação:
Temos uma classe chamada Login com seus métodos e tudo mais, para instanciar
basta chamar: $login = new Login(); certo? Mas imagine que por qualquer razão tem
uma biblioteca que baixou de terceiros que contém uma classe com o mesmo nome
Login.
Neste caso vamos imaginar que temos em nosso projeto, 2 pastas: 1 chamada “classes_minhas” e outras “classes_baixadas”, neste caso para saber qual classe eu estou usando, logicamente que eu faria os devidos require:
Antes de chamar a classe passaria “require_once (‘classes_minhas/Login.php’)” por exemplo, e neste caso meu sistema saberia que se trata da minha classe e não de terceiros.
Mas como hoje, não trabalhamos mas com estes sistema de require nas classes, usamos sistemas de autoload e principalmente Composer (que é um gerenciador de dependências do PHP), ai teríamos som problemas. Mesmo que eu mapear as pastas destas classes com o ClassMap no composer.json:
"autoload": {
"classmap": ["classes_minhas/", "classes_baixadas/"]
}
Eu teria este carregamento automatizado, mas como meu projeto, e o próprio PHP, saberiam qual é a classe que estou usando? A minha ou a baixada?
Neste ponto vamos imaginar que eu tenho a estrutura no meu projeto:
Como o mapeamento do Composer vai pegar a classe tanto da pasta minha como a baixada, na hora de executar ele iria tomar como base a primeira encontrada, o que talvez não seria o correto para o momento, pensa que é impossível disso acontecer?
Imagine quando se tem um projeto com muitas classes e muitas
bibliotecas de terceiros
Para resolver este problema, podemos usar o sistema de organização por
namespace, que já existe a muito tempo, desde o PHP 5.3 se não me engano.
O namespace organiza o acesso a estas pastas tomando como base o diretório onde elas estão, fica mais simples saber qual é na verdade a classe que estamos chamando
Para isso basta setar um nome para o namespace no começo do arquivo da sua classe:
Esta é a classe Login na pasta “classes_minhas”
Esta é a classe de Login na pasta “classes_baixadas”
Desta maneira, tomando como base a PSR 4, criamos 2 nomes de espaço , namespace, de
forma a organizar as nossas classes:
Namespace “Minhas” faz referência a
pasta “classes_minhas”
Namespace “Baixadas” a pasta “classes_baixadas”
Bastaria agora mapear estas pastas e seus namespaces com ajuda no Composer.
Criamos então a estrutura PSR 4 no composer.json:
Após isso, executando no composer o comando “composer update ” e pronto, já temos o mapeamento, no exemplo já tenho a índex.php pegando o autoload do composer:
Já posso usar agora a classe que eu bem entender.
Para isso temos 2 formas, verifique a de sua preferência:
Forma 1: passando o namespace completo + nome da
classe
Forma 2: criando a chamada “use” para adicionar a classe:
Como estou usando o Composer, e ele faz o mapeamento dos namespace, nas 2 formas não preciso chamar diretamente os arquivos com require_once “classes_minhas/login.php”
Pois o Composer já faz o mapeamento e encontra os arquivos solicitados no projeto. Como podemos ver no arquivo chamado “autoload_psr4.php” que fica dentro da pasta do composer, em nosso projeto: este arquivo mostrado abaixo é de uso do composer e é ele quem monta e edita, não precisamos alterar nada neste arquivo, mostrado aqui apenas a nivel didático
Lembrando que o namespace, usando a PSR4 não precisa ter o mesmo nome e estrutura das pastas onde se encontra a classe, o que importa é o nome deste namespace “\\Minhas” e onde ele aponta, que no caso aqui é a pasta “classes_minhas” como podemos ver no mapeamento que o composer fez acima;
Espero que tenha ficado claro! Abraço e até a próxima.