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.
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-namespacesRecursos\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:
- Vendor namespace
Illuminate
aponta para a pastasrc/Illuminate/
; - Sub-namespace
Http
aponta para a pasta de mesmo nome; - Nome da Classe
Request
aponta para o arquivoRequest.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.