Stručne: PSR (PHP Standards Recommendations) sú štandardy PHP-FIG, skupiny etablovaných projektov PHP. Určujú spoločné pravidlá a rozhrania, napríklad PSR-4 pre autoloading, PSR-3 pre loggery, PSR-7 pre správy HTTP a PSR-11 pre kontajnery. Každý PSR má stav: akceptovaný, návrh, zastaraný alebo opustený. PSR robia kód zameniteľnejším a ľahšie kontrolovateľným, ale neuzatvárajú zraniteľnosti v interpreteri PHP, ako PHP2Shell.
Čo je PHP-FIG a čo sú PSR?
PHP-FIG znamená PHP Framework Interop Group. Skupina sama opisuje svoj cieľ ako posúvanie PHP dopredu prostredníctvom spolupráce a štandardov. Za PSR teda nestojí výrobca, ale dohoda medzi projektmi, ktoré chcú svoj softvér udržať navzájom kompatibilný.
Pre rozhodovateľov je prínos hmatateľný: ak sa aplikácia drží rozhraní PSR, dá sa napríklad vymeniť knižnica na zapisovanie logov bez zásahu do celého kódu. To znižuje závislosť od jednotlivých balíkov a dodávateľov.
Cesta PSR: od Pre-Draft po Accepted
Stanovy PHP-FIG opisujú pevný postup:
- Pre-Draft: Zisťuje sa, či je dostatočný záujem. Vytvorí sa pracovná skupina a po úspešnom hlasovaní dostane návrh číslo PSR.
- Draft: Návrh sa vypracúva, alternatívy a odôvodnenia sa dostanú do metadokumentu.
- Review: Komunita testuje špecifikáciu pomocou skúšobných implementácií, najmenej štyri týždne a dovtedy, kým nie sú k dispozícii dve nezávislé, životaschopné implementácie.
- Accepted: Po úspešnom hlasovaní je PSR prijatý; pracovná skupina sa rozpustí.
Okrem toho existujú dva ďalšie stavy. Deprecated znamená: prijatý, ale už sa neodporúča, väčšinou preto, že ho nahradil novší štandard. Abandoned znamená: už sa na ňom nepracuje.
Všetky PSR so stavom
Stav podľa prehľadu PHP-FIG v čase vzniku tejto stránky:
| Č. | Názov | Stav |
|---|---|---|
| PSR-0 | Autoloading Standard | zastaraný |
| PSR-1 | Basic Coding Standard | akceptovaný |
| PSR-2 | Coding Style Guide | zastaraný |
| PSR-3 | Logger Interface | akceptovaný |
| PSR-4 | Autoloading Standard | akceptovaný |
| PSR-5 | PHPDoc Standard | návrh |
| PSR-6 | Caching Interface | akceptovaný |
| PSR-7 | HTTP Message Interface | akceptovaný |
| PSR-8 | Huggable Interface | opustený |
| PSR-9 | Security Advisories | opustený |
| PSR-10 | Security Reporting Process | opustený |
| PSR-11 | Container Interface | akceptovaný |
| PSR-12 | Extended Coding Style Guide | akceptovaný |
| PSR-13 | Hypermedia Links | akceptovaný |
| PSR-14 | Event Dispatcher | akceptovaný |
| PSR-15 | HTTP Handlers | akceptovaný |
| PSR-16 | Simple Cache | akceptovaný |
| PSR-17 | HTTP Factories | akceptovaný |
| PSR-18 | HTTP Client | akceptovaný |
| PSR-19 | PHPDoc tags | návrh |
| PSR-20 | Clock | akceptovaný |
| PSR-21 | Internationalization | návrh |
| PSR-22 | Application Tracing | návrh |
Najdôležitejšie PSR pre prax
- PSR-4 (autoloading): priraďuje názvy tried k cestám súborov a je základom autoloadera Composeru. Podrobnosti na stránke Menné priestory a autoloading.
- PSR-1 a PER Coding Style: spoločné pravidlá pre písanie a formátovanie. PER Coding Style podľa PHP-FIG rozširuje a nahrádza PSR-12 a predpokladá PSR-1.
- PSR-3 (logger): jednotné rozhranie loggera v mennom priestore
Psr\Logs ôsmimi úrovňami odemergencypodebug. - PSR-7, PSR-15, PSR-17, PSR-18 (HTTP): rozhrania pre požiadavky a odpovede, middleware, továrne a klientov HTTP. Mnohé frameworky PHP na nich stoja alebo ponúkajú mosty.
- PSR-11 (kontajner): spoločné rozhranie pre kontajnery dependency injection.
- PSR-6 a PSR-16 (cache): dve rozhrania pre vyrovnávaciu pamäť, podrobné a jednoduché.
- PSR-14 a PSR-20 (udalosti, hodiny): spoločné rozhrania pre udalosti a pre aktuálny čas. Vymeniteľné hodiny robia kód závislý od času, napríklad vypršanie platnosti tokenov, dobre testovateľným.
Čísla mimochodom nič nevypovedajú o dôležitosti. Prideľujú sa pri vstupe do fázy návrhu, preto stoja zastarané a opustené návrhy medzi dôležitými, akceptovanými štandardmi.
<?php
use Psr\Log\LoggerInterface;
final class Bestellimport
{
public function __construct(private LoggerInterface $log) {}
public function importieren(string $datei): void
{
try {
// ... spracovať súbor ...
} catch (\Throwable $e) {
$this->log->error('Import von {datei} fehlgeschlagen', [
'datei' => basename($datei),
'exception' => $e,
]);
}
}
}
Čo majú PSR spoločné s bezpečnosťou
Viaceré štandardy sa bezpečnosti dotýkajú priamo. PSR-3 určuje, že výnimky sa odovzdávajú pod kľúčom exception v kontexte a zástupné znaky ako {datei} sa nahrádzajú z kontextu. Hodnoty pritom nemajú byť vopred maskované, pretože logger nevie, kde sa neskôr zobrazia. Kto zobrazuje logy vo webovom rozhraní, musí maskovať tam. Viac v článku Bezpečné zapisovanie do logov.
PSR-7 opisuje správy HTTP ako nemenné objekty a s UploadedFileInterface::moveTo() ponúka jednotný spôsob ukladania nahraných súborov. Špecifikácia vyžaduje, aby bol pôvodný súbor potom odstránený. Kontrola typu súboru a cieľového miesta zostáva úlohou aplikácie.
Pozoruhodné je, že PSR-9 (Security Advisories) a PSR-10 (Security Reporting Process) boli opustené. Spoločný štandard pre bezpečnostné oznámenia teda neexistuje; každý projekt si ho upravuje sám. Ako so zraniteľnosťami nakladá samotný projekt PHP, opisuje stránka Ako projekt PHP rieši bezpečnostné zraniteľnosti.
Proti PHP2Shell štandardy nepomáhajú: zraniteľnosti CVE-2026-109618 a CVE-2026-109619 sú v interpreteri. Povinná je aktualizácia na PHP 8.5.12, 8.4.27, 8.3.36 alebo 8.2.35 a reštart všetkých procesov PHP.
Ako PHP SOS konkrétne pomáha?
- Kontrolujeme, ako vaša aplikácia zapisuje logy, a zabezpečujeme, aby výnimky skončili v logu, ale nie prístupové údaje ani identifikátory relácií.
- Hodnotíme, ako je implementované spracovanie nahrávania a HTTP, aj keď beží cez knižnice PSR-7.
- Vlastné vývojové diela skúmame v rámci bezpečnostného auditu a penetračného testu.
- Nasadzujeme aktualizácie PHP, reštartujeme všetky workery a dokumentujeme stav.
Časté otázky
Čo znamená PSR?
PSR znamená PHP Standards Recommendation. Odporúčania vypracúva a odsúhlasuje PHP-FIG, PHP Framework Interop Group. Sú dobrovoľné, ale mnohé frameworky a knižnice ich implementujú.
Platí PSR-12 ešte?
PSR-12 je u PHP-FIG naďalej vedený ako akceptovaný. PHP-FIG však zverejnila pod názvom PER Coding Style nástupcu, ktorý podľa vlastného vyjadrenia PSR-12 rozširuje a nahrádza. Aktuálna je tam verzia 3.1.
Existuje PSR pre bezpečnostné oznámenia?
Existovali dva návrhy, PSR-9 pre Security Advisories a PSR-10 pre proces hlásenia bezpečnostných zraniteľností. Oba sú u PHP-FIG vedené ako opustené. Projekty si preto proces hlásenia upravujú samy.
Musí môj projekt dodržiavať PSR?
Nie, povinnosť neexistuje. PSR-4 pre autoloading a rozhrania ako PSR-3 alebo PSR-7 však výrazne uľahčujú nasadenie cudzích balíkov a výmenu dodávateľov.