característica linguagem - Como funciona namespaces no PHP? - Stack Overflow em Português
Os namespaces foram implementados a partir da versão PHP 5.3.0, como uma forma de "encapsular itens".
Na verdade nunca entendi o real conceito dele, e sempre me confundo com autoload de classes.
Alguém poderia me explicar, de forma simples, como funciona namespaces, por que eles são utilizados e se eles possuem algo com autoload de classes?
namespace App\Http\Controllers; // usando namespace
use App\User;  // usando autoload
editada 24/11/16 às 1:38
Uma das respostas nessa minha pergunta fala sobre ele e tem alguns exemplos inclusive: pt.stackoverflow.com/a/101738/20555, mas ainda não vi muito a fundo e sua pergunta irá me ajudar também. +1
17/12/15 às 12:31
Organizar código, evitar conflito de nome de funções... evitar risco de colisão. É usado para evitar definições conflitantes e introduzir uma maior flexibilidade e organização em sua base de código. Para usar, o programador precisa ser muito organizado, pois nada adianta usar o recurso sem ter o conhecimento sólido em OOP.
17/12/15 às 12:35
Os namespaces são úteis principalmente para evitar colisão de nomes.
Foram implementados no PHP 5.3.
É muito comum ver bibliotecas mais antigos do PHP utilizando um padrão que consiste em utilizar underline no nome de classes, para evitar conflitos.
Isso era necessário pois, como foram surgindo muitas bibliotecas, os nomes começaram a ficar "limitados" por conta de poder haver colisões de nomes em comum.
Um grande exemplo é criar uma classe chamada Client. Pelo menos quase todas bibliotecas que instalei em um projeto têm esse nome. É aí que entra os namespaces.
Podemos ver um exemplo em como se resolvia esse problema antigamente.
Exemplo em versões antigas:
Zend_Server_Client
Versões novas:
Zend\Server\Client
Em versões do PHP 5.6 eles se tornam ainda mais útil, já que com a nova funcionalidade do use function, tornou-se mais fácil ter também um repositório de funções.
class WallaceMaxters\Helpers;
function print_r($valor)
\print_r($valor);
Essa função que criei chamada print_r não terá colisão com print_r por conta do namespace. Porém para usá-la em versões anteriores ao php 5.6, você teria que fazer algo como:
WallaceMaxters\Helpers\print_r($_POST);
use WallaceMaxters\Helpers as h;
h\print_r($_POST);
Porém no PHP 5.6, assim como as classes, é possível criar um alias local para aquela função.
use function WallaceMaxters\Helpers\print_r as pr
pr($_POST);
O autoload de classes é uma funcionalidade adicionada para que as classes sejam carregadas (include e require) automaticamente assim que instanciadas.
Assim, ao invés de você ter que incluir toda vez uma classe que vai instanciar, você simplesmente defina uma regra global para o carregamento da classe.
Um exemplo disso é o PSR4, ao qual eu amo profundamente.
Padrão que é amplamente utilizado nas bibliotecas que podem ser instaladas pelo Composer;
O padrão que a maioria dos repositórios utilizam para as suas bibliotecas, quanto ao uso do namespace é :
NomeDoFornecedor\NomeDaBiblioteca\NomeDaClasse
namesace Laravel\Database;
class Eloquent {}
editada 9/01/17 às 16:25
me ajuda nessa aí, Brother. Tenho que voltar do almoço kkkkkkkkk
17/12/15 às 15:28
Bibliotecas antigas não usavam PSR-0. Ele já nasceu quando já existia namespaces. Utilizar o _ eram utilizados bem antes da PSR-0 e ele só suportava esse tipo de classes para manter compatibilidade com códigos muito antigos.
18/12/15 às 1:41
Obrigado pela informação @gmsantos. Eu não sou da época anterior ao php 5. Isso é o que presuponho quando vejo classes antigas
18/12/15 às 10:28
Vale uma edição em sua resposta, para evitar que informações erradas sejam passadas adiante.
18/12/15 às 11:10
Value @gmsantos. Cê tava sumido, cara
18/12/15 às 11:18
Namespaces são utilizados para agrupar itens(classes, constantes ou funções no php) geralmente isso é determinado pela afinidade entre eles. Assim como uma classe agrupa propriedades e métodos para resolver um problema(responsabilidade única) com o namescape acontece o mesmo porém em um escopo maior, em outras palavras ele define quais são as 'funcionalidades' daquele modulo.
O namespace do php não é tão pratico quanto os packges do java, uma vantagem seria carregar por exemplo o módulo inteiro de i18n que prove classes para formatação de datas, valores de moeda etc ou o módulo de persistência que fornece várias classes para leitura e escrita de informações em diferentes tipos de tecnologia como banco de dados relacionais, NOSQL, LDAP etc.
No PHP7 existe uma forma levemente melhorada de carregar um grupo de classe
use app\persistencia\{DBRelaciona, DBNoSQL, LDAP};
Manual - namespaces v7
editada 17/12/15 às 13:07
Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag php característica-linguagem namespace php-autoload ou faça sua própria pergunta.