"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Batalha dos Autoloaders: PSR-0 vs. PSR-4

Batalha dos Autoloaders: PSR-0 vs. PSR-4

Postado em 2025-03-25
Navegar:824

Batalha dos Autoloaders: PSR-0 vs. PSR-4

key tkeaways

  • PSR-0 e PSR-4 são padrões de carga automática no PHP, com os caminhos definidores de PSR-0 com base no espaço de nome de uma classe e permitem que sublinhe em nomes de classe, enquanto o PSR-4 visa simplificar a estrutura da pasta e remover os restos do PSR-0.
  • PSR-4, referido como carregamento automático orientado para o pacote, permite pacotes mais limpos, mas é mais complicado de implementar. Ele também garante que os automóveis de automóveis nunca lançam exceções ou aumentem erros, mantendo a compatibilidade com vários automóveis.
  • Tanto o PSR-0 quanto o PSR-4 têm seus prós e contras: o PSR-4 permite estruturas de pastas mais simples, mas não mostra o caminho exato de uma classe de seu nome totalmente qualificado, enquanto o PSR-0 pode ser caótico, mas apoia desenvolvedores usando convenções de nomeação mais antiga e auxiliares na localização de uma classe de seu nome.
Se você passou pelo estágio iniciante do seu treinamento PHP, já ouviu falar do PSR-0-um padrão de automobilismo que define maneiras de incluir automaticamente as classes PHP em seu código sem precisar usar declarações como requisitos e incluir.

PSR-0

PSR-0 analisa o espaço para nome de uma classe e discerne sua localização no disco rígido a partir desse pouco de informação. Por exemplo, a Classe \ Zend \ Mail \ Message levaria a /path/to/project/lib/vendor/zend/mail/message.php.

PSR-0 também suporta sublinhados nos nomes de classe como alternativa, para facilitar a transição de 5.2 e mais cedo. Zend_Mail_Message também levaria a /path/to/project/lib/vendor/zend/mail/message.php.

Compositor

Quando o Composer apareceu e levou o mundo do gerenciamento de pacotes PHP por Storm, as coisas mudaram. Devido a algumas de suas regras, as pastas geralmente duplicadas e se tornaram muito profundas ao analisar as instalações da classe PSR-0 via compositor. Por exemplo, algumas estruturas de pastas acabaram assim:

Vendor/ vendor_name/ package_name/ src/ Vendor_name/ Package_name/ ClassName.php # vendor_name \ package_name \ className testes/ Vendor_name/ Package_name/ ClassnameTest.php # vendor_name \ package_name \ classnametest
vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
Isso é caótico na melhor das hipóteses, porque:

Os diretórios "SRC" e "Testes" precisam incluir nomes de fornecedor e diretório de pacotes. Este é um artefato de conformidade PSR-0.

Portanto, alguns desenvolvedores PHP altamente qualificados se reuniram e montaram uma sugestão para um novo padrão: PSR-4.

PSR-4

PSR-4 pretende complementar e trabalhar em conjunto com o PSR-0, quando necessário, não substitua completamente. Pode, mas não precisa. O principal objetivo do PSR-4 é remover completamente os remanescentes do PSR-0 e dos pré-5,3 dias e permitir uma estrutura de pasta mais concisa. Com o PSR-4, a árvore de pastas acima seria assim:

Vendor/ vendor_name/ package_name/ src/ ClassName.php # vendor_name \ package_name \ className testes/ ClassnameTest.php # vendor_name \ package_name \ classnametest

vendor/
    vendor_name/
        package_name/
            src/
                ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest

porque o PSR-0 não permite um caminho intercessorial entre qualquer parte do nome da classe

Isso é muito importante-significa que a implementação do PSR-4, enquanto permitir pacotes muito mais limpos, seria muito mais complicada de implementar. Chamamos o pacote de pacote PSR-4, porque favorece a limpeza do pacote antes da simplicidade.

A abordagem escolhida

Os objetivos sugeridos são os seguintes: mantenha a regra do PSR-0 de que todos os pacotes devem conter pelo menos dois níveis de namespace (fornecedor e pacote), verifique se a combinação de pacote de fornecedores pode mapear para qualquer pasta e permitir um infixo de pastas entre o combo de pacote de fornecedores e o restante do restante de classe totalmente qualificado.

isso significa que poderíamos colocar nossas aulas em qualquer lugar do código do pacote, onde faz sentido para nós como seres humanos, e ainda os usá -los sem problemas no PHP sem escrever técnicas alternativas de carregamento ou recorrer à carga manual.

Além disso, o rascunho afirma explicitamente que um automóvel PSR-4 nunca deve lançar exceções ou levantar erros simplesmente porque vários automóveis podem ser registrados e, se alguém não conseguir carregar uma classe, outros devem ter a chance de fazê-lo-lançando um erro e interrompem a quebra de fluxo. Se forem necessárias informações adicionais sobre a falha, deve-se usar um Logger compatível com PSR-3 ou outros meios arbitrários.

