PSR-4 a recomendação de autoload do PHP


Na linguagem de programação PHP temos uma série de recomendações chamadas PSRs. Elas são definidas por um grupo de desenvolvedores em conjunto com a comunidade. Nesse post vamos falar de uma das PSRs, a PSR-4 que visa padronizar o modo como carregamos os arquivos na linguagem de programação PHP.

Caso não conheça o que é PHP-FIG, PSR, RFC e outros detalhes, aconselho leitura do artigo O que são as PSRs do PHP.

Porque criar uma padronização como a PSR-4 para autoload

Uma aplicação PHP por menor que seja precisa ser dividida em vários arquivos para manter a organização. Os arquivos consequentemente precisam ser incluídos para que o código dentro dele possa ser usado. Com esse intuito usamos o que chamamos em PHP de autoloading, que basicamente é uma lógica para carregar nossos arquivos automaticamente.

O problema é que cada projeto implementava uma lógica diferente para carregar os arquivos e também para estrutura de pastas onde esses arquivos eram colocados. E como já falamos no artigo sobre o que são PSRs, quando cada projeto ou empresa usa um padrão temos vários problemas. Além disso, nem sempre reinventar a roda é uma boa ideia quando falamos de programação, muitas vezes o modo como era feito não era o melhor.

Pensado em uma padronização única de carregamento o PHP-FIG criou a PSR-0 que com o tempo acabou sendo descontinuada e a PSR-4 passou a ser indicada em seu lugar.

Porque seguir a PSR-4

A PSR-4 vai de encontro ao desenvolvimento moderno de aplicações PHP e possui tudo que o desenvolvedor precisa para trabalhar com orientação a objetos. Ela foi pensada para funcionar com namespace e facilitar que o projeto atenda outras recomendações, como por exemplo a PSR-1.

O PSR-4 pode ser facilmente utilizado com autoload do composer, além de ser o padrão adotado pelos principais frameworks PHP do mercado, como:

Devido a maioria dos projetos atuais do mercado utilizarem PSR-4, quando um novo desenvolvedor entrar no projeto, provavelmente ele já conhecerá a recomendação e começará produzir mais rápido.

Namespace e estrutura de pastas na PSR-4

Se olharmos o namespace de uma classe e o caminho de um arquivo no sistema operacional vamos ver que eles são extremamente parecidos:

Por exemplo, no linux poderíamos ter o caminho de um arquivo assim: Treinaweb/Recursos/Curso.php e no PHP um namespace igual abaixo:

<?php

namespace TreinawebRecursos;

class Curso
{
    //...
}

A PSR-4 faz uso exatamente dessa característica em comum, desse modo precisamos definir o mínimo possível de lógica para carregar nossos arquivos, temos a vantagem da organização dos namespaces seguir o mesmo padrão que a dos arquivos, além de fazer uso da estrutura de diretórios do sistema operacional que é algo amplamente conhecido.

Recomendações para definição do namespace na PSR-4

Quando utilizamos a PSR-4 temos que seguir algumas recomendações na hora de definir o namespace em nossas classes. Ele deve seguir a estrutura abaixo:

<NomeNameSpace>(<SubNamespaceNames>)*<NomeClasse>
  • É necessário um namespace principal, que no exemplo acima é representado por <NomeNameSpace>. Ele também é conhecido por namespace do fornecedor (vendor namespace). Se estiver desenvolvendo um projeto que será compartilhado, por exemplo, uma biblioteca, é importante que o namespace principal seja unico;
  • Podemos ter quantos sub-namespaces forem necessários para organização da nossa aplicação, por exemplo: TreinawebRecursosAVACursosCurso tem os sub-namespaces RecursosAVACursos
  • Sempre deve terminar com o nome de uma classe, no exemplo TreinawebRecursosAVACursosCurso, Curso é o nome da nossa classe;
  • Os caracteres do caminho do namespace podem ter letras maiúsculas e minúsculas;
  • O nome da classe sempre deve ser referenciado em case-sensitive, ou seja, respeitando letras maiúsculas e minúsculas

Veja o exemplo de um controller em uma aplicação Laravel:

namespace AppHttpControllers;

use IlluminateHttpRequest;

class UserController extends Controller
{
    /**
     * Store a new user.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $name = $request->input('name');

        //
    }
}

No caso do namespace IlluminateHttpRequest que o código acima importa, temos:

  • Illuminate – É o namespace principal (vendor namespace);
  • Http – Sub-namespace de organização interna da aplicação;
  • Request – Nome da classe

Recomendação para carregamento dos arquivos na PSR-4

O carregamento dos arquivos acontecem de acordo com a estrutura do namespace que definimos. Para ele acontecer deve seguir os seguintes detalhes:

  • O namespace principal (vendor namespace) deve indicar para o diretório de base;
  • Os sub-namespaces definidos representam os diretórios criados dentro do diretório base. Seguindo o mesmo padrão de letras maiúsculas e minúsculas definidas em cada sub-namespace;
  • O nome da classe no namespace deve seguir o mesmo padrão do nome do arquivo onde a classe está. O arquivo deve terminar com .php e seguir mesmo padrão de maiúsculas e minúsculas do nome da classe.

Como funciona a PSR-4

Vamos pegar o exemplo do namespace IlluminateHttpRequest novamente. Se olharmos a estrutura de pastas do projeto veremos:

Definição nome de pasta e arquivos na PSR-4

  • Vendor namespace Illuminate aponta para a pasta src/Illuminate/;
  • Sub-namespace Http aponta para a pasta de mesmo nome;
  • Nome da Classe Request aponta para o arquivo Request.php

Como usar a PSR-4 no meu projeto

O modo mais fácil de usar o padrão PSR-4 em um projeto PHP através do próprio gerenciador de dependência Composer. No arquivo composer.json configuramos o vendor namespace e a pasta principal a partir de onde serão criados os sub-namespaces:

"autoload": {
   "psr-4": {
        "Treinaweb\": "src/"
    },
 },

Então podemos criar uma classe conforme abaixo que ficaria dentro da pasta src/Recursos chamado Curso.php:

<?php

namespace TreinawebRecursos;

class Curso
{
    //...
}

O composer possui dentro da pasta vendor um arquivo chamado autoload.php basta carregar ele e então todas as classes que instanciar automaticamente serão carregadas seguindo a lógica que aprendemos da PSR-4:

<?php

require_once "vendor/autoload.php";

$request = new TreinawebRecursosCurso();

Ao carregarmos o arquivo de autoload do composer automaticamente as classes das dependências instaladas no projeto também serão carregadas via autoload.

Também é possível implementar a lógica de carregamento da PSR-4 diretamente no seu projeto. No repositório oficial do PHP-FIG tem alguns exemplos de implementação da PSR-4.

Considerações finais sobre a PSR-4

A PSR-4 é o padrão mais utilizado da linguagem PHP. Ele vai de acordo com o desenvolvimento moderno PHP, é de amplo conhecimento da comunidade, além de ser facilmente usado com o composer o que permite iniciar o projeto sem ter que se preocupar em implementar autoload no projeto.


Fonte Elton Fonseca
Data da Publicação Original: 3 April 2020 | 2:35 pm


You may also like

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *