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 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
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.
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
$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:
- Nustatykite tikslinę versiją, atitinkančią gamintojo sistemos reikalavimus ir leidimų ciklą.
- Priklausomybes per Composer ir papildinius perkelkite į suderinamas būsenas.
- Kodą patikrinkite su statine analize ir testais pagal tikslinę versiją.
- Išbandykite bandymų aplinkoje su gamybinių duomenų kopija, žurnalus išanalizuokite dėl pasenimo pranešimų.
- Perjunkite, iš naujo paleiskite visus PHP procesus ir dokumentuokite būseną.
Pagrindus apie tipus pateikia PHP tipų sistema.
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ą 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.