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
\
(\ )*\ - 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.
- O namespace pode ter um ou mais sub-namespaces, estes são os elementos intermediários.
- O namespace deve terminar com o nome da classe.
- Underscore (underline ou simplesmente
_
) não tem qualquer efeito especial no namespace. - Caracteres alfabéticos podem ter qualquer combinação de minúsculas e maiúsculas em um namespace totalmente qualificado.
- Todos os namespaces devem ser referenciados em minúsculas e maiúsculas.
- Enquanto carregamos um arquivo que corresponde a um namespace totalmente qualificado...
- O vendor name e (talvez) alguns dos primeiros níveis de sub-namespace devem corresponder a um diretório base.
- 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!