# PSR standardi PHP-FIG-a

> PSR standardi PHP-FIG-a: svi PSR-ovi od 0 do 22 sa statusom, najvažniji u praksi i što PSR-3, PSR-4 i PSR-7 znače za sigurnost.

Izvor: https://phpsos.de/hr/php/psr-standards/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** PSR-ovi (PHP Standards Recommendations) standardi su PHP-FIG-a, skupine uglednih PHP projekata. Određuju zajednička pravila i sučelja, primjerice PSR-4 za autoloading, PSR-3 za loggere, PSR-7 za HTTP poruke i PSR-11 za containere. Svaki PSR ima status: prihvaćen, nacrt, zastario ili napušten. PSR-ovi kod čine zamjenjivijim i lakšim za provjeru, ali ne zatvaraju ranjivosti u PHP interpreteru poput PHP2Shella.

## Što su PHP-FIG i PSR-ovi?

PHP-FIG označava PHP Framework Interop Group. Skupina svoj cilj sama opisuje kao unapređivanje PHP-a suradnjom i standardima. Iza PSR-a dakle ne stoji proizvođač, nego dogovor među projektima koji svoj softver žele održati međusobno kompatibilnim.

Za donositelje odluka korist je opipljiva: ako se aplikacija drži PSR sučelja, biblioteku za zapisivanje moguće je zamijeniti bez diranja cijelog koda. To smanjuje ovisnost o pojedinim paketima i pružateljima usluga.

## Put jednog PSR-a: od Pre-Drafta do Accepteda

Statut PHP-FIG-a opisuje čvrst slijed:

1. **Pre-Draft:** Utvrđuje se postoji li dovoljno interesa. Formira se radna skupina, a nakon uspješnog glasanja prijedlog dobiva PSR broj.
2. **Draft:** Prijedlog se razrađuje, alternative i obrazloženja unose se u meta-dokument.
3. **Review:** Zajednica testira specifikaciju probnim implementacijama, najmanje četiri tjedna i dok ne postoje dvije neovisne, održive izvedbe.
4. **Accepted:** Nakon uspješnog glasanja PSR je prihvaćen; radna se skupina raspušta.

Uz to postoje još dva stanja. **Deprecated** znači: prihvaćen, ali se više ne preporučuje, najčešće jer ga zamjenjuje noviji standard. **Abandoned** znači: na njemu se više ne radi.

## Svi PSR-ovi sa statusom

Stanje prema pregledu PHP-FIG-a u trenutku nastanka ove stranice:

| Br. | Naslov | Status |
|---|---|---|
| PSR-0 | Autoloading Standard | zastario |
| PSR-1 | Basic Coding Standard | prihvaćen |
| PSR-2 | Coding Style Guide | zastario |
| PSR-3 | Logger Interface | prihvaćen |
| PSR-4 | Autoloading Standard | prihvaćen |
| PSR-5 | PHPDoc Standard | nacrt |
| PSR-6 | Caching Interface | prihvaćen |
| PSR-7 | HTTP Message Interface | prihvaćen |
| PSR-8 | Huggable Interface | napušten |
| PSR-9 | Security Advisories | napušten |
| PSR-10 | Security Reporting Process | napušten |
| PSR-11 | Container Interface | prihvaćen |
| PSR-12 | Extended Coding Style Guide | prihvaćen |
| PSR-13 | Hypermedia Links | prihvaćen |
| PSR-14 | Event Dispatcher | prihvaćen |
| PSR-15 | HTTP Handlers | prihvaćen |
| PSR-16 | Simple Cache | prihvaćen |
| PSR-17 | HTTP Factories | prihvaćen |
| PSR-18 | HTTP Client | prihvaćen |
| PSR-19 | PHPDoc tags | nacrt |
| PSR-20 | Clock | prihvaćen |
| PSR-21 | Internationalization | nacrt |
| PSR-22 | Application Tracing | nacrt |

## Najvažniji PSR-ovi za praksu

- **PSR-4 (autoloading):** preslikava nazive klasa na putanje datoteka i temelj je Composerova autoloadera. Pojedinosti na stranici [Namespaceovi i autoloading](https://phpsos.de/hr/php/namespaces-autoloading/).
- **PSR-1 i PER Coding Style:** zajednička pravila za pisanje i oblikovanje. PER Coding Style prema PHP-FIG-u proširuje i zamjenjuje PSR-12 te pretpostavlja PSR-1.
- **PSR-3 (logger):** jedinstveno sučelje loggera u namespaceu `Psr\Log` s osam razina od `emergency` do `debug`.
- **PSR-7, PSR-15, PSR-17, PSR-18 (HTTP):** sučelja za zahtjeve i odgovore, middleware, tvornice i HTTP klijente. Mnogi [PHP frameworci](https://phpsos.de/hr/php/php-frameworks/) na njima se temelje ili nude mostove.
- **PSR-11 (container):** zajedničko sučelje za dependency injection containere.
- **PSR-6 i PSR-16 (cache):** dva sučelja za privremenu pohranu, jedno opširno i jedno jednostavno.
- **PSR-14 i PSR-20 (događaji, sat):** zajednička sučelja za događaje i za trenutačno vrijeme. Zamjenjiv sat kod ovisan o vremenu, primjerice istek tokena, čini dobro provjerljivim.

Brojevi, usput, ništa ne govore o važnosti. Dodjeljuju se pri ulasku u fazu nacrta, zato zastarjeli i napušteni prijedlozi stoje među važnim, prihvaćenim standardima.

```php
<?php
use Psr\Log\LoggerInterface;

final class Bestellimport
{
    public function __construct(private LoggerInterface $log) {}

    public function importieren(string $datei): void
    {
        try {
            // ... obrada datoteke ...
        } catch (\Throwable $e) {
            $this->log->error('Import von {datei} fehlgeschlagen', [
                'datei'     => basename($datei),
                'exception' => $e,
            ]);
        }
    }
}
```

## Što PSR-ovi imaju sa sigurnošću

Nekoliko standarda izravno dotiče sigurnost. PSR-3 određuje da se iznimke u kontekstu predaju pod ključem `exception` te da se rezervirana mjesta poput `{datei}` zamjenjuju iz konteksta. Vrijednosti se pritom ne smiju unaprijed maskirati jer logger ne zna gdje će se kasnije prikazivati. Tko zapisnike prikazuje u web-sučelju, mora ih maskirati ondje. Više u članku [Sigurno zapisivanje](https://phpsos.de/hr/blog/sicher-loggen-php/).

PSR-7 opisuje HTTP poruke kao nepromjenjive objekte i pomoću `UploadedFileInterface::moveTo()` nudi jedinstven put za spremanje učitanih datoteka. Specifikacija zahtijeva da je izvorna datoteka nakon toga uklonjena. Provjera vrste datoteke i odredišta ostaje zadaća aplikacije.

Vrijedi istaknuti da su PSR-9 (Security Advisories) i PSR-10 (Security Reporting Process) napušteni. Zajedničkog standarda za sigurnosne obavijesti tako nema; svaki projekt to uređuje sam. Kako sâm PHP projekt postupa s ranjivostima, opisuje stranica [Kako PHP projekt postupa sa sigurnosnim ranjivostima](https://phpsos.de/hr/php/php-sicherheitsprozess/).

Protiv PHP2Shella standardi ne pomažu: ranjivosti CVE-2026-109618 i CVE-2026-109619 nalaze se u interpreteru. Obvezni su ažuriranje na PHP 8.5.12, 8.4.27, 8.3.36 ili 8.2.35 i ponovno pokretanje svih PHP procesa.

## Kako PHP SOS konkretno pomaže?

- Provjeravamo kako Vaša aplikacija zapisuje i osiguravamo da iznimke završavaju u zapisniku, ali ne i pristupni podaci ili oznake sesija.
- Procjenjujemo kako su izvedeni upload i HTTP obrada, i kad se odvijaju preko PSR-7 biblioteka.
- Vlastite razvoje istražujemo u okviru [sigurnosnog audita i penetracijskog testa](https://phpsos.de/hr/leistungen/sicherheitsaudit-penetrationstest/).
- Instaliramo PHP ažuriranja, ponovno pokrećemo sve workere i dokumentiramo stanje.


## Česta pitanja

**Što znači PSR?**  
PSR označava PHP Standards Recommendation. Preporuke izrađuje i usklađuje PHP-FIG, PHP Framework Interop Group. Dobrovoljne su, ali ih provodi mnogo frameworka i biblioteka.

**Vrijedi li PSR-12 još?**  
PSR-12 u PHP-FIG-u i dalje vodi status prihvaćenog. PHP-FIG je ipak objavio nasljednika, PER Coding Style, koji prema vlastitim riječima proširuje i zamjenjuje PSR-12. Trenutačna je ondje verzija 3.1.

**Postoji li PSR za sigurnosne obavijesti?**  
Postojala su dva prijedloga: PSR-9 za sigurnosne obavijesti (security advisories) i PSR-10 za postupak prijave sigurnosnih ranjivosti. Oba su u PHP-FIG-u vođena kao napuštena. Projekti zato sami uređuju svoj postupak prijave.

**Mora li moj projekt poštovati PSR-ove?**  
Ne, nema obveze. PSR-4 za autoloading te sučelja poput PSR-3 ili PSR-7 ipak znatno olakšavaju uporabu stranih paketa i promjenu pružatelja usluga.

## Izvori

- [PHP-FIG: Pregled PSR-ova](https://www.php-fig.org/psr/)
- [PHP-FIG: PSR tijek rada](https://www.php-fig.org/bylaws/psr-workflow/)
- [PHP-FIG: PER Coding Style](https://www.php-fig.org/per/coding-style/)
- [PHP-FIG: PSR-3 Logger Interface](https://www.php-fig.org/psr/psr-3/)
- [PHP-FIG: PSR-7 HTTP Message Interface](https://www.php-fig.org/psr/psr-7/)
