O que são namespaces?

241

O que são namespaces PHP?

O que são namespaces em geral?

Uma resposta leiga com um exemplo seria ótima.

Imran
fonte

Respostas:

573

O namespacing faz para funções e classes o escopo para variáveis. Ele permite que você use a mesma função ou nome da classe em diferentes partes do mesmo programa sem causar colisão de nome.

Em termos simples, pense em um espaço para nome como o sobrenome de uma pessoa . Se houver duas pessoas nomeadas "John", você pode usar o sobrenome delas para diferenciá-las.

O cenário

Suponha que você escreva um aplicativo que use uma função denominada output(). Sua output()função pega todo o código HTML da sua página e o envia ao usuário.

Mais tarde, seu aplicativo fica maior e você deseja adicionar novos recursos. Você adiciona uma biblioteca que permite gerar feeds RSS. Essa biblioteca também usa uma função denominada output()para gerar o feed final.

Quando você liga output(), como o PHP sabe se deve usar sua output()função ou a função da biblioteca RSS output()? Não faz. A menos que você esteja usando espaços para nome.

Exemplo

Como resolvemos ter duas output()funções? Simples. Colamos cada output()função em seu próprio espaço para nome .

Isso seria algo como isto:

namespace MyProject;

function output() {
    # Output HTML page
    echo 'HTML!';
}

namespace RSSLibrary;

function output(){
    # Output RSS feed
    echo 'RSS!';
}

Mais tarde, quando queremos usar as diferentes funções, usamos:

\MyProject\output();
\RSSLibrary\output();

Ou podemos declarar que estamos em um dos espaços para nome e, em seguida, podemos simplesmente chamar esse espaço para nome output():

namespace MyProject;

output(); # Output HTML page
\RSSLibrary\output();

Não há namespaces?

Se não tivéssemos espaços para nome, teríamos que (potencialmente) alterar muito código sempre que adicionarmos uma biblioteca ou criar prefixos tediosos para tornar nossos nomes de função exclusivos. Com namespaces, podemos evitar a dor de cabeça de colisões de nomes ao misturar código de terceiros com nossos próprios projetos.

cbednarski
fonte
Por alguma razão, pensei que se você usasse namespaces no arquivo1, não precisaria exigir ou incluir o arquivo no arquivo2. Os testes de unidade mostraram que esse não é o caso.
Aaron Sino
1
@AaronBell Convém verificar o carregamento automático .
Cbednarski 13/04/19
21

Um espaço para nome permite que você coloque um monte de código sob um nome e não tenha nenhum conflito de nomeação com classes, funções e constantes.

Ele permite que seu código viva nesse espaço de nome.

O PHP usa o caráter um tanto controverso \ para mostrar os níveis de namespace. As pessoas se levantaram nas armas porque também é usado como um personagem de fuga.

Para usar o espaço para nome no PHP, use algo como isso na parte superior do seu arquivo.

namespace my\namespace;

Você pode encontrar muito mais informações na documentação oficial do PHP para namespaces .

alex
fonte
11

Como é mais fácil aprender sobre a palavra-chave “use” sabendo sobre “namespace”, deixe-me explicar primeiro o namespace, examinando um projeto básico do Laravel.

Há uma classe de controlador com o nome: Controller.php, que está no caminho: app / Http / Controllers do diretório raiz do projeto. Há também outra classe de controlador chamada: Controller.php , mas esta está no caminho: vendor / laravel / framework / src / Illuminate / Routing a partir do diretório raiz do projeto

Você não precisa olhar o código-fonte ainda, se você é novo no php, porque ele pode confundi-lo. Em vez disso, deixe-me explicar a parte dele com a qual nos preocupamos e nos ajudará a entender “namespace” e “use ”.

De fato, nossa primeira classe de controladores: app / Http / Controllers / Controller.php precisa usar o fornecedor da segunda classe de controladores / laravel / framework / src / Illuminate / Routing / Controller.php . ele realmente precisa estender essa classe para ter acesso ao seu conteúdo para lidar com algumas funcionalidades cruciais de roteamento.

Então, como uma classe pode estender outra classe que tem o mesmo nome? class Controller extends Controller? isso NÃO funcionará, a menos que haja uma maneira de distinguir essas duas classes e é aí que namespaceé útil e a usepalavra - chave ajuda a concluir a missão de, permitindo o uso de; (classes; métodos; interfaces e constantes), com o mesmo nome, no mesmo escopo.

