Padrão PSR-4 de desenvolvimento PHP - Criar um autoloader Artigo

Conheça os cursos gratuitos do WebDevBr! - Inscreva-se!


Este artigo foi publicado a 10 meses, 3 semanas, 4 dias atrás.

A exatamente 2 anos, 8 meses, 1 semana e 2 dias atrás eu escrevi um artigo sobre a PSR-0, desde então muita coisa mudou na comunidade PHP e, infelizmente, eu aprendo e me atualizo num ritmo muito superior ao que consigo escrever, bem, o que quero dizer é: desculpem a demora.

A PSR-4 veio para (como eu havia previso na época) atualizar a PSR-0 e deixar o autoload "mais flexível", a PSR-0 foi marcada como obsoleta embora seja atualmente usada em muitos projetos e o Composer de total suporte (pelo menos até o momento de publicação deste artigo), segue abaixo a tradução não oficial e indireta do tópico Overview da página oficial.

Este PSR descreve uma especificação para carregamento automático de classes a partir de arquivos. Isto é totalmente interoperável e pode ser usado em adição a qualquer outra especificação de autoload, incluindo PSR-0. Este PSR também descreve onde colocar os arquivos que serão carregandos automaticamente de acordo com a especificação.

Gostou deste artigo?

Receba atualizações semanais com novos artigos do WebDevBr e outras dicas!

Mas vamos por partes.

O que é autoload

Autoload é uma mão na roda quando trabalhamos com orientação a objetos, ele simplesmente carrega o arquivo da classe quando ele é necessário, imagine carregar, por exemplo, o Slim Framework, que por ser um micro framework imaginamos ser mais simples em quantidade de classes.

Não vou exemplificar aqui, tente por conta própria fazer isso sem o Composer e ir dando include/require nos arquivos a medida que são necessários, você vai longe.

O autoload permitiu organizações mais elaboradas, essas organizações permitiram que coisas que imaginamos ser simples possam ter dezenas ou centenas de classes por traz e ainda assim facilmente mantidas.

Regras da PSR-4

Para que possa ser um processo automático você precisa seguir algumas regras, elas são simples, mas caso você não goste delas pode decidir parar de programar, porque seguir regras é o que fazemos.

Estes textos são traduções livres e indiretas da página oficial da PSR-4 no PHP-FIG.

  • O termos classe refere-se a classes, interfaces, traits e outras estruturas similares.
  • Um nome de classe (ou namespace) totalmente qualificado deve seguir o seguinte formato \(\)*\
    1. O namespace deve ter um nome de nível superior chamado "vendor namespace" ("vendor name" para os intimos) ou nome de fornecedor, este é o primeiro (ou primeiros) elemento.
    2. O namespace pode ter um ou mais sub-namespaces, estes são os elementos intermediários.
    3. O namespace deve terminar com o nome da classe.
    4. Underscore (underline ou simplesmente _) não tem qualquer efeito especial no namespace.
    5. Caracteres alfabéticos podem ter qualquer combinação de minúsculas e maiúsculas em um namespace totalmente qualificado.
    6. Todos os namespaces devem ser referenciados em minúsculas e maiúsculas.
  • Enquanto carregamos um arquivo que corresponde a um namespace totalmente qualificado...
    1. O vendor name e (talvez) alguns dos primeiros níveis de sub-namespace devem corresponder a um diretório base.
    2. Cada sub-namespace seguinte deve corresponder a um sub-diretório dentro do diretório base, cada separador de sub-namespace corresponde a um separador de diretório no sistema operacional (/ para baseados um unix e \ para Windows).
  • Implementações de autoloader não devem lançar exceções, não devem gerar erros de qualquer nível e não devem retornar um valor.

Exemplos

Embora pareçam complicadas, na prática a coisa toda anda muito mais rápido, vamos ver alguns exemplos da documentação. Veja esta tabela da página oficial da PSR-4.

NAMESPACE PREFIXO (vendor name) DIRETÓRIO BASE CAMINHO COMPLETO DE AUTOLOAD
\Acme\Log\Writer\File_Writer Acme\Log\Writer ./acme-log-writer/lib/ ./acme-log-writer/lib/File_Writer.php
\Aura\Web\Response\Status Aura\Web /path/to/aura-web/src/ /path/to/aura-web/src/Response/Status.php
\Symfony\Core\Request Symfony\Core ./vendor/Symfony/Core/ ./vendor/Symfony/Core/Request.php
\Zend\Acl Zend /usr/includes/Zend/ /usr/includes/Zend/Acl.php

Ficou mais simples?

Imagine que eu tenho a seguinte estrutura:

  • src/Html.php
  • bootstrap.php

Para o processo de autoload eu usaria o Composer, tem um curso completo e grátis aqui no WebDevBr.

O vendor name será \WebDevBr\HtmlBuilder e vai apontar para o diretório src, desta forma teremos o arquivo Html.php com a seguinte extrutura:

<?php

namespace WebDevBr\HtmlBuilder;

class Html
{
    public function run()
    {
        echo 'html builder';
    }
}

O arquivo bootstrap.php vai carregar a classe:

<?php

//lógica de autoload, provavelmente um
//include em vendor/autoload.php do Composer

$html = new WebDevBr\HtmlBuilder\Html;
$html->run();

O resultado deverá ser html builder.

É isso ai! O próximo passo é você aprender a usar o Composer e a PSR-1, depois a PSR-2 e por ai vai, bons estudos!


Cursos relacionados


* Parcelamento apenas cartão de crédito! Pode haver uma pequena variação no parcelamento em relação a simulações apresentadas!