Ukratko: PHP 8.0 (studeni 2020.) donio je imenovane argumente, atribute, union tipove, match, nullsafe operator i JIT kompilator. Potom su godišnje slijedili: 8.1 s enumima i fiberima, 8.2 s readonly klasama, 8.3 s tipiziranim konstantama klasa, 8.4 s property hooksima i 8.5 s pipe operatorom i URI ekstenzijom. Svaka verzija ukida i nešto staro. Pri nadogradnji stoga važe testovi, a za sigurnost je ponajprije važno koristiti podržanu granu s aktualnom razinom zakrpa.
Novosti PHP-a 8 ukratko
Tablica sažima ključne točke stranica izdanja na php.net-u. Datumi prvog izdanja prema php.net-u.
| Verzija | Izišla | Najvažnije novosti | Izbor ukidanja i prekida kompatibilnosti |
|---|---|---|---|
| 8.0 | 26. 11. 2020. | imenovani argumenti, atributi, Constructor Property Promotion, union tipovi, match, ?->, JIT |
0 == 'foobar' sada je false, tipske pogreške umjesto upozorenja |
| 8.1 | 25. 11. 2021. | enumi, readonly svojstva, First-Class-Callables strlen(...), new u inicijalizatorima, intersection tipovi, never, fiberi |
– |
| 8.2 | 8. 12. 2022. | readonly klase, DNF tipovi, null/false/true kao tipovi, Random ekstenzija, konstante u traitovima, #[\SensitiveParameter] |
dinamička svojstva ukinuta |
| 8.3 | 23. 11. 2023. | tipizirane konstante klasa, #[\Override], json_validate(), mb_str_pad(), php -l za više datoteka |
– |
| 8.4 | 21. 11. 2024. | property hooks, asimetrična vidljivost, #[\Deprecated], novi DOM API s HTML5, BcMath\Number, array_find(), lazy objekti |
implicitno nullable parametri ukinuti; IMAP, OCI8, PDO_OCI, pspell u PECL |
| 8.5 | 20. 11. 2025. | pipe operator, URI ekstenzija, Clone With, #[\NoDiscard], array_first()/array_last() |
backtick operator ukinut, disable_classes uklonjen |
PHP 8.0 i 8.1: veliki korak
PHP 8.0 učinio je jezik osjetno strožim i izražajnijim. Prema stranici izdanja interne funkcije sada dosljedno bacaju TypeError ili ValueError umjesto da samo ispisuju upozorenja. Usporedbe brojeva i nizova znakova slijede čišća pravila.
<?php
// PHP 8.0: match uspoređuje strogo i ne treba break
$status = 404;
echo match (true) {
$status >= 500 => 'Serverfehler',
$status >= 400 => 'Anfragefehler',
default => 'in Ordnung',
};
// PHP 8.0: nullsafe operator
$land = $bestellung?->kunde?->adresse?->land;
PHP 8.1 donio je enume, dakle tipove nabrajanja s čvrstim vrijednostima, i readonly svojstva koja se mogu postaviti samo jednom:
<?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() baca pogrešku kod nepoznatih vrijednosti. To sprječava da proizvoljni nizovi znakova iz obrazaca prođu kao uloga. Tko umjesto pogreške treba praznu vrijednost, koristi Rolle::tryFrom(), koji kod nepoznatih vrijednosti vraća null.
Novost u 8.1 su i fiberi, temelj za istodobne tokove na kojem se grade biblioteke za asinkronu obradu. U uobičajenom radu web-stranice toga se malo primjećuje, u modernim frameworcima i redovima čekanja pak da.
PHP 8.2 i 8.3: pospremanje i osiguravanje
PHP 8.2 ukinuo je dinamička svojstva. Tko objektu dodijeli nedeklarirano svojstvo, dobiva napomenu; pomoću #[\AllowDynamicProperties] to se može dopustiti za pojedine klase. Stariji dodaci zato često stvaraju mnogo poruka u logu.
Za sigurnost su zanimljivi nova Random ekstenzija, čiji zadani randomizer prema stranici izdanja koristi kriptografski siguran generator slučajnih brojeva, i atribut #[\SensitiveParameter], koji skriva vrijednosti poput lozinki u stack traceovima. Više o sigurnim slučajnim vrijednostima u članku Sigurni slučajni brojevi i tokeni u PHP-u.
PHP 8.3 dodao je tipizirane konstante klasa, atribut #[\Override] protiv tipfelera pri nadjačavanju metoda i json_validate(), koji provjerava JSON bez potpunog dekodiranja.
PHP 8.4 i 8.5: moderna jezična sredstva
PHP 8.4 uveo je property hooks, dakle logiku izravno na svojstvima, i asimetričnu vidljivost poput public private(set). Uz to su stigli novi DOM API s podrškom za HTML5 i funkcije poput array_find(), array_any() i array_all(). Prema stranici izdanja ekstenzije IMAP, OCI8, PDO_OCI i pspell premještene su iz jezgre u PECL. Aplikacije koje koriste, na primjer, IMAP tada trebaju zaseban paket.
PHP 8.5 donio je pipe operator koji pozive povezuje slijeva nadesno:
<?php
$slug = ' Neue Produkte 2026 '
|> trim(...)
|> strtolower(...)
|> (fn(string $s): string => str_replace(' ', '-', $s));
// Rezultat: "neue-produkte-2026"
Novost je i URI ekstenzija koja adrese rastavlja prema RFC-u 3986 i standardu WHATWG URL. To je sigurnosno važno jer nejednako parsirani URL-ovi poznat su uzrok zaobiđenih provjera. Backtick operator kao skraćeni oblik shell_exec() je ukinut, a postavka disable_classes uklonjena. Tko ju je koristio, trebao bi prilagoditi svoje ojačavanje.
Novosti, nadogradnje i PHP2Shell
Nove jezične funkcije ne zatvaraju ranjivosti u interpreteru. Protiv PHP2Shella pomaže samo aktualna razina zakrpa dotične grane: 8.5.12, 8.4.27, 8.3.36 ili 8.2.35. Za PHP 8.1 i 8.0 više nema službenih ažuriranja. Tko je tamo zapeo, mora nadograditi, a pritom novosti malo pomažu, a prekidi kompatibilnosti puno.
Siguran put nadogradnje u pet koraka:
- Odrediti ciljnu verziju, u skladu sa sistemskim zahtjevima proizvođača i ciklusom izdanja.
- Ovisnosti putem Composera i dodatke dovesti na kompatibilna stanja.
- Kod provjeriti statičkom analizom i testovima prema ciljnoj verziji.
- Isprobati u testnom okruženju s kopijom produkcijskih podataka, logove analizirati zbog ukidanja.
- Prebaciti, ponovno pokrenuti sve PHP procese i dokumentirati stanje.
Pozadinu o tipovima donosi članak Sustav tipova u PHP-u.
Kako PHP SOS konkretno pomaže?
- Provjeriti kompatibilnost: Analiziramo Vaš kod i ekstenzije zbog prekida prema ciljnoj verziji.
- Provesti nadogradnju: Migracijom na podržanu PHP verziju aplikacije testirano podižemo.
- Prilagoditi ojačavanje: Uklonjene postavke poput
disable_classeszamjenjujemo djelotvornim alternativama. - Održavati razinu zakrpa: Nakon nadogradnje granu držimo ažurnom i dokazujemo svako ponovno pokretanje.
Česta pitanja
Koju verziju PHP-a 8 danas trebam koristiti?
Za nove projekte PHP 8.4 ili 8.5, jer se najdulje podržavaju: 8.4 do kraja 2028., 8.5 do kraja 2029. Odlučujuće je što Vaša aplikacija podržava prema sistemskim zahtjevima proizvođača. PHP 8.2 završava 31. prosinca 2026.
Što se najčešće lomi pri prelasku s PHP-a 7.4 na PHP 8?
Često su to strože provjere tipova: interne funkcije u PHP-u 8 bacaju TypeError ili ValueError umjesto da samo ispisuju upozorenja. Primjećuju se i promijenjene usporedbe brojeva i nizova znakova. Statička analiza i testovi unaprijed otkrivaju većinu toga.
Ubrzava li JIT moju web-stranicu?
Uglavnom jedva. Prema stranici izdanja za PHP 8.0 učinkovitost tipičnih web-aplikacija otprilike je na razini PHP-a 7.4, dok računski zahtjevni zadaci mogu znatno profitirati. Od PHP-a 8.4 JIT je prema zadanim postavkama isključen.
Koje novosti pomažu sigurnosti?
Među ostalim nova Random ekstenzija u PHP-u 8.2 s kriptografski sigurnom zadanom vrijednošću, atribut SensitiveParameter protiv lozinki u stack traceovima, enumi i readonly svojstva za nedvosmislenije podatke te dosljedniji tipski error od PHP-a 8.0.