O Composer é o gerenciador de pacotes do PHP. Rode composer require vendor/package na pasta do seu projeto: o Composer baixa a biblioteca para vendor/, registra-a no composer.json, e você a carrega, junto com tudo o que instalou, com uma linha, require __DIR__ . '/vendor/autoload.php';.
composer require monolog/monolog
<?php
require __DIR__ . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;
$log = new Logger('app');
$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Level::Warning));
$log->warning('Disk almost full', ['free' => '2%']);
Nenhum include para cada arquivo: o autoloader carrega Logger, StreamHandler e tudo o que eles usam na primeira vez que cada classe é necessária. Os pacotes vêm do Packagist, o registro público em que o Composer busca por padrão.
Instalar o Composer
O Composer precisa do PHP na sua máquina primeiro (veja instalar PHP).
Windows: baixe e rode o Composer-Setup.exe de getcomposer.org. Ele encontra o seu php.exe e adiciona composer ao PATH. Abra um novo terminal depois.
macOS com Homebrew:
brew install composer
Linux: o pacote da sua distribuição (sudo apt install composer no Debian e no Ubuntu) funciona, mas muitas vezes é uma versão mais antiga. O instalador oficial dá a atual:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer
A página de download em getcomposer.org também mostra uma linha que confere o hash do instalador antes de executá-lo; copie os comandos de lá para ter o hash atual. Depois confira se funciona:
composer --version
composer.json e composer.lock
O composer init faz algumas perguntas e escreve o composer.json, ou o composer require o cria no primeiro pacote. Um típico:
{
"name": "acme/shop",
"require": {
"php": ">=8.2",
"monolog/monolog": "^3.0",
"vlucas/phpdotenv": "^5.6"
},
"require-dev": {
"phpunit/phpunit": "^11.0"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
requirelista o que o projeto precisa para rodar, incluindo a versão do PHP.require-devlista ferramentas só de desenvolvimento (testes, análise estática).composer require --dev phpunit/phpunitadiciona a ela, ecomposer install --no-deva pula em servidores de produção.autoloaddiz ao Composer onde ficam as suas próprias classes (abaixo).
Ao lado dele, o Composer escreve o composer.lock com a versão exata de cada pacote que instalou, incluindo os pacotes de que os seus pacotes dependem. Faça commit dos dois arquivos. Não faça commit da vendor/: adicione-a ao .gitignore, porque o composer install a reconstrói a partir do arquivo lock.
composer install ou composer update
composer install # install exactly what composer.lock says
composer update # pick the newest allowed versions, rewrite composer.lock
composer update monolog/monolog # update one package only
composer remove monolog/monolog # uninstall and remove from composer.json
composer outdated # list packages with newer versions available
Rode composer install depois de clonar um projeto e em cada deploy: todos recebem as mesmas versões que foram testadas. Rode composer update só quando quiser atualizar, depois teste e faça commit do novo composer.lock. Rodar update num servidor de produção instala versões que ninguém testou.
Restrições de versão: ^ e ~
| Restrição | Permite | Use para |
|---|---|---|
^3.2 | 3.2.0 até 4.0.0, sem incluí-la | A escolha normal: recursos e correções, sem versão principal que quebre |
^0.4 | 0.4.0 até 0.5.0, sem incluí-la | Pacotes antes da 1.0, em que versões menores podem quebrar |
~3.2 | 3.2.0 até 4.0.0, sem incluí-la | O mesmo que ^3.2 |
~3.2.1 | 3.2.1 até 3.3.0, sem incluí-la | Só correções |
3.2.1 | Exatamente 3.2.1 | Raramente; bloqueia correções de segurança |
>=3.2 <3.5 | Um intervalo personalizado | Contornar uma versão quebrada |
composer require vendor/package sem versão escolhe a versão estável mais nova e escreve uma restrição ^ para ela, o que normalmente é o que você quer.
Autoload das suas próprias classes com PSR-4
O PSR-4 é a convenção que liga um namespace a uma pasta: com "App\\": "src/", a classe App\Text\Slug fica em src/Text/Slug.php. Depois de adicionar a seção autoload, rode:
composer dump-autoload
O autoloader do Composer é uma função registrada com spl_autoload_register(), que o PHP chama sempre que o código usa uma classe ainda não carregada. Este bloco escreve dois arquivos de classe e registra um pequeno autoloader PSR-4 próprio, para você ver o mapeamento funcionando. Adicione um terceiro arquivo de classe e use-o.
O autoloader roda uma vez por classe: a segunda chamada a Slug::from() não imprime nenhuma linha autoload:, porque a classe já está carregada. Num projeto real você nunca escreve essa função; o vendor/autoload.php registra a versão do Composer, que também cuida dos pacotes em vendor/. Namespaces são explicados na página sobre namespaces.
Erros comuns
Class "Monolog\Logger" not found. O script não fezrequire 'vendor/autoload.php', ou o caminho está errado. Use__DIR__ . '/vendor/autoload.php'para que o caminho não dependa do diretório atual.- A sua própria classe não é encontrada depois de adicioná-la ao
autoload. Rodecomposer dump-autoloade confira se o caminho do arquivo bate exatamente com o namespace, incluindo maiúsculas e minúsculas:App\Text\Slugprecisa sersrc/Text/Slug.php, e servidores Linux tratamsrc/text/slug.phpcomo outro arquivo. Your requirements could not be resolved to an installable set of packages. Dois pacotes precisam de versões incompatíveis de algo, muitas vezes do próprio PHP. A mensagem lista o conflito;composer why-not vendor/package 2.0explica o que bloqueia uma versão.composernão é reconhecido. O terminal foi aberto antes da instalação, ou a pasta não está no seu PATH. Abra um novo terminal, ou chamephp composer.phardiretamente.
Perguntas frequentes
Qual a diferença entre composer install e composer update?
O composer install instala exatamente as versões registradas no composer.lock, então toda máquina recebe o mesmo código; rode depois de clonar e no deploy. O composer update resolve as versões mais novas permitidas pelo composer.json, instala e reescreve o composer.lock; rode quando você quiser atualizar.
Devo commitar o composer.lock e a pasta vendor?
Faça commit do composer.lock em aplicações, para que todos instalem as mesmas versões. Não faça commit da vendor/: adicione-a ao .gitignore e deixe o composer install recriá-la.
O que significa ^ no composer.json?
^2.3 permite qualquer versão a partir de 2.3.0 até 3.0.0, sem incluí-la: novos recursos e correções, mas nenhuma nova versão principal que possa quebrar o seu código. ~2.3 significa o mesmo, e ~2.3.1 permite só 2.3.x a partir de 2.3.1.
Como faço autoload das minhas próprias classes com o Composer?
Adicione "autoload": {"psr-4": {"App\\": "src/"}} ao composer.json, rode composer dump-autoload e faça require 'vendor/autoload.php'. Uma classe App\Mail\Mailer é então carregada de src/Mail/Mailer.php na primeira vez que você a usa.
Como verifico qual versão do Composer está instalada?
Rode composer --version. Para atualizar o próprio Composer, rode composer self-update, ou atualize pelo gerenciador de pacotes com que você o instalou, como brew upgrade composer.