Īsi: PHP 8.0 (2020. gada novembris) atnesa nosauktus argumentus, atribūtus, apvienojuma tipus (union types), match, nullsafe operatoru un JIT kompilatoru. Pēc tam katru gadu sekoja: 8.1 ar enums un Fibers, 8.2 ar readonly klasēm, 8.3 ar tipizētām klases konstantēm, 8.4 ar property hooks un 8.5 ar pipe operatoru un URI paplašinājumu. Katra versija arī izsludina vecā novecošanu. Jauninājumā tāpēc svarīgi ir testi, bet drošībai galvenais ir izmantot atbalstītu zaru ar aktuālu ielāpu stāvokli.
PHP 8 jaunumi pārskatā
Tabula apkopo galvenos punktus no php.net izlaidumu lapām. Pirmās publicēšanas datumi saskaņā ar php.net.
| Versija | Iznākusi | Svarīgākie jaunumi | Izvēle no novecošanas un pārtraukumiem |
|---|---|---|---|
| 8.0 | 26.11.2020 | nosaukti argumenti, atribūti, Constructor Property Promotion, apvienojuma tipi, match, ?->, JIT |
0 == 'foobar' tagad ir false, tipu kļūdas brīdinājumu vietā |
| 8.1 | 25.11.2021 | enums, readonly īpašības, First-Class-Callables strlen(...), new inicializētājos, krustošanās tipi (intersection types), never, Fibers |
– |
| 8.2 | 08.12.2022 | readonly klases, DNF tipi, null/false/true kā tipi, Random paplašinājums, konstantes traits, #[\SensitiveParameter] |
dinamiskās īpašības izsludinātas par novecojušām |
| 8.3 | 23.11.2023 | tipizētas klases konstantes, #[\Override], json_validate(), mb_str_pad(), php -l vairākiem failiem |
– |
| 8.4 | 21.11.2024 | property hooks, asimetriska redzamība, #[\Deprecated], jauna DOM API ar HTML5, BcMath\Number, array_find(), Lazy Objects |
netieši nullable parametri izsludināti par novecojušiem; IMAP, OCI8, PDO_OCI, pspell uz PECL |
| 8.5 | 20.11.2025 | pipe operators, URI paplašinājums, Clone With, #[\NoDiscard], array_first()/array_last() |
atpakaļatzīmes operators izsludināts par novecojušu, disable_classes noņemts |
PHP 8.0 un 8.1: lielais solis
PHP 8.0 valodu padarīja jūtami stingrāku un izteiksmīgāku. Saskaņā ar izlaiduma lapu iekšējās funkcijas tagad konsekventi met TypeError vai ValueError, nevis tikai izvada brīdinājumus. Skaitļu un virkņu salīdzināšana seko tīrākiem noteikumiem.
<?php
// PHP 8.0: match salīdzina stingri un tam nevajag break
$status = 404;
echo match (true) {
$status >= 500 => 'Serverfehler',
$status >= 400 => 'Anfragefehler',
default => 'in Ordnung',
};
// PHP 8.0: nullsafe operators
$land = $bestellung?->kunde?->adresse?->land;
PHP 8.1 atnesa enums, tas ir, uzskaitījuma tipus ar fiksētām vērtībām, un readonly īpašības, kuras var iestatīt tikai vienreiz:
<?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() nezināmu vērtību gadījumā met kļūdu. Tas neļauj patvaļīgām virknēm no veidlapām izslīdēt kā loma. Kam kļūdas vietā vajadzīga tukša vērtība, izmanto Rolle::tryFrom(), kas nezināmu vērtību gadījumā atgriež null.
Jaunums 8.1 ir arī Fibers, pamats vienlaicīgām norisēm, uz kura balstās asinhronās apstrādes bibliotēkas. Parastā vietnes darbībā to pamana maz, bet modernos ietvaros un rindās gan.
PHP 8.2 un 8.3: sakopšana un nodrošināšana
PHP 8.2 izsludināja dinamisko īpašību novecošanu. Kas objektam piešķir nedeklarētu īpašību, saņem paziņojumu; ar #[\AllowDynamicProperties] to var atļaut atsevišķām klasēm. Vecāki spraudņi tāpēc bieži rada daudz ziņojumu žurnālā.
Drošībai interesanti ir jaunais Random paplašinājums, kura noklusējuma randomizators saskaņā ar izlaiduma lapu izmanto kriptogrāfiski drošu nejaušo skaitļu ģeneratoru, un atribūts #[\SensitiveParameter], kas slēpj vērtības, piemēram, paroles, stacktrace. Vairāk par drošām nejaušām vērtībām sadaļā Droši nejaušie skaitļi un tokeni PHP.
PHP 8.3 pievienoja tipizētas klases konstantes, atribūtu #[\Override] pret drukas kļūdām metožu pārrakstīšanā un json_validate(), kas pārbauda JSON, to pilnībā nedekodējot.
PHP 8.4 un 8.5: modernie valodas līdzekļi
PHP 8.4 ieviesa property hooks, tas ir, loģiku tieši īpašībām, un asimetrisku redzamību, piemēram, public private(set). Klāt nāca jauna DOM API ar HTML5 atbalstu un funkcijas, piemēram, array_find(), array_any() un array_all(). Saskaņā ar izlaiduma lapu paplašinājumi IMAP, OCI8, PDO_OCI un pspell no kodola tika pārvietoti uz PECL. Lietojumprogrammām, kas, piemēram, izmanto IMAP, tad vajadzīga atsevišķa pakotne.
PHP 8.5 atnesa pipe operatoru, kas izsaukumus savieno no kreisās uz labo:
<?php
$slug = ' Neue Produkte 2026 '
|> trim(...)
|> strtolower(...)
|> (fn(string $s): string => str_replace(' ', '-', $s));
// Rezultāts: "neue-produkte-2026"
Jaunums ir arī URI paplašinājums, kas adreses sadala pēc RFC 3986 un WHATWG URL standarta. Drošībai tas ir svarīgi, jo nevienmērīgi parsētas URL ir zināms apietu pārbaužu cēlonis. Atpakaļatzīmes operators kā shell_exec() saīsinājums ir izsludināts par novecojušu, iestatījums disable_classes ir noņemts. Kas to izmantoja, tam nostiprināšana jāpielāgo.
Jaunumi, jauninājumi un PHP2Shell
Jaunas valodas funkcijas ievainojamības interpretatorā neaizver. Pret PHP2Shell palīdz tikai attiecīgā zara aktuālais ielāpu stāvoklis: 8.5.12, 8.4.27, 8.3.36 vai 8.2.35. PHP 8.1 un 8.0 oficiālu atjauninājumu vairs nav. Kas tur iestrēdzis, tam jājauninās, un tur jaunumi palīdz maz, bet pārtraukumi daudz.
Drošs jauninājuma ceļš piecos soļos:
- Noteikt mērķa versiju, atbilstoši ražotāja sistēmas prasībām un izlaidumu ciklam.
- Atkarības ar Composer un spraudņus pacelt uz saderīgiem stāvokļiem.
- Kodu pārbaudīt pret mērķa versiju ar statisko analīzi un testiem.
- Izmēģināt testa vidē ar ražošanas datu kopiju, žurnālus izvērtēt uz novecošanas brīdinājumiem.
- Pārslēgt, pārstartēt visus PHP procesus un dokumentēt stāvokli.
Fonu par tipiem sniedz PHP tipu sistēma.
Kā PHP SOS palīdz konkrēti?
- Pārbaudīt saderību: Mēs analizējam jūsu kodu un paplašinājumus uz pārtraukumiem pret mērķa versiju.
- Veikt jauninājumu: Ar migrāciju uz atbalstītu PHP versiju mēs lietojumprogrammas testētas paceļam.
- Pielāgot nostiprināšanu: Mēs noņemtos iestatījumus, piemēram,
disable_classes, aizstājam ar efektīvām alternatīvām. - Uzturēt ielāpu stāvokli: Pēc jauninājuma mēs zaru uzturam aktuālu un pierādām katru pārstartēšanu.
Biežāk uzdotie jautājumi
Kuru PHP 8 versiju šodien izmantot?
Jauniem projektiem PHP 8.4 vai 8.5, jo tās tiek atbalstītas visilgāk: 8.4 līdz 2028. gada beigām, 8.5 līdz 2029. gada beigām. Izšķiroši ir tas, ko jūsu lietojumprogramma saskaņā ar ražotāja sistēmas prasībām atbalsta. PHP 8.2 beidzas 2026. gada 31. decembrī.
Kas pārejā no PHP 7.4 uz PHP 8 salūst visbiežāk?
Bieži tās ir stingrākas tipu pārbaudes: iekšējās funkcijas PHP 8 met TypeError vai ValueError, nevis tikai izvada brīdinājumus. Ievērojamas ir arī mainītās skaitļu un virkņu salīdzināšanas. Statiskā analīze un testi lielāko daļu atklāj jau iepriekš.
Vai JIT padara manu vietni ātrāku?
Parasti tikko. Saskaņā ar PHP 8.0 izlaiduma lapu tipisku tīmekļa lietojumprogrammu veiktspēja ir aptuveni PHP 7.4 līmenī, savukārt skaitļošanas ietilpīgi uzdevumi var ievērojami iegūt. Kopš PHP 8.4 JIT pēc noklusējuma ir izslēgts.
Kuri jaunumi palīdz drošībai?
Cita starpā jaunais Random paplašinājums PHP 8.2 ar kriptogrāfiski drošu noklusējumu, atribūts SensitiveParameter pret parolēm stacktrace, enums un readonly īpašības viennozīmīgākiem datiem, kā arī konsekventākās tipu kļūdas kopš PHP 8.0.