Recentemente, li sobre espaços para nome e como eles são benéficos. Atualmente, estou criando um projeto no Laravel e tentando passar do carregamento automático do mapa de classe para o namespacing. No entanto, não consigo entender qual é a diferença real entre o PSR-0 e o PSR-4.
Alguns recursos que eu li são ...
O que eu entendo:
- O PSR-4 não converte sublinhados em separadores de diretório
- Certas regras específicas do compositor tornam a estrutura do diretório complexa, o que torna o espaço de nomes do PSR-0 detalhado e, portanto, o PSR-4 foi criado.
Exemplos explicando a diferença seriam apreciados.
Respostas:
Eles são muito parecidos, portanto, não é de surpreender que seja um pouco confuso. O resumo é que o PSR-0 tinha alguns recursos de compatibilidade com versões anteriores para nomes de classe no estilo PEAR que o PSR-4 eliminou, portanto, ele suporta apenas código no namespace. Além disso, o PSR-4 não força você a ter todo o espaço para nome como uma estrutura de diretórios, mas apenas a parte que segue o ponto de ancoragem.
Por exemplo, se você definir que o
Acme\Foo\
namespace está ancorada emsrc/
, com PSR-0 significa que ele irá procurarAcme\Foo\Bar
emsrc/Acme/Foo/Bar.php
enquanto no PSR-4 ele vai olhar para ele emsrc/Bar.php
, permitindo estruturas de diretórios mais curtos. Por outro lado, alguns preferem ter a estrutura de diretórios completa para ver claramente o que está em qual namespace, então você também pode dizer queAcme\Foo\
está nosrc/Acme/Foo
PSR-4, o que lhe dará o equivalente ao comportamento do PSR-0 descrito acima.Resumindo, para novos projetos e para a maioria das intenções e propósitos, você pode usar o PSR-4 e esquecer tudo sobre o PSR-0.
fonte
src/Bar.php
se você dizAcme\Foo\ => src/
Aqui estão as principais diferenças,
1. Por exemplo, se você definir que o
Acme\Foo\
espaço para nome está ancoradosrc/
,Acme\Foo\Bar
emsrc/Acme/Foo/Bar.php
Acme\Foo\Bar
nosrc/Bar.php(where Bar class is)
.2. PSR-4 não converte sublinhados em separadores de diretório
3. Você prefere usar o PSR-4 com namespaces
4. PSR-0 não funcionará mesmo que o nome da classe seja diferente do nome do arquivo, como no exemplo acima:
Acme\Foo\Bar
--->src/Acme/Foo/Bar.php
(para a classe Bar) funcionaráAcme\Foo\Bar
--->src/Acme/Foo/Bar2.php
(para a classe Bar) não funcionaráfonte
PSR-4 é algo como 'caminho relativo', PSR-0, 'caminho absoluto'.
por exemplo
config:
Carregamento automático PSR-0 :
Carregamento automático PSR-4 :
E há mais algumas diferenças nos detalhes entre PSR-0 e PSR-4, veja aqui: http://www.php-fig.org/psr/psr-4/
fonte
Convenção de namespace / pasta.
As classes devem ser armazenadas em pastas de acordo com seus namespaces.
Em geral, você criará um diretório src / na sua pasta raiz, no mesmo nível do fornecedor /, e adicionará seus projetos lá. Abaixo está um exemplo da estrutura de pastas:
Diferença entre psr-0 e psr-4
psr-0
Está obsoleto. Olhando para o
vendor/composer/autoload_namespaces.php
arquivo, você pode ver os espaços para nome e os diretórios para os quais eles são mapeados.compositer.json
psr-4
Olhando para o
vendor/composer/autoload_psr4.php
arquivo, você pode ver os espaços para nome e os diretórios para os quais eles são mapeados.compositer.json
compositer.json
fonte
Mesmo quando tentei, mas o Composer está uma bagunça. Infelizmente, é a única alternativa. Do mercado.
Por que está uma bagunça?
O preenchimento automático do compositor funciona bem se você estiver no controle do código. No entanto, se você estiver importando um projeto diferente, encontrará muitos estilos e maneiras de criar pastas. Por exemplo, alguns projetos são /company/src/class.php, enquanto outros são company / class.php e outros são company / src / class / class.php
Eu criei uma biblioteca que a resolve:
https://github.com/EFTEC/AutoLoadOne (é grátis, MIT).
Ele gera uma inclusão automática, varrendo todas as classes de uma pasta, para que funcione em todos os casos (psr-0 psr-4, classes sem espaço para nome, arquivo com várias classes).
editar: E, novamente, votou sem motivo. ;-)
fonte