agora como é feito no código? muito simples! se olharmos para ocódigo-fonte app / Http / Controllers / Controller.php , podemos ver na parte superior do namespace da classe que é declarado como:,namespace App\Http\Controllersentão é assim que você atribui à sua classe um namespace para que possa ser referenciado por outras classes agora isso parece o mesmo que o caminho para essa classe no diretório raiz do projeto, com pouca diferença e esse é o uso de “\” em vez de “/ (o mesmo que o prompt de comando do Windows) , mas há outra diferença e esse é o aplicativo com capital 'A' no espaço para nome versus 'app' com 'a' minúsculo no caminho. Observe também que o espaço para nome diferencia maiúsculas de minúsculas.

Portanto, espaço para nome é um conceito separado do caminho, ele pode seguir a estrutura do caminho, se ajudar, mas não precisa ser o caminho exato para a classe, método, interfaces ou constantes, por exemplo, dê uma olhada em: vendor / laravel / framework código-fonte /src/Illuminate/Routing/Controller.php ,

vemos na parte superior da classe que o espaço para nome é declarado como: Illuminate\Routing

agora vamos dar uma olhada na usepalavra-chave “ ”, usamos, a usepalavra-chave “ ” para tornar nossa classe ciente de uma classe ou função específica que queremos usar em nossa classe

portanto, não estamos importando ou incluindo nada , apenas informando à nossa classe que usaremos uma classe ou método específico, referenciando-os por seu espaço de nome, vamos dar uma olhada no código-fonte app / Http / Controllers / Controller.php , como você pode ver na linha: “ use Illuminate\Routing\Controller as BaseController”, a usepalavra-chave “ ” seguida do espaço para nome da classe de destino (observe que Illuminate \ Routing \ Controller.php e Illuminate \ Routing \ Controller 'sem extensão .php' são intercambiáveis)

podemos usar a aspalavra-chave “ ” juntamente com a usepalavra-chave “ ” para fornecer a uma classe, método, interfaces ou constantes específicas um alias que permita ao app / Http / Controllers / Controller.php estender Illuminate \ Routing \ Controller.php como BaseController no linha: " class Controller extends BaseController".

Bahman.A
fonte
9

Existem técnicas como namespaces em outras linguagens de programação (como pacotes em Java). Eles são usados ​​para poder ter várias classes com o mesmo nome em um projeto.

