Menu

PHP Composer: Pakete installieren und Klassen autoloaden

Composer ist der Paketmanager von PHP: composer require vendor/package lädt eine Bibliothek nach vendor/, trägt sie in composer.json ein, und require 'vendor/autoload.php' lädt sie. Hier: Composer installieren, composer.json, Versionsangaben, install vs update und PSR-4-Autoloading für deine eigenen Klassen.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

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/"
        }
    }
}
  • require listet auf, was das Projekt zum Laufen braucht, einschließlich der PHP-Version.
  • require-dev listet Werkzeuge nur für die Entwicklung auf (Tests, statische Analyse). composer require --dev phpunit/phpunit fügt dort etwas hinzu, und composer install --no-dev überspringt es auf Produktionsservern.
  • autoload sagt 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 ~

AngabeErlaubtVerwenden für
^3.23.2.0 bis ausschließlich 4.0.0Die normale Wahl: Features und Fixes, keine brechende Hauptversion
^0.40.4.0 bis ausschließlich 0.5.0Pakete vor 1.0, bei denen Nebenversionen brechen können
~3.23.2.0 bis ausschließlich 4.0.0Dasselbe wie ^3.2
~3.2.13.2.1 bis ausschließlich 3.3.0Nur Fixes
3.2.1Genau 3.2.1Selten; es blockiert Sicherheitsfixes
>=3.2 <3.5Ein eigener BereichUm 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 hat require '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 autoload nicht gefunden. Führe composer dump-autoload aus und prüfe, dass der Dateipfad genau zum Namespace passt, einschließlich Groß- und Kleinschreibung: App\Text\Slug muss src/Text/Slug.php sein, und Linux-Server behandeln src/text/slug.php als 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.0 erklärt, was eine Version blockiert.
  • composer wird nicht erkannt. Das Terminal wurde vor der Installation geöffnet, oder der Ordner steht nicht im PATH. Öffne ein neues Terminal oder ruf php composer.phar direkt 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.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S