Kurz gesagt: PSRs (PHP Standards Recommendations) sind Standards der PHP-FIG, einer Gruppe etablierter PHP-Projekte. Sie legen gemeinsame Regeln und Schnittstellen fest, etwa PSR-4 für das Autoloading, PSR-3 für Logger, PSR-7 für HTTP-Nachrichten und PSR-11 für Container. Jeder PSR hat einen Status: akzeptiert, Entwurf, veraltet oder aufgegeben. PSRs machen Code austauschbarer und leichter prüfbar, schliessen aber keine Lücken im PHP-Interpreter wie PHP2Shell.
Was ist die PHP-FIG und was sind PSRs?
PHP-FIG steht für PHP Framework Interop Group. Die Gruppe beschreibt ihr Ziel selbst damit, PHP durch Zusammenarbeit und Standards voranzubringen. Hinter einem PSR steht also kein Hersteller, sondern eine Abstimmung zwischen Projekten, die ihre Software untereinander kompatibel halten wollen.
Für Entscheider ist der Nutzen greifbar: Hält sich eine Anwendung an PSR-Schnittstellen, lässt sich etwa die Logging-Bibliothek austauschen, ohne den ganzen Code anzufassen. Das senkt die Abhängigkeit von einzelnen Paketen und Dienstleistern.
Der Weg eines PSR: von Pre-Draft bis Accepted
Die Satzung der PHP-FIG beschreibt einen festen Ablauf:
- Pre-Draft: Es wird geklärt, ob genug Interesse besteht. Eine Arbeitsgruppe bildet sich, nach erfolgreicher Abstimmung erhält der Vorschlag eine PSR-Nummer.
- Draft: Der Vorschlag wird ausgearbeitet, Alternativen und Begründungen kommen in ein Meta-Dokument.
- Review: Die Gemeinschaft testet die Spezifikation mit Probe-Implementierungen, mindestens vier Wochen lang und bis zwei unabhängige, tragfähige Umsetzungen vorliegen.
- Accepted: Nach erfolgreicher Abstimmung ist der PSR angenommen; die Arbeitsgruppe löst sich auf.
Daneben gibt es zwei weitere Zustände. Deprecated bedeutet: angenommen, aber nicht mehr empfohlen, meist weil ein neuerer Standard ihn ersetzt. Abandoned bedeutet: Es wird nicht mehr daran gearbeitet.
Alle PSRs mit Status
Stand laut Übersicht der PHP-FIG zum Zeitpunkt dieser Seite:
| Nr. | Titel | Status |
|---|---|---|
| PSR-0 | Autoloading Standard | veraltet |
| PSR-1 | Basic Coding Standard | akzeptiert |
| PSR-2 | Coding Style Guide | veraltet |
| PSR-3 | Logger Interface | akzeptiert |
| PSR-4 | Autoloading Standard | akzeptiert |
| PSR-5 | PHPDoc Standard | Entwurf |
| PSR-6 | Caching Interface | akzeptiert |
| PSR-7 | HTTP Message Interface | akzeptiert |
| PSR-8 | Huggable Interface | aufgegeben |
| PSR-9 | Security Advisories | aufgegeben |
| PSR-10 | Security Reporting Process | aufgegeben |
| PSR-11 | Container Interface | akzeptiert |
| PSR-12 | Extended Coding Style Guide | akzeptiert |
| PSR-13 | Hypermedia Links | akzeptiert |
| PSR-14 | Event Dispatcher | akzeptiert |
| PSR-15 | HTTP Handlers | akzeptiert |
| PSR-16 | Simple Cache | akzeptiert |
| PSR-17 | HTTP Factories | akzeptiert |
| PSR-18 | HTTP Client | akzeptiert |
| PSR-19 | PHPDoc tags | Entwurf |
| PSR-20 | Clock | akzeptiert |
| PSR-21 | Internationalization | Entwurf |
| PSR-22 | Application Tracing | Entwurf |
Die wichtigsten PSRs für die Praxis
- PSR-4 (Autoloading): bildet Klassennamen auf Dateipfade ab und ist die Grundlage des Composer-Autoloaders. Details auf der Seite Namespaces und Autoloading.
- PSR-1 und PER Coding Style: gemeinsame Regeln für Schreibweise und Formatierung. PER Coding Style erweitert und ersetzt laut PHP-FIG den PSR-12 und setzt PSR-1 voraus.
- PSR-3 (Logger): einheitliche Logger-Schnittstelle im Namespace
Psr\Logmit acht Stufen vonemergencybisdebug. - PSR-7, PSR-15, PSR-17, PSR-18 (HTTP): Schnittstellen für Anfragen und Antworten, Middleware, Fabriken und HTTP-Clients. Viele PHP-Frameworks bauen darauf auf oder bieten Brücken an.
- PSR-11 (Container): gemeinsame Schnittstelle für Dependency-Injection-Container.
- PSR-6 und PSR-16 (Cache): zwei Schnittstellen für Zwischenspeicher, eine ausführliche und eine einfache.
- PSR-14 und PSR-20 (Events, Uhr): gemeinsame Schnittstellen für Ereignisse und für die aktuelle Zeit. Eine austauschbare Uhr macht zeitabhängigen Code, etwa das Ablaufen von Tokens, gut testbar.
Die Nummern sagen übrigens nichts über die Bedeutung aus. Sie werden beim Eintritt in die Entwurfsphase vergeben, deshalb stehen veraltete und aufgegebene Vorschläge zwischen wichtigen, akzeptierten Standards.
<?php
use Psr\Log\LoggerInterface;
final class Bestellimport
{
public function __construct(private LoggerInterface $log) {}
public function importieren(string $datei): void
{
try {
// ... Datei verarbeiten ...
} catch (\Throwable $e) {
$this->log->error('Import von {datei} fehlgeschlagen', [
'datei' => basename($datei),
'exception' => $e,
]);
}
}
}
Was PSRs mit Sicherheit zu tun haben
Mehrere Standards berühren die Sicherheit direkt. PSR-3 legt fest, dass Exceptions unter dem Schlüssel exception im Kontext übergeben werden und Platzhalter wie {datei} aus dem Kontext ersetzt werden. Werte sollen dabei nicht vorab maskiert werden, weil der Logger nicht weiss, wo sie später angezeigt werden. Wer Logs in einer Weboberfläche anzeigt, muss dort maskieren. Mehr dazu im Beitrag Sicher loggen.
PSR-7 beschreibt HTTP-Nachrichten als unveränderliche Objekte und bietet mit UploadedFileInterface::moveTo() einen einheitlichen Weg, hochgeladene Dateien zu speichern. Die Spezifikation verlangt, dass die Originaldatei danach entfernt ist. Die Prüfung von Dateityp und Zielort bleibt Aufgabe der Anwendung.
Bemerkenswert ist, dass PSR-9 (Security Advisories) und PSR-10 (Security Reporting Process) aufgegeben wurden. Einen gemeinsamen Standard für Sicherheitsmeldungen gibt es damit nicht; jedes Projekt regelt das selbst. Wie das PHP-Projekt selbst mit Lücken umgeht, beschreibt die Seite Wie das PHP-Projekt Sicherheitslücken behandelt.
Gegen PHP2Shell helfen Standards nicht: Die Lücken CVE-2026-109618 und CVE-2026-109619 liegen im Interpreter. Pflicht ist das Update auf PHP 8.5.12, 8.4.27, 8.3.36 oder 8.2.35 und der Neustart aller PHP-Prozesse.
Wie hilft PHP SOS konkret?
- Wir prüfen, wie Ihre Anwendung loggt, und stellen sicher, dass Exceptions im Log landen, aber keine Zugangsdaten oder Sitzungskennungen.
- Wir bewerten, wie Upload- und HTTP-Verarbeitung umgesetzt sind, auch wenn sie über PSR-7-Bibliotheken laufen.
- Wir untersuchen Eigenentwicklungen im Rahmen eines Sicherheitsaudits und Penetrationstests.
- Wir spielen PHP-Updates ein, starten alle Worker neu und dokumentieren den Stand.
Häufige Fragen
Was bedeutet PSR?
PSR steht für PHP Standards Recommendation. Die Empfehlungen werden von der PHP-FIG, der PHP Framework Interop Group, erarbeitet und abgestimmt. Sie sind freiwillig, werden aber von vielen Frameworks und Bibliotheken umgesetzt.
Gilt PSR-12 noch?
PSR-12 ist bei der PHP-FIG weiterhin als akzeptiert geführt. Die PHP-FIG hat aber mit PER Coding Style eine Nachfolge veröffentlicht, die PSR-12 laut eigener Aussage erweitert und ersetzt. Aktuell ist dort Version 3.1.
Gibt es einen PSR für Sicherheitsmeldungen?
Es gab zwei Vorschläge, PSR-9 für Security Advisories und PSR-10 für den Prozess zur Meldung von Sicherheitslücken. Beide sind bei der PHP-FIG als aufgegeben geführt. Projekte regeln ihren Meldeprozess deshalb selbst.
Muss mein Projekt PSRs einhalten?
Nein, es gibt keine Pflicht. PSR-4 für das Autoloading und die Schnittstellen wie PSR-3 oder PSR-7 erleichtern aber den Einsatz fremder Pakete und den Wechsel von Dienstleistern deutlich.