PHP Autoload PSR-4/PSR-0 com composer

Introdução

Neste artigo vamos aprender como implementar Autoload no PHP baseado na PSR-4 e PSR-0. Vamos usar o composer que já possui o mecanismo de Autoload para ambos. Para uma breve introdução sobre PSR leia meu outro artigo.

Instalando Composer

A instalação do composer é simples, pode ser feita usando alguma das formas abaixo:

curl -sS https://getcomposer.org/installer | php

ou caso não tenha o curl instalado:

php -r "readfile('https://getcomposer.org/installer');" | php

PSR-4 Autoload

PSR-4 é uma especificação de Autoload para o PHP. É recomendada para novos projetos. Projetos que usam a PSR-0 (ver abaixo) se possível, devem ser migrados para a PSR-4. A recomendação da migração e utilização do PSR-4 é do próprio pessoal do PHP-FIG, que marcou a PSR-0 como deprecated. Para mais detalhes acesso o link oficial de especificação PSR-4.

Abaixo veremos um exemplo de Autoload para classes do Zend Framework 2.

Crie um arquivo chamado composer.json, no mesmo diretório onde instalou o composer (Acima), com o seguinte conteúdo:

{
    "autoload": {
        "psr-4": {
                "Zend\\": "src/library/Zend/"
        }
    }
}

O exemplo acima leva em consideração que o diretório base do ZF2 esteja instalado em src/library/.

Após qualquer alteração no arquivo composer.json é necessário executar:

php composer.phar install

Pronto, o composer irá gerar os arquivos necessários para que o Autoload configurado no arquivo composer.json seja possível. Basta agora você incluir o arquivo vendor/autoload.php no script que irá instânciar as classes desejadas. Veja abaixo um exemplo de script que instância a classe BCrypt do ZF2:

<?php
require_once("vendor/autoload.php");

// criptografia
$bcrypt = new Zend\Crypt\Password\Bcrypt;
$str_encrypted = $bcrypt->create('Pasqua Tecnologia');
var_dump($str_encrypted); // exibe string criptogradada

O Autoload leva em consideração o Namespace. Portanto, de acordo com a configuração acima, o Autoload da classe Zend\Crypt\Password\Bcrypt será src/library/Zend/Crypt/Password/Bcrypt.php.

A PSR-4 não força que você tenha a estrutura de Namespace correspondente a estrutura de sistema de arquivos. Por exemplo, caso queira configurar o prefixo de Namespace Foo\Bar no Autoload:

{
    "autoload": {
        "psr-4": {
                "Foo\\Bar\\": "src/"
        }
    }
}

Ao tentar carregar uma classe desse Prefixo, por exemplo Foo\Bar\Hello, o arquivo a ser carregado será no caminho src/Hello.php e não em src/Foo/Bar/Hello.php como aconteceria caso estivesse usando o Autoload baseado na PSR-0.

PSR-0 Autoload

A PSR-0 também é uma especificação de Autoload e foi criado primeiro que a PSR-4. Além de se basear também no namespace, é compatível com o modelo de classes do PEAR (Vendor_Lib_Class). O PHP-FIG (grupo responsável por manter a PSR) recomenda a PSR-4 para Autoload para novos projetos e aconselha se possível migrar os projetos que usam a PSR-0 para PSR-4. Além do mais a PSR-0 esta marcada como deprecated.

A PSR-0 força que toda a estrutura de diretórios corresponda a namespace utilizada. Por exemplo, no caso acima referente à lib do ZF2, a configuração para a PSR-0 seria utilizar o caminho do namespace Zend em src/library/ e não em src/library/Zend/ como na PSR-4.

Exemplo de migração da PSR-0 para PSR-4

Para ilustrar um pouco as diferenças entre as duas PSR, veja abaixo um exemplo de configuração usando PSR-0 e qual seria a mudança necessária para migrar para a PSR-4:

{
    "autoload": {
        "psr-0": {
                "Foo\\Bar\\": "src/"
        }
    }
}

No caso, as classes com o Namespace Foo\Bar, serão carregadas em src/Foo/Bar/<Classe>.php. Se você simplesmente trocar de psr-0 para psr-4, os arquivos agora serão carregados em src/<Classe>.php. Ou seja, para fazer a migração, você teria que copiar todos arquivos de src/Foo/Bar/* para src/. Outra opção é configurar a PSR-4 de uma forma compatível com a PSR-0, sem precisar mover os arquivos de lugar, ficaria da seguinte forma:

{
    "autoload": {
        "psr-4": {
                "Foo\\Bar\\": "src/Foo/Bar/"
        }
    }
}

Referências

http://stackoverflow.com/questions/24868586/what-exactly-is-the-difference-between-psr-0-and-psr-4
http://www.sitepoint.com/battle-autoloaders-psr-0-vs-psr-4/
http://www.php-fig.org/psr/psr-0/
http://www.php-fig.org/psr/psr-4/

Please follow and like us:

Comments

    • mm By Douglas V. Pasqua

    • mm By Douglas V. Pasqua

    • mm By Douglas V. Pasqua

Follow

Get every new post on this blog delivered to your Inbox.

Join other followers: