Resumo : neste tutorial, você aprenderá como usar o Composer para carregar automaticamente classes PHP de arquivos usando o padrão PSR-4.
Carregando classes usando a construção require_once
Primeiro, crie a seguinte estrutura de diretórios com arquivos:
.
├── app
│ ├── bootstrap.php
│ └── models
│ └── User.php
└── index.php
Linguagem de código: PHP ( php )
O User.php
arquivo na models
pasta contém a User
classe :
<?php
class User
{
private $username;
private $password;
public function __construct($username, $password)
{
$this->username = $username;
$this->password = password_hash($password);
}
public function getUsername(): string
{
return $this->username;
}
}
Linguagem de código: PHP ( php )
A User
é uma aula simples. Tem duas propriedades $username
e $password
. O construtor inicializa as propriedades a partir de seus argumentos. Além disso, ele usa a password_hash()
função para fazer hash do arquivo $password
.
O bootstrap.php
arquivo usa a require_once
construção para carregar a User
classe do User.php
arquivo na models
pasta:
<?php
require_once 'models/User.php';
Linguagem de código: PHP ( php )
Quando você tiver mais classes na models
pasta, poderá adicionar mais require_once
instruções ao bootstrap.php
arquivo para carregar essas classes.
O index.php
arquivo carrega o bootstrap.php
arquivo e usa a User
classe:
<?php
require './app/bootstrap.php';
$user = new User('admin', '$ecurePa$$w0rd1');
Linguagem de código: PHP ( php )
Essa estrutura de aplicativo funciona bem se você tiver um pequeno número de classes. No entanto, quando o aplicativo tem um grande número de classes, ele require_once
não é bem dimensionado. Neste caso, você pode usar a spl_autoload_register()
função para carregar automaticamente as classes de seus arquivos .
O problema com a spl_autoload_register()
função é que você mesmo precisa implementar as funções do autoloader. E seus autoloaders podem não gostar dos autoloaders desenvolvidos por outros desenvolvedores.
Portanto, ao trabalhar com uma base de código diferente, você precisa estudar os autoloaders nessa base de código específica para entender como eles funcionam.
É por isso que o Composer entra em cena.
Introdução ao Compositor
Composer é um gerenciador de dependências para PHP. O Composer permite que você gerencie dependências em seu projeto PHP. Neste tutorial, vamos nos concentrar em como usar o Composer para carregar automaticamente classes.
Antes de usar o Composer, você precisa baixá-lo e instalá-lo. A documentação oficial fornece etapas detalhadas de como baixar e instalar o Composer em seu computador .
Para verificar se o Composer foi instalado com sucesso, execute o seguinte comando no prompt de comando no Windows ou Terminal no macOS e Linux:
composer -v
Linguagem de código: PHP ( php )
Ele retornará a versão atual e várias opções que você pode usar com o composer
comando.
Carregamento automático de classes com o Composer
Voltando ao exemplo anterior, para usar o Composer, primeiro você cria um novo arquivo chamado composer.json
na pasta raiz do projeto. O diretório do projeto ficará assim:
.
├── app
│ ├── bootstrap.php
│ └── models
│ └── User.php
├── composer.json
└── index.php
Linguagem de código: PHP ( php )
No composer.json
, você adiciona o seguinte código:
{
"autoload": {
"classmap": ["app/models"]
}
}
Linguagem de código: PHP ( php )
Este código significa que o Composer carregará automaticamente todos os arquivos de classe definidos na app/models
pasta.
Se você tiver classes de outras pastas que deseja carregar, poderá especificá-las no classmap
array:
{
"autoload": {
"classmap": ["app/models", "app/services"]
}
}
Linguagem de código: PHP ( php )
Neste exemplo, o Composer carregará classes de ambos models
e services
pastas dentro da app
pasta.
Em seguida, inicie o prompt de comando no Windows ou Terminal no macOS e Linux e navegue até o diretório do projeto.
Em seguida, digite o seguinte comando no diretório do projeto:
composer dump-autoload
Linguagem de código: PHP ( php )
O Composer irá gerar um diretório chamado vendor
que contém vários arquivos como este:
.
├── app
│ ├── bootstrap.php
│ └── models
│ └── User.php
├── composer.json
├── index.php
└── vendor
├── autoload.php
└── composer
├── autoload_classmap.php
├── autoload_namespaces.php
├── autoload_psr4.php
├── autoload_real.php
├── autoload_static.php
├── ClassLoader.php
└── LICENSE
Linguagem de código: PHP ( php )
O arquivo mais importante para você por enquanto é autoload.php
file.
Depois disso, carregue o autoload.php
arquivo no bootstrap.php
arquivo usando a require_once
construção:
<?php
require_once __DIR__ . '/../vendor/autoload.php';
Linguagem de código: PHP ( php )
Finalmente, você pode usar a User
classe no index.php
:
<?php
require './app/bootstrap.php';
$user = new User('admin', '$ecurePa$$w0rd1');
Linguagem de código: PHP ( php )
A partir de agora, sempre que você tiver uma nova classe no models
diretório, será necessário executar o comando composer dump-autoload
novamente para gerar novamente o autoload.php
arquivo.
Por exemplo, o seguinte define uma nova classe chamada Comment
no Comment.php
arquivo da models
pasta:
<?php
class Comment
{
private $comment;
public function __construct(string $comment)
{
$this->comment = $comment;
}
public function getComment(): string
{
return strip_tags($this->comment);
}
}
Linguagem de código: PHP ( php )
Se você não executar o composer dump-autoload
comando e usar a Comment
classe no index.php
arquivo, receberá um erro:
<?php
require './app/bootstrap.php';
$user = new User('admin', '$ecurePa$$w0rd1');
$comment = new Comment('<h1>Hello</h1>');
echo $comment->getComment();
Linguagem de código: PHP ( php )
Erro:
Fatal error: Uncaught Error: Class 'Comment' not found in...
Linguagem de código: PHP ( php )
No entanto, se você executar o composer dump-autoload
comando novamente, o index.php
arquivo funcionará corretamente.
Carregamento automático do compositor com PSR-4
PSR significa Recomendação Padrão PHP. PSR é uma especificação PHP publicada pelo PHP Framework Interop Group ou PHP-FIG.
Os objetivos do PSR são permitir a interoperabilidade dos componentes PHP e fornecer uma base técnica comum para a implementação das melhores práticas em programação PHP.
PHP-FIG publicou muitos PSR a partir do PSR-0. Para uma lista completa de PSR, confira a página PSR .
PSR-4 é um padrão de carregamento automático que descreve a especificação para carregamento automático de classes a partir de caminhos de arquivo. https://www.php-fig.org/psr/psr-4/
De acordo com o PSR-4, um nome de classe totalmente qualificado possui a seguinte estrutura:
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
Linguagem de código: PHP ( php )
A estrutura começa com um namespace, seguido por um ou mais subnamespaces e o nome da classe.
Para estar em conformidade com o PSR-4, é necessário estruturar a aplicação anterior assim:
.
├── app
│ ├── Acme
│ │ ├── Auth
│ │ │ └── User.php
│ │ └── Blog
│ │ └── Comment.php
│ └── bootstrap.php
├── composer.json
└── index.php
Linguagem de código: PHP ( php )
A nova estrutura possui as seguintes alterações:
Primeiro, o models
diretório é excluído.
Em segundo lugar, User.php
está abaixo da Acme/Auth
pasta. E a User
classe tem namespace com Acme/Auth
. Observe como os namespaces são mapeados para a estrutura de diretórios. Isso também ajuda a encontrar um arquivo de classe mais rapidamente, observando seu namespace.
<?php
namespace Acme\Auth;
class User
{
// implementation
// ...
}
Linguagem de código: PHP ( php )
Terceiro, Comment.php
está abaixo da Acme/Blog
pasta. A Comment
classe tem o namespace Acme\Blog
:
<?php
namespace Acme\Blog;
class Comment
{
// implementation
// ...
}
Linguagem de código: PHP ( php )
Quarto, o composer.json
arquivo se parece com o seguinte:
{
"autoload": {
"psr-4": {
"Acme\\":"app/Acme"
}
}
}
Linguagem de código: PHP ( php )
Em vez de usar o classmap
, o composer.json
arquivo agora usa psr-4
. O psr-4
mapeia o namespace "Acme\\"
para a "app/Acme"
pasta.
Observe que a segunda barra invertida ( \
) no Acme\
namespace é usada para escapar da primeira barra invertida ( \
).
Quinto, para usar as classes User
e Comment
no index.php
arquivo, você precisa executar o composer dump-autoload
comando para gerar o arquivo autoload.php:
composer dump-autoload
Linguagem de código: PHP ( php )
Como as classes User
e Comment
possuem namespaces, você precisa ter as use
instruções index.php
a seguir:
<?php
require './app/bootstrap.php';
use Acme\Auth\User as User;
use Acme\Blog\Comment as Comment;
$user = new User('admin', '$ecurePa$$w0rd1');
$comment = new Comment('<h1>Hello</h1>');
echo $comment->getComment();
Linguagem de código: PHP ( php )
Resumo
- Composer é uma ferramenta de gerenciamento de dependências em PHP.
- Use PSR-4 para organizar diretórios e arquivos de classe.
- Use o
composer dump-autoload
comando para gerar oautoload.php
arquivo.