# PHP 8.0–8.5: svarbiausios naujovės

> PHP 8 naujovės nuo 8.0 iki 8.5: svarbiausios kiekvienos versijos funkcijos, kodo pavyzdžiai, pasenimo pranešimai su atnaujinimo rizika ir kas svarbu saugumui.

Šaltinis: https://phpsos.de/lt/php/php-8-neuerungen/  
Būsena: 2026-10-25  
Teikėjas: PHP SOS, PHP avarinė pagalba ir serverio sauga. Skubi pagalba per „WhatsApp“: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20reikia%20pagalbos%20su%20m%C5%ABs%C5%B3%20PHP%20serveriu.%20%C4%AEmon%C4%97%3A%20%E2%80%A6%20Svetain%C4%97%3A%20%E2%80%A6

**Trumpai:** PHP 8.0 (2020 m. lapkritis) atnešė pavadintus argumentus, atributus, sąjungos tipus, `match`, nullsafe operatorių ir JIT kompiliatorių. Po to sekė kasmetiniai leidimai: 8.1 su enum ir Fibers, 8.2 su readonly klasėmis, 8.3 su tipizuotomis klasių konstantomis, 8.4 su Property Hooks ir 8.5 su Pipe operatoriumi ir URI plėtiniu. Kiekviena versija ir ką nors sensta. Todėl atnaujinant svarbūs testai, o saugumui svarbiausia eksploatuoti palaikomą šaką su aktualia pataisų būsena.

## PHP 8 naujovių apžvalga

Lentelėje apibendrinti pagrindiniai php.net leidimų puslapių punktai. Pirmojo išleidimo datos pagal php.net.

| Versija | Išleista | Svarbiausios naujovės | Pasenimo pranešimų ir sutrikimų pasirinkimas |
|---|---|---|---|
| 8.0 | 2020-11-26 | pavadinti argumentai, atributai, Constructor Property Promotion, sąjungos tipai, `match`, `?->`, JIT | `0 == 'foobar'` dabar yra `false`, tipų klaidos vietoj įspėjimų |
| 8.1 | 2021-11-25 | enum, readonly savybės, First-Class-Callables `strlen(...)`, `new` inicializatoriuose, sankirtos tipai, `never`, Fibers | – |
| 8.2 | 2022-12-08 | readonly klasės, DNF tipai, `null`/`false`/`true` kaip tipai, Random plėtinys, konstantos savybių rinkiniuose (traits), `#[\SensitiveParameter]` | dinaminės savybės paskelbtos pasenusiomis |
| 8.3 | 2023-11-23 | tipizuotos klasių konstantos, `#[\Override]`, `json_validate()`, `mb_str_pad()`, `php -l` keliems failams | – |
| 8.4 | 2024-11-21 | Property Hooks, asimetrinis matomumas, `#[\Deprecated]`, nauja DOM API su HTML5, `BcMath\Number`, `array_find()`, Lazy Objects | netiesiogiai nullable parametrai paskelbti pasenusiais; IMAP, OCI8, PDO_OCI, pspell perkelti į PECL |
| 8.5 | 2025-11-20 | Pipe operatorius, URI plėtinys, Clone With, `#[\NoDiscard]`, `array_first()`/`array_last()` | atvirkštinių kabučių operatorius paskelbtas pasenusiu, `disable_classes` pašalintas |

## PHP 8.0 ir 8.1: didysis žingsnis

PHP 8.0 kalbą padarė juntamai griežtesnę ir išraiškingesnę. Pasak leidimo puslapio, vidinės funkcijos dabar nuosekliai meta `TypeError` ar `ValueError`, užuot tik rodžiusios įspėjimus. Skaičių ir eilučių palyginimai vadovaujasi tvarkingesnėmis taisyklėmis.

```php
<?php
// PHP 8.0: match lygina griežtai ir jam nereikia break
$status = 404;
echo match (true) {
    $status >= 500 => 'Serverfehler',
    $status >= 400 => 'Anfragefehler',
    default        => 'in Ordnung',
};

// PHP 8.0: nullsafe operatorius
$land = $bestellung?->kunde?->adresse?->land;
```

