# PHP-FIG PSR standarti

> PHP-FIG PSR standarti: visi PSR no 0 līdz 22 ar statusu, svarīgākie standarti ikdienas praksei un tas, ko PSR-3, PSR-4 un PSR-7 nozīmē drošībai.

Avots: https://phpsos.de/lv/php/psr-standards/  
Aktuāls uz: 25.10.2026  
Pakalpojuma sniedzējs: PHP SOS, PHP ārkārtas palīdzība un serveru drošība. Tūlītēja palīdzība pa WhatsApp: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20nepiecie%C5%A1ama%20pal%C4%ABdz%C4%ABba%20ar%20m%C5%ABsu%20PHP%20serveri.%20Uz%C5%86%C4%93mums%3A%20%E2%80%A6%20Vietne%3A%20%E2%80%A6

**Īsi:** PSR (PHP Standards Recommendations) ir PHP-FIG standarti, kuras biedri ir iedibināti PHP projekti. Tie nosaka kopīgus noteikumus un saskarnes, piemēram, PSR-4 autoloading, PSR-3 reģistrētājiem (logger), PSR-7 HTTP ziņojumiem un PSR-11 konteineriem. Katram PSR ir statuss: pieņemts, melnraksts, novecojis vai pamests. PSR padara kodu viegāk nomaināmu un pārbaudāmu, bet neaizver ievainojamības PHP interpretatorā, piemēram, PHP2Shell.

## Kas ir PHP-FIG un kas ir PSR?

PHP-FIG ir PHP Framework Interop Group. Grupa savu mērķi pati apraksta kā PHP virzīšanu uz priekšu ar sadarbību un standartiem. Aiz PSR tātad nestāv ražotājs, bet projektu vienošanās, kas vēlas saglabāt savu programmatūru savstarpēji saderīgu.

Lēmumu pieņēmējiem ieguvums ir taustāms: ja lietojumprogramma ievēro PSR saskarnes, reģistrēšanas bibliotēku var nomainīt, neskarot visu kodu. Tas mazina atkarību no atsevišķām pakotnēm un pakalpojumu sniedzējiem.

## PSR ceļš: no Pre-Draft līdz Accepted

PHP-FIG statūti apraksta noteiktu norisi:

1. **Pre-Draft:** tiek noskaidrots, vai ir pietiekama interese. Izveidojas darba grupa, pēc veiksmīgas balsošanas priekšlikums saņem PSR numuru.
2. **Draft:** priekšlikumu izstrādā, alternatīvas un pamatojumi nonāk meta dokumentā.
3. **Review:** kopiena testē specifikāciju ar izmēģinājuma implementācijām vismaz četras nedēļas un līdz ir pieejamas divas neatkarīgas, dzīvotspējīgas ievirzes.
4. **Accepted:** pēc veiksmīgas balsošanas PSR ir pieņemts; darba grupa izkūst.

Bez tam ir vēl divi stāvokļi. **Deprecated** nozīmē: pieņemts, bet vairs nav ieteicams, parasti tāpēc, ka to aizstāj jaunāks standarts. **Abandoned** nozīmē: pie tā vairs nestrādā.

## Visi PSR ar statusu

Stāvoklis saskaņā ar PHP-FIG pārskatu šīs lapas sagatavošanas brīdī:

| Nr. | Nosaukums | Statuss |
|---|---|---|
| PSR-0 | Autoloading Standard | novecojis |
| PSR-1 | Basic Coding Standard | pieņemts |
| PSR-2 | Coding Style Guide | novecojis |
| PSR-3 | Logger Interface | pieņemts |
| PSR-4 | Autoloading Standard | pieņemts |
| PSR-5 | PHPDoc Standard | melnraksts |
| PSR-6 | Caching Interface | pieņemts |
| PSR-7 | HTTP Message Interface | pieņemts |
| PSR-8 | Huggable Interface | pamests |
| PSR-9 | Security Advisories | pamests |
| PSR-10 | Security Reporting Process | pamests |
| PSR-11 | Container Interface | pieņemts |
| PSR-12 | Extended Coding Style Guide | pieņemts |
| PSR-13 | Hypermedia Links | pieņemts |
| PSR-14 | Event Dispatcher | pieņemts |
| PSR-15 | HTTP Handlers | pieņemts |
| PSR-16 | Simple Cache | pieņemts |
| PSR-17 | HTTP Factories | pieņemts |
| PSR-18 | HTTP Client | pieņemts |
| PSR-19 | PHPDoc tags | melnraksts |
| PSR-20 | Clock | pieņemts |
| PSR-21 | Internationalization | melnraksts |
| PSR-22 | Application Tracing | melnraksts |

## Svarīgākie PSR praksei