Como ilustrado no arquivo de exemplo, usando o Autoloader PSR-4 para carregar classes da seguinte estrutura:

/path/to/packages/foo-bar/ src/ Baz.php # foo \ bar \ baz Qux/ Quux.php # foo \ bar \ qux \ quux testes/ Baztest.php # foo \ bar \ baztest Qux/ Quuxtest.php # foo \ bar \ qux \ quuxtest

seria assim:
      /path/to/packages/foo-bar/
          src/
              Baz.php             # Foo\Bar\Baz
              Qux/
                  Quux.php        # Foo\Bar\Qux\Quux
          tests/
              BazTest.php         # Foo\Bar\BazTest
              Qux/
                  QuuxTest.php    # Foo\Bar\Qux\QuuxTest
Php // instanciar o carregador $ carregador = new \ exemplo \ psr4autoloaderclass; // Registre o automóvel $ carregador-> register (); // Registre os diretórios da base para o prefixo do espaço para nome $ carregador-> addNamespace ('foo \ bar', '/path/to/packages/foo-bar/src'); $ carregador-> addNamespace ('foo \ bar', '/path/to/packages/foo-bar/tests');

onde chamando new \ foo \ bar \ qux \ quase; tentaria carregar a partir do primeiro diretório registrado, enquanto novo \ foo \ bar \ qux \ quuxtest; tentaria carregar a partir do segundo.
vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
Este exemplo também ilustra o uso de várias pastas por espaço para nome único.

Conclusão

não há bala de prata no automobilismo automático. Cada abordagem traz consigo alguns prós e contras-o PSR-4 permitiria estruturas de pastas mais simples, mas nos impediriam de saber o caminho exato de uma classe apenas olhando para o nome totalmente qualificado. O PSR-0, por outro lado, é caótico no disco rígido, mas suporta os desenvolvedores que estão presos no passado (os usuários do nome da categoria) e nos ajuda a discernir a localização de uma aula apenas olhando seu nome.

Como você se sente sobre o PSR-4? Informe -nos nos comentários abaixo ou expresse sua opinião em um dos muitos debates.

de qualquer maneira-não há dúvida de que o carregamento automático orientado para o pacote está aqui para ficar. Se não for formalmente aceito como padrão, então implementado personalizado por pessoas que precisam. Cabe a nós participar da discussão e melhorar a noção o suficiente para alcançar esse estado formal.

perguntas frequentes sobre PSR-0 e PSR-4 AutoLoading

Qual é a principal diferença entre o PSR-0 e o PSR-4? O PSR-0 requer uma correlação direta entre os espaços para nome e a estrutura do diretório, o que significa que cada sublinhado no espaço de nome corresponde a um separador de diretório. Por outro lado, o PSR-4 permite uma abordagem mais flexível, onde uma parte do espaço para nome pode ser mapeada para qualquer diretório, e o restante do espaço para nome pode ser mapeado para a estrutura do subdiretório. A estrita correlação do PSR-0 entre espaços para nome e estrutura de diretórios levou a diretórios profundamente aninhados, o que nem sempre foi prático ou eficiente. Os desenvolvedores fornecem uma abordagem mais flexível, permitindo que os namespaces do PS PS para qualquer diretório, reduzindo a necessidade de ninho de diretório profundo. No entanto, é importante observar que eles não devem ser usados ​​para automaticamente as mesmas classes. O uso de ambos os padrões pode ser benéfico em grandes projetos, onde algum código legado segue o padrão PSR-0, enquanto o código mais recente segue o padrão PSR-4. Ele permite que os desenvolvedores mapeem uma parte do espaço para nome de qualquer diretório, reduzindo a necessidade de nidificação de diretório profundo. Isso facilita o gerenciamento e a navegação da estrutura de diretório do projeto. Isso significa que, embora ainda esteja funcional, não é recomendado para uso em novos projetos. O PSR-4 é o padrão recomendado para a carga automática no PHP.

Como funciona a automação automática no PSR-4? O restante do espaço para nome é então mapeado para a estrutura do subdiretório. Isso permite uma abordagem mais flexível e eficiente para a carga automática. É também o padrão recomendado para a carga automática no PHP, tornando-o uma boa opção para novos projetos. No PSR-4, uma parte do espaço para nome pode ser mapeada para qualquer diretório, e o restante do espaço para nome pode ser mapeado para a estrutura do subdiretório. Isso pode exigir a reestruturação da estrutura de diretório do seu projeto. Se você estiver usando uma versão mais antiga do PHP, precisará atualizar para usar o PSR-4. No entanto, no futuro próximo, o PSR-4 é o padrão recomendado para a carga automática no PHP.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3