PHP 8.1 atnešė enum, t. y. išvardijimo tipus su fiksuotomis reikšmėmis, ir readonly savybes, kurias galima nustatyti tik vieną kartą:

```php
<?php
enum Rolle: string {
    case Leser = 'leser';
    case Redakteur = 'redakteur';
    case Admin = 'admin';
}

final class Benutzer {
    public function __construct(
        public readonly string $name,
        public readonly Rolle $rolle,
    ) {}
}

$b = new Benutzer('Erika', Rolle::from('redakteur'));
```

`Rolle::from()` esant nežinomoms reikšmėms meta klaidą. Tai neleidžia savavališkoms eilutėms iš formų prasmukti kaip rolėms. Kam vietoj klaidos reikia tuščios reikšmės, naudoja `Rolle::tryFrom()`, kuri esant nežinomoms reikšmėms grąžina `null`.

8.1 taip pat nauji Fibers, nuolatinės eigos pagrindas, ant kurio kuriamos asinchroninio apdorojimo bibliotekos. Įprastoje svetainės eksploatacijoje tai mažai pastebima, o šiuolaikiniuose karkasuose ir eilėse jau taip.

## PHP 8.2 ir 8.3: sutvarkymas ir apsauga

PHP 8.2 paskelbė dinamines savybes pasenusiomis. Kas objektui priskiria nedeklaruotą savybę, gauna pranešimą; su `#[\AllowDynamicProperties]` tai galima leisti atskiroms klasėms. Todėl senesni papildiniai žurnale dažnai sukelia daug pranešimų.