Na documentação do php ( http://www.php.net/manual/en/language.namespaces.rationale.php ):

O que são namespaces? Na definição mais ampla, os namespaces são uma maneira de encapsular itens. Isso pode ser visto como um conceito abstrato em muitos lugares. Por exemplo, em qualquer diretório do sistema operacional, os arquivos servem para agrupar arquivos relacionados e atuam como um espaço para nome dos arquivos contidos neles. Como um exemplo concreto, o arquivo foo.txt pode existir no diretório / home / greg e em / home / other, mas duas cópias do foo.txt não podem coexistir no mesmo diretório. Além disso, para acessar o arquivo foo.txt fora do diretório / home / greg, devemos anexar o nome do diretório ao nome do arquivo usando o separador de diretório para obter /home/greg/foo.txt. Esse mesmo princípio se estende aos namespaces no mundo da programação.

2ndkauboy
fonte
1
Comparando com Java é uma má idéia. Java possui pacotes e existem classes de visibilidade de pacotes. A visibilidade dos membros protegidos também dependendo do pacote que o acessa.
Artefacto
1
Eles não são iguais aos pacotes, mas compartilham a mesma idéia.
2ndkauboy
Como a pergunta também pergunta quais são os namespaces em geral, a resposta faz sentido.
Kievlaluno
@kiam Eles compartilham uma idéia - nomes de classes sem conflito. Eles não compartilham a ideia de visibilidade.
Artefacto
@Artefacto: Kau-Boy não disse que os espaços para nome nos dois idiomas eram os mesmos.
Kievlaluno
4

Assim como diretórios e arquivos , o namespace no PHP serve para agrupar classes , funções , interfaces e constantes .

Exemplo:

Filesystem      |   PHP Namespace
----------------|------------------
/Dir/File.txt   |  \Namespace\Class

Ele fornece uma maneira de agrupar itens do espaço global e permite o uso de nomes simples de itens sem causar colisão de nomes em um programa. É suportado no PHP 5.3.0, PHP 7.

Mas existem alguns limites na analogia entre o espaço para nome PHP e o sistema de arquivos baseado em Unix:

                          | Filesystem            |        PHP Namespace
--------------------------|-----------------------|-------------------------
Cas sensitive             |       No              |        Yes                
--------------------------|-----------------------|-------------------------
Name with plain number    |       Yes             |        No
--------------------------|-----------------------|-------------------------
Path level                |       Yes             |        Yes   
--------------------------|-----------------------|-------------------------
Plain metacharacters name |       Yes             |        No        

O princípio se estende ao espaço para nome na palavra de programação.


fonte
3

Um espaço para nome funciona como um diretório. Você sabe como colocar arquivos em um diretório com os mesmos nomes dos arquivos no diretório pai (ou qualquer outro)? Bem, um espaço para nome permite fazer isso em um aplicativo para variáveis, funções e classes.

Há alguma tendência no PHP há pouco tempo para grandes classes de funções estáticas. A única maneira de chamar qualquer uma dessas funções era prefixando uma chamada com o nome da classe. Essa foi uma tentativa primitiva de namespaces, mas com pouco dos benefícios.

staticsan
fonte
2

Um espaço para nome basicamente permite inserir código em um contêiner. Isso evitará problemas com duas funções (além de classes e variáveis) que compartilham o mesmo nome.

Isso é útil ao trabalhar com aplicativos maiores para evitar problemas com partes de código que compartilham o mesmo nome.

Por exemplo, digamos que queríamos duas funções chamadas "TheMessage". Ambos imprimiriam (eco) mensagens diferentes cada. Normalmente, isso causaria um erro de sintaxe, pois você não pode ter duas funções que compartilham o mesmo nome.

Para corrigir isso, você pode colocar essas funções em espaços para nome separados. Isso permitiria usar as duas funções sem erros.

Alexander
fonte
2

O espaço para nome é como empacotar muitas coisas em um único pacote. Imagine um espaço para nome como uma gaveta na qual você pode colocar todo tipo de coisa: um lápis, uma régua, um pedaço de papel e assim por diante. Para evitar usar os itens um do outro, você decide rotular as gavetas para ficar claro o que pertence a quem.

Mamun Sabuj
fonte
0

O espaço para nome é usado para o grupo fechado de códigos, para que possam ser usados ​​em locais diferentes sem conflitos de nome. Pense nisso como o método jQuery sem conflito e você o entenderá melhor.

Emmanuel David
fonte
O que você quer dizer com "jQuery no method method"? Como isso está relacionado ao PHP?
Nico Haase
0

Um espaço para nome é um sistema simples para controlar os nomes em um programa.
Ele garante que os nomes sejam únicos e não levem a nenhum conflito.

humaid
fonte
De que tipos de "nomes" você está falando?
Nico Haase
0

Você pode usar o namespace para evitar colisões de nomes entre o código criado e as classes / funções / constantes internas do PHP ou classes / funções / constantes de terceiros. Os espaços para nome também podem alias (ou encurtar) os Extra_Long_Names projetados para reduzir o primeiro problema, melhorando a legibilidade do código-fonte.

Como todos sabemos, namespaces e características não são novidade no PHP, mas ainda assim muitos desenvolvedores de php não usam esses ótimos conceitos devido à sua complexidade. Então, neste post. Vou tentar limpá-los com exemplos. O que são namespace e características?

Como você pode implementá-los em seu código para torná-lo reutilizável e extensível?

Benefícios dos namespaces

Você pode usar o namespace para evitar colisões de nomes entre o código criado e as classes / funções / constantes internas do PHP ou classes / funções / constantes de terceiros.

Os espaços para nome também têm a capacidade de criar alias (ou encurtar) Extra_Long_Names projetados para reduzir o primeiro problema, melhorando a legibilidade do código-fonte. Vamos entender os namespaces com um exemplo. crie um nome de pasta "php_oops" em htdocs (xampp) ou www (xwamp) crie uma nova pasta no diretório raiz chamado "namespaces" e, em seguida, crie um arquivo index.php na pasta namespaces.

<?php
// FilePath:- namespaces/index.php

// let's say, we have two classes in index,
// here, these two classes have global space
class A 
{ 
   function __construct()
   { 
      echo "I am at Global space, Class A";
   }
}
class B
{
   function __construct()
   {
      echo "I am at Global space, Class B";
   }
}
// now create an object of class and 
$object = new A; // unqualified class name
echo "<br/>";
$object = new \B; // fully qualified class name
// output: 
I am at Global space, Class A
I am at Global space, Class B

Referência- https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb

Ashwani Garg
fonte
1
Tenha cuidado ao vincular seu próprio conteúdo em sites diferentes, pois você não deseja ser um spammer . Você deve incluir a maioria do conteúdo aqui e usar o link apenas como referência.
Dharman 12/04