PHP

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

Nesse artigo falaremos de umas das PSRs mais importantes da linguagem PHP, a PSR-4, responsável por recomendações de autoload na linguagem. Venha conferir!!!

há 4 anos 2 semanas

Formação Desenvolvedor PHP
Conheça a formação em detalhes

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 Treinaweb\Recursos;

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: Treinaweb\Recursos\AVA\Cursos\Curso tem os sub-namespaces Recursos\AVA\Cursos
  • Sempre deve terminar com o nome de uma classe, no exemplo Treinaweb\Recursos\AVA\Cursos\Curso, 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 App\Http\Controllers;

use Illuminate\Http\Request;

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 Illuminate\Http\Request 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 Illuminate\Http\Request 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 Treinaweb\Recursos;

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 Treinaweb\Recursos\Curso();

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.

Autor(a) do artigo

Elton Fonseca
Elton Fonseca

Professor e desenvolvedor. Formado em análise e desenvolvimento de sistema, pós graduado em engenharia e arquitetura de software. É autor de cursos em diversos temas, como, desenvolvimento back-end, cloud computing e CMSs. Nas horas vagas adora estudar sobre o mercado financeiro, cozinhar e brincar com pequeno Daniel. @eltonfonsecadev

Todos os artigos

Artigos relacionados Ver todos