Saugumui įdomūs naujasis Random plėtinys, kurio numatytasis atsitiktinumo generatorius, pasak leidimo puslapio, naudoja kriptografiškai saugų atsitiktinių skaičių generatorių, ir atributas `#[\SensitiveParameter]`, kuris stack trace paslepia tokias reikšmes kaip slaptažodžiai. Daugiau apie saugias atsitiktines reikšmes skyriuje [Saugūs atsitiktiniai skaičiai ir žetonai PHP](https://phpsos.de/lt/blog/sichere-tokens-php/).

PHP 8.3 pridėjo tipizuotas klasių konstantas, atributą `#[\Override]` nuo rašybos klaidų perrašant metodus ir `json_validate()`, kuri tikrina JSON jo visiškai nedekoduodama.

## PHP 8.4 ir 8.5: šiuolaikinės kalbos priemonės

PHP 8.4 įvedė Property Hooks, t. y. logiką tiesiai savybėse, ir asimetrinį matomumą, pavyzdžiui, `public private(set)`. Be to, atsirado nauja DOM API su HTML5 palaikymu ir funkcijos, tokios kaip `array_find()`, `array_any()` ir `array_all()`. Pasak leidimo puslapio, plėtiniai IMAP, OCI8, PDO_OCI ir pspell iš branduolio perkelti į PECL. Programoms, kurios, pavyzdžiui, naudoja IMAP, tuomet reikia atskiro paketo.

PHP 8.5 atnešė Pipe operatorių, kuris sujungia iškvietimus iš kairės į dešinę:

```php
<?php
$slug = '  Neue Produkte 2026  '
    |> trim(...)
    |> strtolower(...)
    |> (fn(string $s): string => str_replace(' ', '-', $s));
// Rezultatas: "neue-produkte-2026"
```

Naujas ir URI plėtinys, kuris adresus išskaido pagal RFC 3986 ir WHATWG URL standartą. Saugumui tai svarbu, nes nevienodai išanalizuoti URL yra žinoma apeitų patikrų priežastis. Atvirkštinių kabučių operatorius kaip `shell_exec()` trumpinys paskelbtas pasenusiu, nustatymas `disable_classes` pašalintas. Kas jį naudojo, turėtų pritaikyti savo sutvirtinimą.

## Naujovės, atnaujinimai ir PHP2Shell

Naujos kalbos funkcijos interpretatoriaus spragų neuždaro. Nuo PHP2Shell padeda tik atitinkamos šakos aktuali pataisų būsena: 8.5.12, 8.4.27, 8.3.36 ar 8.2.35. PHP 8.1 ir 8.0 oficialių atnaujinimų nebėra. Kas ten įstrigo, turi atnaujinti, ir čia naujovės padeda mažai, o sutrikimai labai.

Saugus atnaujinimo kelias penkiais žingsniais:

1. Nustatykite tikslinę versiją, atitinkančią gamintojo sistemos reikalavimus ir [leidimų ciklą](https://phpsos.de/lt/php/release-zyklus/).
2. Priklausomybes per Composer ir papildinius perkelkite į suderinamas būsenas.
3. Kodą patikrinkite su statine analize ir testais pagal tikslinę versiją.
4. Išbandykite bandymų aplinkoje su gamybinių duomenų kopija, žurnalus išanalizuokite dėl pasenimo pranešimų.
5. Perjunkite, iš naujo paleiskite visus PHP procesus ir dokumentuokite būseną.

Pagrindus apie tipus pateikia [PHP tipų sistema](https://phpsos.de/lt/php/typsystem/).

## Kaip PHP SOS padeda konkrečiai?

- **Suderinamumo patikra:** analizuojame jūsų kodą ir plėtinius dėl sutrikimų tikslinėje versijoje.
- **Atnaujinimo vykdymas:** per [migraciją į palaikomą PHP versiją](https://phpsos.de/lt/leistungen/php-migration-legacy/) išbandytai pakeliame programas.
- **Sutvirtinimo pritaikymas:** pašalintus nustatymus, tokius kaip `disable_classes`, keičiame veiksmingomis alternatyvomis.
- **Pataisų būsenos palaikymas:** po atnaujinimo laikome šaką aktualią ir įrodome kiekvieną paleidimą iš naujo.


## Dažni klausimai

**Kurią PHP 8 versiją šiandien reikėtų naudoti?**  
Naujiems projektams PHP 8.4 ar 8.5, nes jos palaikomos ilgiausiai: 8.4 iki 2028 m. pabaigos, 8.5 iki 2029 m. pabaigos. Lemia tai, ką jūsų programa palaiko pagal gamintojo sistemos reikalavimus. PHP 8.2 baigiasi 2026 m. gruodžio 31 d.

**Kas dažniausiai sugenda pereinant nuo PHP 7.4 prie PHP 8?**  
Dažnai tai griežtesnės tipų patikros: vidinės funkcijos PHP 8 meta TypeError ar ValueError, užuot tik rodžiusios įspėjimus. Krinta į akis ir pakitę skaičių bei eilučių palyginimai. Statinė analizė ir testai didžiąją dalį atskleidžia iš anksto.

**Ar JIT pagreitins mano svetainę?**  
Dažniausiai vos pastebimai. Pasak PHP 8.0 leidimo puslapio, tipinių žiniatinklio programų našumas yra maždaug PHP 7.4 lygio, o skaičiavimams imlios užduotys gali gerokai laimėti. Nuo PHP 8.4 JIT pagal numatymą išjungtas.

**Kurios naujovės padeda saugumui?**  
Be kita ko, naujas Random plėtinys PHP 8.2 su kriptografiškai saugiu numatytuoju generatoriumi, atributas SensitiveParameter nuo slaptažodžių stack trace, enum ir readonly savybės aiškesniems duomenims bei nuoseklesnės tipų klaidos nuo PHP 8.0.

## Šaltiniai

- [php.net: PHP 8.0 leidimas](https://www.php.net/releases/8.0/en.php)
- [php.net: PHP 8.4 leidimas](https://www.php.net/releases/8.4/en.php)
- [php.net: PHP 8.5 leidimas](https://www.php.net/releases/8.5/en.php)
- [PHP 8 pakeitimų žurnalas](https://www.php.net/ChangeLog-8.php)
- [php.net: palaikomos versijos](https://www.php.net/supported-versions.php)
