Novosti PHP 8.5 in kako ga posodobiš na gostovanju

Branje: 12 min

PHP 8.5 je izšel 20. novembra 2025 in je danes najnovejša stabilna veja PHP. Prinesel je nekaj jezikovnih novosti, na katere so razvijalci čakali leta (operator pipe, clone with, vgrajeno obdelavo URI), in označil za zastarelih nekaj starih rešitev, ki se še pojavljajo v starejših vtičnikih in predlogah. Dobra novica: da bi ga izkoristil, ti ni treba biti programer. Na našem spletnem gostovanju NVMe SSD lahko izbiraš med PHP 8.3, 8.4 in 8.5, na gostovanju cPanel pa s CloudLinux PHP Selectorjem preklopiš na katero koli različico od PHP 5.1 do 8.5, z enim klikom in s povratkom kadar koli.

V tem članku na kratko pregledamo, kaj je novega v PHP 8.5, do kdaj posamezne veje PHP dobivajo popravke in kako pred prehodom preveriš združljivost svoje spletne strani. Na koncu pokažemo še, kaj storiti, če po prehodu kaj ne deluje.

Do kdaj so različice PHP podprte?

Vsaka veja PHP dve leti dobiva aktivno podporo (popravke napak in varnostne popravke), nato še dve leti le varnostne popravke. Ko veja pride do konca tega obdobja, je razvijalci PHP ne popravljajo več, tudi če v njej najdejo resno ranljivost. Uradni podatki php.net:

Veja PHP Izid Konec aktivne podpore Konec varnostnih popravkov
8.1 25. november 2021 25. november 2023 31. december 2025 (poteklo)
8.2 8. december 2022 31. december 2024 31. december 2026
8.3 23. november 2023 31. december 2025 31. december 2027
8.4 21. november 2024 31. december 2026 31. december 2028
8.5 20. november 2025 31. december 2027 31. december 2029

PHP 8.2 torej ob koncu leta izpade iz podpore; podrobnosti in kaj storiti, preberi v našem članku o koncu podpore za PHP 8.2. Kaj to pomeni v praksi, je pokazala tudi oktobrska ranljivost PHP2Shell: php.net je popravljene različice izdal samo za podprte veje.

Najpomembnejše novosti PHP 8.5

Operator pipe (|>)

Operator pipe vrednost od leve proti desni pelje skozi zaporedje funkcij: vsak korak dobi rezultat prejšnjega. Tako ti ni treba brati gnezdenih klicev funkcij od znotraj navzven niti ustvarjati začasnih spremenljivk.

$title = ' PHP 8.5 Released ';

$slug = $title
    |> trim(...)
    |> (fn($str) => str_replace(' ', '-', $str))
    |> (fn($str) => str_replace('.', '', $str))
    |> strtolower(...);

// "php-85-released"

Na desni strani je lahko katera koli klicljiva vrednost z enim parametrom. Puščične funkcije (arrow functions) je treba dati v oklepaje, kot je razvidno iz primera.

Clone with

clone() lahko zdaj dobi tudi polje z lastnostmi, ki jih želiš spremeniti. To pride prav predvsem pri razredih readonly, kjer je bilo doslej okorno izdelati kopijo objekta z eno ali dvema drugačnima vrednostma (tako imenovani vzorec »with-er«):

public function withAlpha(int $alpha): self
{
    return clone($this, [
        'alpha' => $alpha,
    ]);
}

Vgrajena razširitev URI

Nova, vedno razpoložljiva razširitev URI spletne naslove obdeluje standardno, po RFC 3986 in tudi po standardu WHATWG URL, ki ga uporabljajo brskalniki. Doslej je bila za to funkcija parse_url(), ki je naslov v več robnih primerih razumela drugače kot brskalnik, kar je lahko vodilo tudi do varnostnih napak.

use Uri\Rfc3986\Uri;

$uri = new Uri('https://php.net/releases/8.5/en.php');
echo $uri->getHost(); // "php.net"

Atribut #[\NoDiscard]

Če funkcijo označiš s tem atributom, te PHP opozori, kadar nekdo njene vrnjene vrednosti ne uporabi. To je koristno pri funkcijah, kjer je izpuščena vrnjena vrednost skoraj zagotovo napaka (na primer če rezultat pove, ali je operacija uspela). Če vrednost zavržeš namerno, to označiš s pretvorbo tipa (void).

array_first() in array_last()

Dve dolgo pogrešani funkciji: vrneta prvi oziroma zadnji element polja, pri praznem polju pa null. Doslej si moral za to uporabiti ovinke prek reset(), end() ali array_key_first().

$lastEvent = array_last($events);

Zaprtja (closures) v konstantnih izrazih

Statična zaprtja in klicljive vrednosti prvega razreda (first-class callables, na primer strlen(...)) se lahko zdaj pojavijo tudi v konstantnih izrazih: v parametrih atributov, v privzetih vrednostih lastnosti in parametrov ter v konstantah. Ogrodja lahko tako na primer preverjanje dovoljenj podajo neposredno v atributu.

Sled klicev (backtrace) pri usodnih napakah

Sporočilo usodnih napak (na primer prekoračenega največjega časa izvajanja) zdaj vsebuje verigo klicev (backtrace), zato iz dnevnika napak razbereš, kateri del kode je pripeljal do napake. To ureja nova nastavitev INI fatal_error_backtraces. Pri napaki »Maximum execution time exceeded«, ki jo povzroči počasen vtičnik WordPress, ti to prihrani veliko ugibanja.

Druge novosti na kratko

  • Closure::getCurrent(): preprostejša rekurzija v anonimnih funkcijah.
  • Atribute je mogoče uporabiti tudi za konstante, #[\Override] za lastnosti, #[\Deprecated] pa tudi za traite in konstante.
  • Asimetrična vidnost pri statičnih lastnostih in oznaka final pri lastnostih, promoviranih v konstruktorju.
  • Trajni deljeni ročaji cURL (curl_share_init_persistent()): razreševanje DNS in povezave je mogoče ponovno uporabiti v več zahtevah.
  • setcookie() in setrawcookie() podpirata ključ partitioned.
  • Novi funkciji get_error_handler() in get_exception_handler().
  • Nova nastavitev INI max_memory_limit, ki določa zgornjo mejo, do katere je mogoče med izvajanjem dvigniti memory_limit.
  • Ukaz php --ini=diff izpiše, katere nastavitve se razlikujejo od privzetih.
  • OPcache je zdaj vedno del PHP in ne ločena razširitev, ki jo je treba naložiti (nastavitev opcache.enable še vedno velja).

Kaj je v PHP 8.5 postalo zastarelo?

Zastarele (deprecated) funkcije zaenkrat še delujejo, vendar PHP ob njihovi uporabi v dnevnik zapiše opozorilo E_DEPRECATED, v eni od prihodnjih glavnih različic pa lahko izginejo. V starejših vtičnikih in predlogah se najpogosteje pojavljajo te:

  • Operator backtick: zapis `ls -la` kot okrajšava za shell_exec() je zastarel, namesto njega uporabi shell_exec('ls -la').
  • Nekanonične pretvorbe tipov: namesto (boolean), (integer), (double) in (binary) piši (bool), (int), (float) in (string).
  • null kot indeks polja: $a[null] in podajanje vrednosti null funkciji array_key_exists() sta zastarela, namesto tega uporabi prazen niz.
  • case, zaključen s podpičjem: veje switch je treba zaključiti z dvopičjem.
  • __sleep() in __wakeup(): »mehka« zastarelost, brez opozorila; v novi kodi sta priporočeni __serialize() in __unserialize().
  • Odvečne funkcije za »zapiranje«: curl_close(), imagedestroy(), finfo_close() in xml_parser_free() so zastarele, ker so viri že objekti in se sprostijo sami.

Nekatere spremembe sprožijo tudi opozorilo: na primer če število s plavajočo vejico ne gre v celo število, pa ga kljub temu pretvorijo v tip int, ali če razstavijo vrednost, ki ni polje, s konstruktom [] ali list(). Nastavitev INI disable_classes je bila odstranjena. Celoten seznam je v vodniku za prehod na php.net.

Kaj vse to pomeni za tvojo spletno stran?

Če poganjaš WordPress, Joomlo, PrestaShop ali aplikacijo na nekem ogrodju, jezikovnih novosti ne uporabljaš ti: razvijalci jih vgrajujejo postopoma. Vprašanje je, ali koda, ki jo uporabljaš danes (jedro, vtičniki in predloga), brez napak teče na PHP 8.5.

Jedro WordPressa podpira PHP 8.5 od različice 6.9 (takrat še z oznako beta, ki so jo medtem odstranili). Pri vtičnikih in predlogah pa je slika mešana: dobro vzdrževani večinoma hitro sledijo novim različicam, težave pa lahko povzročijo dolgo neposodobljeni, prilagojeni ali opuščeni vtičniki. O tem, katera različica PHP je najboljša za WordPress, smo podrobneje pisali v ločenem članku.

