que - php autoload pattern




Quais são as diferenças entre PSR-0 e PSR-4? (4)

Aqui estão as principais diferenças,

1. Por exemplo, se você definir que o namespace Acme\Foo\ está ancorado em src/ ,

  • com PSR-0 significa que vai procurar por Acme\Foo\Bar em src/Acme/Foo/Bar.php
  • enquanto no PSR-4 ele irá procurar por Acme\Foo\Bar em src/Bar.php(where Bar class is) .

2. O PSR-4 não converte sublinhados em separadores de diretórios

3. Você preferiria usar o PSR-4 com namespaces

4. O PSR-0 não funcionará mesmo que o nome da classe seja diferente do nome do arquivo, como considerando o 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á

Recentemente eu li sobre namespaces e como eles são benéficos. Atualmente estou criando um projeto no Laravel e tentando passar do autoloading do mapa de classe para o namespace. No entanto, não consigo entender qual é a diferença real entre PSR-0 e PSR-4.

Alguns recursos que eu li são ...

O que eu entendo:

  • O PSR-4 não converte sublinhados em separadores de diretórios
  • Certas regras específicas do compositor fazem com que a estrutura do diretório se torne complexa, o que torna o namespace do PSR-0 detalhado e, portanto, o PSR-4 foi criado

Exemplos explicando a diferença seriam apreciados.


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 / em sua pasta raiz, sentado no mesmo nível do fornecedor / e incluirá seus projetos lá. Abaixo está um exemplo da estrutura de pastas:

.
+-- src
    |
    +-- Book 
    |   +-- History
    |   |   +-- UnitedStates.php - namespace Book\History;
    +-- Vehicle
    |   +-- Air
    |   |   +-- Wings
    |   |   |   +-- Airplane.php - namespace Vehicle\Air\Wings;
    |   +-- Road
    |   |   +-- Car.php - namespace Vehicle\Road;
+-- tests
    +-- test.php
+-- vendor

Diferença entre psr-0 e psr-4

psr-0

Está obsoleto. Observando o arquivo vendor/composer/autoload_namespaces.php você pode ver os namespaces e os diretórios aos quais eles estão mapeados.

composer.json

"autoload": {
        "psr-0": {
            "Book\\": "src/",
            "Vehicle\\": "src/"
        }
} 
  • Procurando por Book \ History \ UnitedStates em src / Book /History/UnitedStates.php
  • Procurando por Vehicle \ Air \ Wings \ Airplane em src / Vehicle /Air/Wings/Airplane.php

psr-4

Observando o arquivo vendor/composer/autoload_psr4.php você pode ver os namespaces e os diretórios aos quais eles estão mapeados.

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/",
        "Vehicle\\": "src/"
    }
}   
  • Procurando por Book \ History \ UnitedStates em src /History/UnitedStates.php
  • Procurando por Vehicle \ Air \ Wings \ Airplane em src /Air/Wings/Airplane.php

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/Book/",
        "Vehicle\\": "src/Vehicle/"
    }
}    
  • Procurando por livro \ Histórico \ UnitedStates src / Book /History/UnitedStates.php
  • Procurando por Vehicle \ Air \ Wings \ Airplane em src / Vehicle /Air/Wings/Airplane.php

Mesmo quando tentei, mas o Composer está uma bagunça. Infelizmente, é a única alternativa do mercado.
Por que é uma bagunça?
O autocomplete do Composer 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 resolve:

https://github.com/EFTEC/AutoLoadOne (é grátis, MIT).

Ele gera um autoinclude digitalizando todas as classes de uma pasta, assim ele funciona em todos os casos (psr-0 psr-4, classes sem namespace, arquivo com múltiplas classes ..

edit: E novamente, downvoted sem qualquer razão. ;-)


O PSR-4 é algo como 'caminho relativo', PSR-0, 'caminho absoluto'.

por exemplo

config:

'App\Controller' => 'dir/'

PSR-0 autoload:

App\Controller\IndexController --> dir/App/Controller/IndexController.php

PSR-4 autoload:

App\Controller\IndexController --> dir/IndexController.php

E há mais algumas diferenças nos detalhes entre PSR-0 e PSR-4, veja aqui: PSR-4





psr-4