O que são namespaces PHP?
O que são namespaces em geral?
Uma resposta leiga com um exemplo seria ótima.
fonte
O que são namespaces PHP?
O que são namespaces em geral?
Uma resposta leiga com um exemplo seria ótima.
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.
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.
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();
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.
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.
Você pode encontrar muito mais informações na documentação oficial do PHP para namespaces .
fonte
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í quenamespace
é útil e ause
palavra - 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\Controllers
entã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
use
palavra-chave “ ”, usamos, ause
palavra-chave “ ” para tornar nossa classe ciente de uma classe ou função específica que queremos usar em nossa classeportanto, 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
”, ause
palavra-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
as
palavra-chave “ ” juntamente com ause
palavra-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
".fonte
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 ):
fonte
Assim como diretórios e arquivos , o namespace no PHP serve para agrupar classes , funções , interfaces e constantes .
Exemplo:
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:
O princípio se estende ao espaço para nome na palavra de programação.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
Referência- https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb
fonte