Composer è il gestore di pacchetti di PHP. Esegui composer require vendor/package nella cartella del progetto: Composer scarica la libreria in vendor/, la registra in composer.json, e la carichi, insieme a tutto il resto che hai installato, con una sola riga, 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%']);
Nessun include per ogni file: l'autoloader carica Logger, StreamHandler e tutto ciò che usano la prima volta che ciascuna classe serve. I pacchetti arrivano da Packagist, il registro pubblico in cui Composer cerca di default.
Installare Composer
Composer richiede prima PHP sulla tua macchina (vedi installare PHP).
Windows: scarica ed esegui Composer-Setup.exe da getcomposer.org. Trova il tuo php.exe e aggiunge composer al PATH. Apri poi un nuovo terminale.
macOS con Homebrew:
brew install composer
Linux: il pacchetto della tua distribuzione (sudo apt install composer su Debian e Ubuntu) funziona ma spesso è una versione più vecchia. L'installer ufficiale dà quella attuale:
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
La pagina di download su getcomposer.org mostra anche una riga che verifica l'hash dell'installer prima di eseguirlo; copia i comandi da lì per avere l'hash attuale. Poi verifica che funzioni:
composer --version
composer.json e composer.lock
composer init fa qualche domanda e scrive composer.json, oppure composer require lo crea al primo pacchetto. Uno tipico:
{
"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/"
}
}
}
requireelenca ciò che serve al progetto per girare, compresa la versione di PHP.require-develenca gli strumenti solo per lo sviluppo (test, analisi statica).composer require --dev phpunit/phpunitaggiunge lì, ecomposer install --no-devli salta sui server di produzione.autoloaddice a Composer dove si trovano le tue classi (vedi sotto).
Accanto, Composer scrive composer.lock con la versione esatta di ogni pacchetto installato, compresi i pacchetti da cui dipendono i tuoi. Fai il commit di entrambi i file. Non fare il commit di vendor/: aggiungilo a .gitignore, perché composer install lo ricostruisce dal file di lock.
composer install vs 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
Esegui composer install dopo aver clonato un progetto e a ogni deploy: tutti ricevono le stesse versioni che sono state testate. Esegui composer update solo quando intendi aggiornare, poi testa e fai il commit del nuovo composer.lock. Eseguire update su un server di produzione installa versioni che nessuno ha testato.
Vincoli di versione: ^ e ~
| Vincolo | Consente | Usalo per |
|---|---|---|
^3.2 | da 3.2.0 fino a 4.0.0 escluso | La scelta normale: funzionalità e correzioni, nessuna major che rompe |
^0.4 | da 0.4.0 fino a 0.5.0 escluso | Pacchetti prima della 1.0, dove le versioni minor possono rompere |
~3.2 | da 3.2.0 fino a 4.0.0 escluso | Uguale a ^3.2 |
~3.2.1 | da 3.2.1 fino a 3.3.0 escluso | Solo correzioni |
3.2.1 | Esattamente 3.2.1 | Raramente; blocca le correzioni di sicurezza |
>=3.2 <3.5 | Un intervallo personalizzato | Aggirare una release difettosa |
composer require vendor/package senza versione sceglie la release stabile più recente e scrive un vincolo ^ per essa, che di solito è ciò che vuoi.
Autoload delle tue classi con PSR-4
PSR-4 è la convenzione che associa un namespace a una cartella: con "App\\": "src/", la classe App\Text\Slug si trova in src/Text/Slug.php. Dopo aver aggiunto la sezione autoload, esegui:
composer dump-autoload
L'autoloader di Composer è una funzione registrata con spl_autoload_register(), che PHP chiama ogni volta che il codice usa una classe non ancora caricata. Questo blocco scrive due file di classe e registra un suo piccolo autoloader PSR-4, così puoi vedere la mappatura al lavoro. Aggiungi un terzo file di classe e usalo.
L'autoloader viene eseguito una volta per classe: la seconda chiamata a Slug::from() non stampa alcuna riga autoload:, perché la classe è già caricata. In un progetto reale non scrivi mai tu questa funzione; vendor/autoload.php registra la versione di Composer, che gestisce anche i pacchetti in vendor/. I namespace sono trattati nella pagina sui namespace.
Errori comuni
Class "Monolog\Logger" not found. Lo script non ha fattorequire 'vendor/autoload.php', oppure il percorso è sbagliato. Usa__DIR__ . '/vendor/autoload.php'così il percorso non dipende dalla cartella corrente.- La tua classe non viene trovata dopo averla aggiunta ad
autoload. Eseguicomposer dump-autoload, e verifica che il percorso del file corrisponda esattamente al namespace, maiuscole e minuscole comprese:App\Text\Slugdeve esseresrc/Text/Slug.php, e i server Linux trattanosrc/text/slug.phpcome un file diverso. Your requirements could not be resolved to an installable set of packages. Due pacchetti richiedono versioni incompatibili di qualcosa, spesso di PHP stesso. Il messaggio elenca il conflitto;composer why-not vendor/package 2.0spiega cosa blocca una versione.composernon viene riconosciuto. Il terminale era stato aperto prima dell'installazione, oppure la cartella non è nel PATH. Apri un nuovo terminale, oppure chiama direttamentephp composer.phar.
Domande frequenti
Qual è la differenza tra composer install e composer update?
composer install installa esattamente le versioni registrate in composer.lock, così ogni macchina riceve lo stesso codice; eseguilo dopo il clone e al deploy. composer update risolve le versioni più recenti consentite da composer.json, le installa e riscrive composer.lock; eseguilo quando vuoi aggiornare.
Devo fare il commit di composer.lock e della cartella vendor?
Fai il commit di composer.lock per le applicazioni, così tutti installano le stesse versioni. Non fare il commit di vendor/: aggiungilo a .gitignore e lascia che composer install lo ricrei.
Cosa significa ^ in composer.json?
^2.3 consente qualsiasi versione da 2.3.0 fino a 3.0.0 escluso: nuove funzionalità e correzioni, ma nessuna nuova versione major che potrebbe rompere il tuo codice. ~2.3 significa lo stesso, e ~2.3.1 consente solo le 2.3.x a partire da 2.3.1.
Come carico automaticamente le mie classi con Composer?
Aggiungi "autoload": {"psr-4": {"App\\": "src/"}} a composer.json, esegui composer dump-autoload e fai require 'vendor/autoload.php'. Una classe App\Mail\Mailer viene allora caricata da src/Mail/Mailer.php la prima volta che la usi.
Come verifico quale versione di Composer è installata?
Esegui composer --version. Per aggiornare Composer stesso, esegui composer self-update, oppure aggiornalo con il gestore di pacchetti con cui l'hai installato, come brew upgrade composer.