Pred posodobitvijo: tako preveriš združljivost

  1. Naredi varnostno kopijo. Datotek in podatkovne baze. Na spletnem gostovanju se od paketa Web Starter izdeluje tudi samodejna varnostna kopija, vendar lastna kopija pred prehodom ne škodi: izvozi podatkovno bazo v phpMyAdminu in prenesi datoteke prek FTP. Na gostovanju cPanel lahko narediš varnostno kopijo celotnega računa (koraki tukaj), pri WordPressu pa zadošča tudi vtičnik za varnostne kopije.
  2. Na trenutni različici PHP posodobi vse. Najprej jedro WordPressa, vtičnike in predlogo, šele nato PHP. Če spremeniš vse hkrati, težko ugotoviš, kaj je povzročilo napako.
  3. Preglej podatke o vtičnikih. Na WordPress.org je pri vsakem vtičniku navedena najnižja različica PHP in datum zadnje posodobitve. Za vtičnik, ki ni bil posodobljen dve leti, je vredno poiskati drugo rešitev.
  4. Če imaš kodo po meri, zaženi statično preverjanje. Nabor pravil PHPCompatibility s pomočjo PHP_CodeSnifferja v kodi poišče zastarele ali odstranjene funkcije. Pravila za PHP 8.5 so v razvojni veji 10 (stara izdaja 9.3.5 pozna le spremembe PHP 7.x). Zaženi ga na svojem računalniku, v mapi projekta:

    composer require --dev phpcompatibility/php-compatibility:"^10.0.0@dev"
    vendor/bin/phpcs -p wp-content/themes/sajat-sablon --standard=PHPCompatibility --runtime-set testVersion 8.5
    
  5. Preizkusi na testni kopiji. Najvarneje je, da najprej preklopiš na kopiji strani (staging). Na gostovanju cPanel jo WP Toolkit izdela z nekaj kliki (koraki za staging z WP Toolkitom), o metodah pa več piše v našem članku o stagingu WordPressa.
  6. Vklopi dnevnik napak. Pri WordPressu v datoteki wp-config.php takole preusmeriš napake in opozorila v datoteko wp-content/debug.log, ne da bi jih videli obiskovalci:

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true );
    define( 'WP_DEBUG_DISPLAY', false );
    

    Po testiranju vrni vrednost WP_DEBUG na false in izbriši datoteko dnevnika.

Po prehodu preklikaj najpomembnejše dele strani: domačo stran, eno objavo, kontaktni obrazec, pri spletni trgovini košarico in plačilo ter skrbniški vmesnik. Nato preglej dnevnik napak: opozorila deprecated še ne povzročajo napak, vendar pokažejo, kateri vtičnik bo treba posodobiti ali zamenjati.

Zamenjava različice PHP na spletnem gostovanju (KeyHelp)

Naše spletno gostovanje upravljaš na preprosti nadzorni plošči KeyHelp (osnove prikazuje naš vodnik za prve korake). Tu različico PHP nastaviš za vsako domeno posebej:

  1. Prijavi se v KeyHelp in odpri točko menija Domene.
  2. V vrstici domene klikni ikono svinčnika, nato zavihek Tolmač.
  3. Na seznamu Tolmač PHP izberi želeno različico (8.3, 8.4 ali 8.5). Če želiš isto tudi za poddomene (na primer www), označi možnost Uporabi tolmač PHP za vse poddomene in shrani spremembo.
  4. Ponovno naloži stran in preveri, ali deluje.

Ker na spletnem gostovanju tečejo samo podprte veje PHP, tu ni vprašanje, ali je različica varna, temveč s katero tvoja spletna stran deluje najbolje. Če nastavitve ne najdeš ali nisi prepričan, nam piši in pomagali ti bomo.

Zamenjava različice PHP na gostovanju cPanel (CloudLinux PHP Selector)

Na gostovanju cPanel CloudLinux PHP Selector (v cPanelu Select PHP Version) nastavi različico PHP za celoten račun gostovanja. Korake s slikami prikazuje članek baze znanja o spremembi privzete različice PHP, na kratko:

  1. V skupini Programska oprema v cPanelu odpri točko Select PHP Version.
  2. Na seznamu Current PHP version izberi 8.5 (ali želeno različico) in potrdi z gumbom Set as current.
  3. Preveri razširitve. V PHP Selectorju razširitve (na primer imagick, intl ali ioncube_loader) vklapljaš za vsako različico posebej, zato po prehodu na novo različico preveri, ali so vklopljeni moduli, ki jih tvoja stran potrebuje. Podrobnosti najdeš v članku o upravljanju razširitev PHP.

Če na gostovanju teče več strani in samo ena potrebuje drugo različico, lahko z eno vrstico v .htaccess nastaviš različico PHP za vsako mapo posebej (različna različica PHP za posamezne mape). Za staro aplikacijo so na gostovanju cPanel na voljo tudi starejše različice; kako varne so, opisuje naš članek o HardenedPHP.

Če po prehodu kaj ne deluje

Zamenjava različice PHP na obeh vrstah gostovanja začne veljati takoj in jo lahko prav tako takoj razveljaviš. Če stran pokaže bel zaslon ali napako »500 Internal Server Error«, je prvi korak vedno ta: vrni prejšnjo različico, da obiskovalci spet vidijo delujočo stran. Nato lahko v miru ugotoviš, kaj je povzročilo napako.

  • Preglej dnevnik napak. Sporočilo usodne napake pove ime datoteke in številko vrstice, v PHP 8.5 pa že skupaj s celotno verigo klicev. Če pot kaže na podmapo v wp-content/plugins/, si našel krivca.
  • »Call to undefined function«: največkrat v novi različici manjka razširitev (modul); v cPanelu jo vklopi v PHP Selectorju.
  • Napako povzroča vtičnik: posodobi ga ali, če novejše različice ni, ga izklopi. Če se ne naloži niti skrbniški vmesnik, v upravitelju datotek ali prek FTP preimenuj mapo vtičnika in WordPress ga bo izklopil.
  • Sporočila deprecated na strani: to ni napaka, le prikaz napak je vklopljen. Na produkcijski strani izklopi prikaz (display_errors = Off), beleženje pa lahko ostane.

Splošne korake iskanja napak povzemata tudi naš članek o odpravi napake 500 in vodnik o belem zaslonu WordPressa.

Katero različico izbrati zdaj?

  • PHP 8.5, če ga podpirajo vsi deli tvoje spletne strani: popravke bo dobival najdlje, do konca leta 2029.
  • PHP 8.4 je dobra, varna privzeta izbira, če en ali dva vtičnika še nista sledila različici 8.5: aktivno podporo dobiva do konca leta 2026, varnostne popravke pa do konca leta 2028.
  • PHP 8.3 le začasno, če pomemben vtičnik z novejšimi ne deluje: varnostne popravke dobiva do konca leta 2027.
  • PHP 8.2 in starejši: le če drugače ne gre, prehod pa načrtuj čim prej.

Če še razmišljaš o smislu posodobitve: o tem, zakaj je posodabljanje PHP pomembno za hitrost in varnost, smo podrobneje pisali v ločenem članku.

Pogosta vprašanja

Bo moja stran s PHP 8.5 hitrejša?

PHP 8.5 ne prinaša tako velikega skoka v zmogljivosti, kot sta ga svoj čas PHP 7 ali 8.0. Če prihajaš z različice 7.4 ali 8.0, pa se lahko občutno izboljšata hitrost in poraba pomnilnika, in kar je vsaj enako pomembno: podprta različica dobiva varnostne popravke.

Moram prepisati kodo svoje spletne strani?

Pri že izdelanem sistemu (WordPress, sistem za spletno trgovino) praviloma ne: dovolj je, da jedro, vtičnike in predlogo sproti posodabljaš. Pri razvoju po meri zaženi preverjanje PHPCompatibility in v dnevniku napak preglej opozorila deprecated.

Kako vem, katera različica PHP trenutno teče na moji strani?

V WordPressu je to vidno na strani Zdravje spletnega mesta (Site Health) v meniju Orodja, v razdelku Strežnik na zavihku Informacije. V cPanelu na vrhu strani Select PHP Version, v KeyHelpu pa v stolpcu različice PHP na seznamu Domene (s klikom na številko različice se odpre celoten phpinfo). Pri strani po meri to pokaže tudi datoteka s klicem phpinfo(); po preverjanju jo izbriši.

Se lahko vrnem nazaj, če kaj ne deluje?

Da, zamenjavo različice lahko kadar koli razveljaviš in začne veljati takoj. Zato je pametno preklopiti zunaj obdobij z več prometa in stran takoj po prehodu preklikati.

Kaj pa VPS?

Na lastnem strežniku moraš PHP namestiti in posodabljati sam, iz paketov distribucije ali iz zunanjega repozitorija. Če se s tem ne želiš ukvarjati, na zgornjih gostovanjih za posodobitve različic PHP in varnostne popravke poskrbimo mi.

Nazaj na blog