Composer ist der Paketmanager für PHP. Führe composer require vendor/package in deinem Projektordner aus: Composer lädt die Bibliothek nach vendor/, trägt sie in composer.json ein, und du lädst sie, zusammen mit allem anderen, was du installiert hast, mit einer Zeile, 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%']);
Kein include für jede Datei: Der Autoloader lädt Logger, StreamHandler und alles, was sie verwenden, beim ersten Bedarf der jeweiligen Klasse. Pakete kommen von Packagist, dem öffentlichen Verzeichnis, das Composer standardmäßig durchsucht.
Composer installieren
Composer braucht zuerst PHP auf deinem Rechner (siehe PHP installieren).
Windows: Lade Composer-Setup.exe von getcomposer.org herunter und führe es aus. Es findet deine php.exe und fügt composer zum PATH hinzu. Öffne danach ein neues Terminal.
macOS mit Homebrew:
brew install composer
Linux: Das Paket deiner Distribution (sudo apt install composer unter Debian und Ubuntu) funktioniert, ist aber oft ein älteres Release. Der offizielle Installer liefert das aktuelle:
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
Die Download-Seite auf getcomposer.org zeigt außerdem eine Zeile, die den Hash des Installers prüft, bevor er läuft; kopiere die Befehle von dort, um den aktuellen Hash zu bekommen. Prüfe dann, ob es funktioniert:
composer --version
composer.json und composer.lock
composer init stellt ein paar Fragen und schreibt composer.json, oder composer require legt sie beim ersten Paket an. Eine typische Datei:
{
"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/"
}
}
}
requirelistet auf, was das Projekt zum Laufen braucht, einschließlich der PHP-Version.require-devlistet Werkzeuge nur für die Entwicklung auf (Tests, statische Analyse).composer require --dev phpunit/phpunitfügt dort etwas hinzu, undcomposer install --no-devüberspringt es auf Produktionsservern.autoloadsagt Composer, wo deine eigenen Klassen liegen (unten).
Daneben schreibt Composer composer.lock mit der genauen Version jedes installierten Pakets, einschließlich der Pakete, von denen deine Pakete abhängen. Committe beide Dateien. Committe vendor/ nicht: Trag es in .gitignore ein, denn composer install baut es aus der Lock-Datei neu auf.
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
Führe composer install nach dem Klonen eines Projekts und bei jedem Deployment aus: Alle bekommen dieselben Versionen, die getestet wurden. Führe composer update nur aus, wenn du aktualisieren willst, teste dann und committe die neue composer.lock. update auf einem Produktionsserver auszuführen installiert Versionen, die niemand getestet hat.
Versionsangaben: ^ und ~
| Angabe | Erlaubt | Verwenden für |
|---|---|---|
^3.2 | 3.2.0 bis ausschließlich 4.0.0 | Die normale Wahl: Features und Fixes, keine brechende Hauptversion |
^0.4 | 0.4.0 bis ausschließlich 0.5.0 | Pakete vor 1.0, bei denen Nebenversionen brechen können |
~3.2 | 3.2.0 bis ausschließlich 4.0.0 | Dasselbe wie ^3.2 |
~3.2.1 | 3.2.1 bis ausschließlich 3.3.0 | Nur Fixes |
3.2.1 | Genau 3.2.1 | Selten; es blockiert Sicherheitsfixes |
>=3.2 <3.5 | Ein eigener Bereich | Um ein kaputtes Release herumarbeiten |
composer require vendor/package ohne Version wählt das neueste stabile Release und schreibt dafür eine Angabe mit ^, und das ist meist das, was du willst.
Eigene Klassen mit PSR-4 autoloaden
PSR-4 ist die Konvention, die einen Namespace einem Ordner zuordnet: Mit "App\\": "src/" liegt die Klasse App\Text\Slug in src/Text/Slug.php. Nachdem du den Abschnitt autoload hinzugefügt hast, führst du aus:
composer dump-autoload
Der Autoloader von Composer ist eine mit spl_autoload_register() registrierte Funktion, die PHP aufruft, wann immer Code eine Klasse verwendet, die noch nicht geladen ist. Dieser Block schreibt zwei Klassendateien und registriert einen eigenen kleinen PSR-4-Autoloader, damit du die Zuordnung arbeiten siehst. Füge eine dritte Klassendatei hinzu und verwende sie.
Der Autoloader läuft einmal pro Klasse: Der zweite Aufruf von Slug::from() gibt keine Zeile autoload: aus, weil die Klasse schon geladen ist. In einem echten Projekt schreibst du diese Funktion nie selbst; vendor/autoload.php registriert die Version von Composer, die auch die Pakete in vendor/ behandelt. Namespaces behandelt die Seite zu Namespaces.
Typische Fehler
Class "Monolog\Logger" not found. Das Skript hatrequire 'vendor/autoload.php'nicht aufgerufen, oder der Pfad ist falsch. Verwende__DIR__ . '/vendor/autoload.php', damit der Pfad nicht vom aktuellen Verzeichnis abhängt.- Deine eigene Klasse wird nach dem Eintrag in
autoloadnicht gefunden. Führecomposer dump-autoloadaus und prüfe, dass der Dateipfad genau zum Namespace passt, einschließlich Groß- und Kleinschreibung:App\Text\Slugmusssrc/Text/Slug.phpsein, und Linux-Server behandelnsrc/text/slug.phpals andere Datei. Your requirements could not be resolved to an installable set of packages. Zwei Pakete brauchen unvereinbare Versionen von etwas, oft von PHP selbst. Die Meldung listet den Konflikt auf;composer why-not vendor/package 2.0erklärt, was eine Version blockiert.composerwird nicht erkannt. Das Terminal wurde vor der Installation geöffnet, oder der Ordner steht nicht im PATH. Öffne ein neues Terminal oder rufphp composer.phardirekt auf.
Häufig gestellte Fragen
Was ist der Unterschied zwischen composer install und composer update?
composer install installiert genau die Versionen, die in composer.lock stehen, sodass jeder Rechner denselben Code bekommt; führe es nach dem Klonen und beim Deployment aus. composer update ermittelt die neuesten Versionen, die composer.json erlaubt, installiert sie und schreibt composer.lock neu; führe es aus, wenn du bewusst aktualisieren willst.
Sollte ich composer.lock und den Ordner vendor committen?
Committe composer.lock bei Anwendungen, damit alle dieselben Versionen installieren. Committe vendor/ nicht: Trag es in .gitignore ein und lass composer install es neu erzeugen.
Was bedeutet ^ in composer.json?
^2.3 erlaubt jede Version ab 2.3.0 bis ausschließlich 3.0.0: neue Features und Fixes, aber keine neue Hauptversion, die deinen Code kaputtmachen könnte. ~2.3 bedeutet dasselbe, und ~2.3.1 erlaubt nur 2.3.x ab 2.3.1.
Wie autoloade ich meine eigenen Klassen mit Composer?
Füge "autoload": {"psr-4": {"App\\": "src/"}} zu composer.json hinzu, führe composer dump-autoload aus und rufe require 'vendor/autoload.php' auf. Eine Klasse App\Mail\Mailer wird dann beim ersten Gebrauch aus src/Mail/Mailer.php geladen.
Wie prüfe ich, welche Version von Composer installiert ist?
Führe composer --version aus. Um Composer selbst zu aktualisieren, führst du composer self-update aus oder aktualisierst es über den Paketmanager, mit dem du es installiert hast, etwa brew upgrade composer.