- **PSR-4 (autoloading):** attēlo klašu nosaukumus faila ceļos un ir Composer autoloader pamats. Detaļas lapā [Nosaukumvietas un autoloading](https://phpsos.de/lv/php/namespaces-autoloading/).
- **PSR-1 un PER Coding Style:** kopīgi noteikumi rakstībai un formatēšanai. PER Coding Style saskaņā ar PHP-FIG papildina un aizstāj PSR-12 un paredz PSR-1.
- **PSR-3 (logger):** vienota reģistrētāja saskarne nosaukumvietā `Psr\Log` ar astoņiem līmeņiem no `emergency` līdz `debug`.
- **PSR-7, PSR-15, PSR-17, PSR-18 (HTTP):** saskarnes pieprasījumiem un atbildēm, starpprogrammatūrai (middleware), rūpnīcām un HTTP klientiem. Daudzi [PHP ietvari](https://phpsos.de/lv/php/php-frameworks/) uz tām balstās vai piedāvā tiltus.
- **PSR-11 (konteiners):** kopīga saskarne Dependency Injection konteineriem.
- **PSR-6 un PSR-16 (kešatmiņa):** divas saskarnes starpatmiņai, plašāka un vienkārša.
- **PSR-14 un PSR-20 (notikumi, pulkstenis):** kopīgas saskarnes notikumiem un pašreizējam laikam. Nomaināms pulkstenis laikatkarīgu kodu, piemēram, tokenu derīguma beigšanos, padara labi testējamu.

Numuri, starp citu, neko nesaka par nozīmīgumu. Tos piešķir, ieejot melnraksta fāzē, tāpēc novecojuši un pamesti priekšlikumi atrodas starp svarīgiem, pieņemtiem standartiem.

```php
<?php
use Psr\Log\LoggerInterface;

final class Bestellimport
{
    public function __construct(private LoggerInterface $log) {}

    public function importieren(string $datei): void
    {
        try {
            // ... apstrādāt failu ...
        } catch (\Throwable $e) {
            $this->log->error('Import von {datei} fehlgeschlagen', [
                'datei'     => basename($datei),
                'exception' => $e,
            ]);
        }
    }
}
```

## Kāda ir PSR saistība ar drošību

Vairāki standarti drošību skar tieši. PSR-3 nosaka, ka izņēmumi tiek nodoti zem atslēgas `exception` kontekstā un ka vietturi, piemēram, `{datei}`, tiek aizstāti no konteksta. Vērtības tajā pašā laikā nedrīkst maskēt iepriekš, jo reģistrētājs nezina, kur tās vēlāk tiks rādītas. Kas žurnālus rāda tīmekļa saskarnē, tam maskēšana jāveic tur. Vairāk rakstā [Droša reģistrēšana](https://phpsos.de/lv/blog/sicher-loggen-php/).

PSR-7 apraksta HTTP ziņojumus kā nemaināmus objektus un ar `UploadedFileInterface::moveTo()` piedāvā vienotu veidu, kā saglabāt augšupielādētos failus. Specifikācija pieprasa, ka pēc tam oriģinālais fails ir noņemts. Faila tipa un mērķa vietas pārbaude paliek lietojumprogrammas uzdevums.

Ievērības cienīgi, ka PSR-9 (Security Advisories) un PSR-10 (Security Reporting Process) ir pamesti. Vienota standarta drošības ziņojumiem tātad nav; katrs projekts to nosaka pats. Kā ar ievainojamībām rīkojas pats PHP projekts, apraksta lapa [Kā PHP projekts apstrādā drošības ievainojamības](https://phpsos.de/lv/php/php-sicherheitsprozess/).

Pret PHP2Shell standarti nepalīdz: ievainojamības CVE-2026-109618 un CVE-2026-109619 atrodas interpretatorā. Obligāts ir atjauninājums uz PHP 8.5.12, 8.4.27, 8.3.36 vai 8.2.35 un visu PHP procesu pārstartēšana.

## Kā PHP SOS palīdz konkrēti?

- Mēs pārbaudām, kā jūsu lietojumprogramma reģistrē notikumus, un nodrošinām, ka izņēmumi nonāk žurnālā, bet pieejas dati vai sesiju identifikatori ne.
- Mēs izvērtējam, kā īstenota augšupielāžu un HTTP apstrāde, arī tad, ja tā notiek caur PSR-7 bibliotēkām.
- Mēs izpētām pašrakstītos risinājumus [drošības audita un penetrācijas testa](https://phpsos.de/lv/leistungen/sicherheitsaudit-penetrationstest/) ietvaros.
- Mēs ieviešam PHP atjauninājumus, pārstartējam visus darbprocesus un dokumentējam stāvokli.


## Biežāk uzdotie jautājumi

**Ko nozīmē PSR?**  
PSR ir PHP Standards Recommendation. Ieteikumus izstrādā un saskaņo PHP-FIG, PHP Framework Interop Group. Tie ir brīvprātīgi, taču tos ievieš daudzi ietvari un bibliotēkas.

**Vai PSR-12 joprojām ir spēkā?**  
PHP-FIG PSR-12 joprojām uzskaita kā pieņemtu. Tomēr PHP-FIG ir publicējusi pēcteci PER Coding Style, kas pēc paša apgalvojuma PSR-12 papildina un aizstāj. Pašlaik tur ir versija 3.1.

**Vai ir PSR par drošības ziņojumiem?**  
Bija divi priekšlikumi: PSR-9 par Security Advisories un PSR-10 par ievainojamību ziņošanas procesu. PHP-FIG tos abus uzskaita kā pamestus. Projekti ziņošanas procesu tāpēc nosaka paši.

**Vai manam projektam jāievēro PSR?**  
Nē, pienākuma nav. Tomēr PSR-4 autoloading un saskarnes, piemēram, PSR-3 vai PSR-7, ievērojami atvieglo svešu pakotņu izmantošanu un pakalpojumu sniedzēju maiņu.

## Avoti

- [PHP-FIG: PSR pārskats](https://www.php-fig.org/psr/)
- [PHP-FIG: PSR darbplūsma](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/)
