PHP 8.5 je stigao krajem prošle godine — i sada je dostupan na cyber_Folks serverima.
Nova verzija donosi niz poboljšanja koja će direktno utjecati na brzinu, stabilnost i jednostavnost razvoja web aplikacija. Ako koristiš WordPress, WooCommerce ili custom aplikacije — ovo je update koji vrijedi ispratiti.
Iz ovog članka ćete naučiti:
- PHP 8.5 – Što se mijenja
- PHP 8.5 na cyber_Folks serverima. Što to znači?
PHP 8.5 – Što se mijenja?
PHP 8.5 je još jedna PHP verzija, koja se fokusira na poboljšanje performansi, obogaćivanje jezika novim konstrukcijama, bolje programiranje ergonomije i alata koji olakšavaju razvoj i održavanje web aplikacija.
U odnosu na verziju 8.4, koja je donijela proširenja u tipiziranju, poboljšanja u radu s klasama i optimizacije unutar samog jezika, PHP 8.5 stavlja naglasak na dodatno unapređenje developerskog okruženja.
Među ključnim novostima izdvajaju se pipe operator (|>) za čitljivije povezivanje funkcija, nove funkcije za rad s poljima poput array_first i array_last, unaprijeđeno rukovanje fatalnim pogreškama te pristup trenutno aktivnom error/exception handleru. Uz to, poboljšana je interoperabilnost s URL API-jima u skladu sa standardima RFC 3986 i WHATWG.
Iako ne donosi revoluciju u samom jeziku, upravo zahvaljujući tim poboljšanjima kod postaje čitljiviji, funkcionalniji i jednostavniji za debugiranje.
PHP 8.5 nastavlja trend povećanja performansi, donoseći dodatne optimizacije koje stvarno skraćuju vrijeme izvršavanja skripti. Prema našim testovima, PHP 8.5 u prosjeku je oko 19% brži od verzije 8.4, što se izravno odražava na brže učitavanje web stranica.

Brža stranica znači i zadovoljnijeg korisnika. Istraživanja pokazuju da čak i minimalna kašnjenja mogu povećati frustraciju i dovesti do napuštanja stranice.
Povećana brzina PHP-a 8.5 zato se direktno odražava na:
- bolje korisničko iskustvo
- manji bounce rate
- dulje zadržavanje korisnika na stranici
- veću konverziju
Google favorizira web stranice koje se brzo učitavaju i korisnicima pružaju glatko, ugodno iskustvo korištenja.
Zato je brzina danas jedan od ključnih faktora koji utječu na poziciju u rezultatima
Pipe operator (|>) – čitljivo povezivanje funkcija
PHP 8.5 uvodi pipe operator (|>), koji omogućuje jednostavnije i preglednije povezivanje funkcija te obradu vrijednosti u obliku “toka”. Riječ je o jednoj od najzanimljivijih novosti, posebno u situacijama gdje se nad jednom vrijednošću primjenjuje više uzastopnih transformacija.
Operator radi tako da rezultat izraza s lijeve strane automatski prosljeđuje kao argument funkciji s desne strane. Na taj način kod postaje čitljiviji i lakši za debugiranje u odnosu na klasične, ugniježđene pozive funkcija.
$result = "Hello World"
|> strtoupper(...)
|> str_shuffle(...)
|> trim(...);
// "LWHO LDLROE"izvor: php.watch/versions/8.5/pipe-operator
Placeholder (…) označava mjesto na koje će se umetnuti vrijednost proslijeđena s lijeve strane operatora. Ne radi se o first-class callable funkciji, već o posebnoj sintaksi za pozivanje funkcije s definiranim mjestom umetanja argumenta.
Tijekom kompilacije PHP optimizira ovakve izraze tako da su performanse usporedive s klasičnim, ugniježđenim pozivima funkcija.
Zamke i ograničenja pipe operatora (|>)
Iako pipe operator u PHP-u 8.5 značajno poboljšava čitljivost koda i omogućuje jasno “lančanje” obrade podataka, ima i određena ograničenja na koja treba obratiti pažnju. Poznavanje tih zamki može spriječiti pogreške i nepredvidivo ponašanje aplikacije.
1. Samo jedan obavezni argument u funkciji
Pipe operator ispravno radi samo kada funkcija s desne strane prima točno jedan obavezni argument. Razlog je jednostavan — pipe uvijek prosljeđuje vrijednost kao prvi argument i nije moguće promijeniti njegovu poziciju.
Nedozvoljen primjer:
"abc" |> strpos(..., "b");
// Greška — strpos zahtijeva dva argumentaAko funkcija prima više od jednog argumenta, svi dodatni argumenti moraju imati zadane (default) vrijednosti.
2. Nema podrške za funkcije koje zahtijevaju argumente po referenci
Pipe operator radi s međurezultatima bez potrebe za spremanjem u varijablu.
Zbog toga nije kompatibilan s funkcijama koje zahtijevaju prosljeđivanje argumenata po referenci:
explode("-", "a-b-c") |> array_pop(...);
// Error: parametar mora biti proslijeđen po referenciIznimka: funkcije označene s @prefer-ref. U PHP coreu postoje samo dvije takve funkcije:
array_multisort()extract()
One prihvaćaju referencu opcionalno, zbog čega rade:
['foo' => 'bar'] |> extract(...);
// OK3. Nije moguće promijeniti redoslijed prosljeđivanja argumenta
Pipe operator uvijek tretira vrijednost s lijeve strane kao prvi argument funkcije. Ne postoji način da se ona proslijedi kao drugi ili treći parametar.
Neće raditi:
"Hello" |> str_replace("H", "J", ...);
// PHP će umetnuti "Hello" kao prvi argument → pogrešan poziv funkcije4. Funkcije bez parametara uglavnom neće raditi
Ugrađene funkcije koje ne primaju nikakve argumente ne mogu se koristiti u pipe lancu.
Kod takvih funkcija PHP će jednostavno ignorirati proslijeđenu vrijednost — što može dovesti do teško uočljivih grešaka.
"Hello" |> phpinfo(...);
// Radi… ali potpuno ignorira "Hello"5. Funkcije koje vraćaju void prosljeđuju null — i “kvare” daljnji lanac
Funkcija koja vraća void može se koristiti, ali će dalje proslijediti null.
Ako se nađe usred lanca, sve naredne operacije izvršavat će se nad null.
$result = "Hello"
|> logger(...) // void → null
|> strtoupper(...); // strtoupper(null) → TypeError kod strict_types=1Zato se funkcije koje vraćaju void koriste isključivo na kraju lanca.
6. Pipe operator ima specifičan prioritet (precedenciju)
Ovo je jedna od podmuklijih stvari:
- prvo se izvršavaju aritmetičke operacije, null-coalescing i ternarni operator
- tek nakon toga dolazi na red pipe operator
Primjer:
echo 10 + 6 |> dechex(...) |> hexdec(...);
// rezultat: 16S druge strane, s zagradama:
echo 10 + (6 |> dechex(...)) |> hexdec(...);
// rezultat: 22Pogrešno korištenje zagrada može u potpunosti promijeniti logiku koda…
7. Nema povratne kompatibilnosti
Kod koji koristi pipe operator:
$value |> strtoupper(...);pri pokretanju na PHP-u 8.4 ili starijim verzijama:
Parse error: syntax error, unexpected token ">"8. Pipe nije brži – samo je čitljiviji
Pipe operator ne donosi nikakva poboljšanja u performansama. PHP ga kompilira u opcode gotovo identične onima kod standardnih poziva funkcija.
Zahvaljujući mehanizmu copy-on-write, pipe ne troši dodatnu memoriju i radi jednako učinkovito kao i klasična dodjela vrijednosti u varijablu. Ovo je važno naglasiti za developere koji očekuju da će novi operator “ubrzati kod”.
Funkcije za rad s poljima: array_first() i array_last()
PHP 8.5 uvodi dvije nove funkcije za rad s poljima: array_first() i array_last(), koje omogućuju brz i pregledan pristup prvom i posljednjem elementu polja. One su logičan nastavak funkcija array_key_first() i array_key_last(), uvedenih u PHP-u 7.3 — no ovaj put rade izravno s vrijednostima, a ne s ključevima.
Do sada su developeri za dohvat prvog ili zadnjeg elementa morali koristiti manje intuitivne pristupe poput reset(), end() ili ručno indeksiranje. Takva rješenja često su smanjivala čitljivost koda, nosila rizik promjene internog pokazivača polja ili uzrokovala greške poput undefined offset.
Nove funkcije omogućuju pisanje koda na jednostavniji, čitljiviji i sigurniji način:
- dohvaćaju prvi ili posljednji element polja
- omogućuju korištenje opcionalnog callbacka za filtriranje
- omogućuju definiranje zadane vrijednosti koja se vraća ako je polje prazno ili nema podudaranja
Zahvaljujući tome, rad s poljima postaje jednostavniji, a kod otporniji na greške.
array_first()
Vraća prvi element polja. Ako je polje prazno ili nijedan element ne prođe opcionalni callback filter, funkcija vraća null — osim ako je definirana zadana vrijednost.
Primjeri:
array_first([1, 2, 3]); // 1
array_first([2, 3]); // 2
array_first(['a' => 2, 'b' => 1]); // 2
array_first([null, 2, 3]); // null
array_first([]); // null
array_first([$obj, 2, 3]); // $obj
array_first([1]); // 1
array_first([true]); // truearray_last()
Vraća posljednji element polja.
Radi analogno funkciji array_first(), uključujući podršku za callback i zadanu vrijednost.
Primjeri korištenja array_last():
array_last([1, 2, 3]);
// 3
array_last([2, 3]);
// 3
array_last(['a' => 2, 'b' => 1]);
// 1
array_last([null, 2, 3]);
// 3
array_last([]);
// null (tablica pusta)
array_last([$obj, 2, 3]);
// 3
array_last([1]);
// 1
array_last([false]);
// false
array_last([true, false, true]);
// truePrimjeri korištenja callbacka i zadane vrijednosti
Upravo su callback i zadana vrijednost najveća prednost novih funkcija u odnosu na starije metode:
array_first([0, null, false, 5], fn($x) => $x);
// 5 — pierwsza wartość
array_last([1, 3, 6, 9], fn($x) => $x % 3 === 0);
// 9 — ostatnia wartość podzielna przez 3
array_first([], null, default: 'brak');
// 'brak' — wartość domyślna przy pustej tablicyFunkcije get_error_handler() i get_exception_handler()
PHP već dugi niz godina omogućuje definiranje vlastitih handlera za obradu grešaka i iznimki, koji se izvršavaju u trenutku kada dođe do greške ili neuhvaćene iznimke. Također ih je moguće mijenjati i vraćati na prethodne postavke, što daje veliku fleksibilnost u upravljanju greškama unutar aplikacija.
Međutim, sve do verzije PHP 8.4 nije postojao jednostavan način da se provjeri koji je handler trenutno aktivan. Developeri su mogli postavljati vlastite funkcije, ali nisu mogli lako dohvatiti trenutno stanje okruženja, što je otežavalo debugiranje i razvoj naprednijih frameworka i alata.
PHP 8.5 rješava taj nedostatak uvođenjem dvije nove introspektivne funkcije:
get_error_handler()get_exception_handler()
Obje funkcije omogućuju provjeru trenutno aktivnih handlera bez potrebe za workaround rješenjima ili manipulacijom globalnim stanjem. To znatno olakšava debugiranje, unit testove te implementaciju sustava za logiranje i monitoring.
get_error_handler()
Funkcija vraća trenutno postavljeni handler za greške u PHP-u. To može biti:
- naziv funkcije (
string) - polje
[object, method] - objekt s metodom
__invoke() - instanca
Closure null, ako se koristi zadani PHP mehanizam
set_error_handler(fn() => null);
get_error_handler(); // object(Closure)#1 (3) {...}Izvor: php.watch/versions/8.5/get_error_handler-get_exception_handler
get_exception_handler()
Analogno tome, ova funkcija vraća trenutno postavljeni handler za iznimke definiran putem set_exception_handler().
To može biti:
- naziv funkcije
- polje
[object, method] - objekt koji se može pozvati (
__invoke()) - instanca
Closure null, ako PHP koristi zadani handler za iznimke
set_error_handler(fn() => null);
get_error_handler(); // object(Closure)#1 (3) {...}Izvor: php.watch/versions/8.5/get_error_handler-get_exception_handler
Što developeri dobivaju?
Zahvaljujući ovim funkcijama:
- lakše je debugirati ponašanje aplikacije u slučaju grešaka
- frameworki mogu analizirati vlastite mehanizme obrade grešaka
- alati za nadzor (npr. APM, loggiranje) mogu provjeriti je li handler promijenjen
- moguće je izbjeći konflikte između biblioteka koje nadjačavaju handler
Radi se o maloj, ali vrlo praktičnoj nadogradnji — posebno korisnoj za developere koji rade na frameworkima, runtime okruženjima i alatima za razvoj.
Stack trace za fatalne greške
tack trace je jedna od najvažnijih dijagnostičkih informacija u PHP-u. Omogućuje praćenje redoslijeda poziva funkcija, metoda i datoteka koje su dovele do greške. U većim aplikacijama, višeslojnim frameworkima i produkcijskim sustavima to je ključno za pronalaženje uzroka problema.
U PHP-u 8.5 ovaj je mehanizam dodatno unaprijeđen:
fatalne greške (tzv. fatal errors – E_ERROR) sada dobivaju potpuni i čitljiv stack trace, umjesto skraćenih ili nepotpunih informacija kakve su bile dostupne u ranijim verzijama.
Zahvaljujući tome, developeri imaju znatno bolji uvid u uzrok kritičnih grešaka, a dijagnostika problema postaje brža i jednostavnija.
Povezanost s novim funkcijama
Ova poboljšanja nadopunjuju se s drugim novim funkcijama uvedenima u PHP-u 8.5, poput:
get_error_handler()get_exception_handler()
Zahvaljujući njima, developer može provjeriti koji su handleri trenutno aktivni i kako će se aplikacija ponašati u slučaju greške. To je posebno korisno kod debugiranja frameworka i biblioteka koje implementiraju vlastite mehanizme obrade grešaka.
Klase i funkcije povezane sa stack traceom
Exception::getTrace()
Vraća polje koje opisuje sve pozive funkcija i metoda koji su doveli do bacanja iznimke.
Svaki element polja sadrži, između ostalog:
- naziv funkcije ili metode
- klasu (ako je primjenjivo)
- datoteku i broj linije
- argumente proslijeđene funkciji
Exception::getTraceAsString()
Vraća stack trace u tekstualnom obliku (string), spreman za logiranje.
Radi se o čitljivijem prikazu koji se često koristi u sustavima za logiranje i monitoring.
debug_backtrace()
Funkcija koja se može pozvati bilo gdje u kodu, ne samo u kontekstu grešaka ili iznimki.
Omogućuje dohvat trenutnog stack tracea, primjerice tijekom logiranja, testiranja ili analize tijeka podataka unutar aplikacije.
CLI opcija: php –ini=diff
PHP 8.5 uvodi novu CLI opciju --ini=diff, koja značajno olakšava analizu konfiguracije okruženja.
Prilikom pokretanja, interpreter uspoređuje trenutačne konfiguracijske postavke s njihovim zadanim vrijednostima i prikazuje samo one koje su izmijenjene.
Ovo je veliko olakšanje za developere i administratore, koji su do sada morali ručno uspoređivati konfiguracijske datoteke ili koristiti dodatne alate.
Uz php --ini=diff moguće je brzo utvrditi:
- koje su opcije iz
php.inipromijenjene - koje promjene dolaze iz dodatnih konfiguracijskih datoteka (npr.
conf.d) - koje su postavke nadjačane na razini modula
- koje su vrijednosti definirane putem CLI parametara (npr.
php -d foo=bar)
Opcija je posebno korisna za:
- dijagnostiku problema u okruženju
- usporedbu konfiguracija između servera
- debugiranje razlika između dev/stage/prod okruženja
- sigurnosne i performansne audite
Pomoću ovog alata lako je uočiti razlike poput:
- različitog
memory_limit - promijenjenog
error_reporting - ručno postavljenih
disable_functions - nestandardnih limita, putanja i flagova
--ini=diff je mala, ali izuzetno praktična nadogradnja koja može uštedjeti puno vremena pri administraciji servera i rješavanju problema u aplikacijama.
Nova direktiva max_memory_limit – čvrsti limit za memory_limit
Jedna od praktičnih novosti u PHP-u 8.5 je uvođenje direktive max_memory_limit, koja omogućuje postavljanje globalnog, neprekoračivog limita memorije za PHP skripte. Radi se o nadogradnji postojećeg mehanizma memory_limit, ali s ključnom razlikom — ovo je “tvrdi plafon” koji nije moguće zaobići, čak ni korištenjem ini_set().
Zašto je to važno?
memory_limit već godinama određuje maksimalnu količinu memorije koju pojedini PHP zahtjev može koristiti.
Važno je naglasiti da je riječ o direktivi tipa INI_ALL, što znači da se može:
- postaviti u
php.ini - definirati u konfiguracijskim datotekama modula
- mijenjati putem CLI parametara
- promijeniti tijekom izvođenja skripte pomoću
ini_set()
Postavka memory_limit = -1 u potpunosti uklanja ograničenje, što može biti rizično — osobito na dijeljenim hostingima, u kontejnerima i okruženjima s ograničenim resursima.
PHP 8.5 uvodi rješenje za ovaj problem.
Što je max_memory_limit?
max_memory_limit je globalni limit memorije koji nije moguće prekoračiti.
Djeluje kao gornja granica za memory_limit.
Ključne značajke:
- zadano je postavljen na
-1(što znači da je limit isključen — radi kompatibilnosti unatrag) - ne može se mijenjati tijekom izvođenja skripte jer je riječ o direktivi tipa
INI_SYSTEM - svaki pokušaj postavljanja
memory_limitiznad te vrijednosti rezultira:- upozorenjem
- automatskim ograničavanjem vrijednosti na
max_memory_limit
Ovo administratorima daje potpunu kontrolu nad potrošnjom memorije, čak i u situacijama kada aplikacija pokušava zaobići ograničenja pomoću ini_set().
Primjer korištenja
Pretpostavimo da je administrator postavio:
max_memory_limit = 256M
memory_limit = 128MProvjera vrijednosti:
ini_get('max_memory_limit'); // "256M"
ini_get('memory_limit'); // "128M"Povećanje memory_limit unutar dopuštenog raspona
ini_set('memory_limit', '156M'); // OK – 156M < 256M
ini_set('memory_limit', '256M'); // OK – równe max_memory_limitPokušaj postavljanja memory_limit iznad maksimalne vrijednosti
ini_set('memory_limit', '300M');Rezultat:
Warning: Failed to set memory_limit to 314572800 bytes.
Setting to max_memory_limit instead (currently: 268435456 bytes)memory_limit se postavlja na 256M — odnosno na definirani maksimalni limit.
Pokušaj postavljanja “bez ograničenja”
ini_set('memory_limit', '-1');Rezultat:
Warning: Failed to set memory_limit to unlimited.
memory_limit (currently: 268435456 bytes) cannot be set to unlimited
if max_memory_limit (%d bytes) is not unlimitedPHP 8.5 na cyber_Folks serverima – što to znači za vas?
Novosti koje donosi ova verzija znače bolje performanse, veću stabilnost i jednostavniji razvoj aplikacija.
Bolja iskorištenost memorije
Optimizacije u upravljanju memorijom — posebno kod rada s poljima i složenijim strukturama — smanjuju potrošnju resursa i poboljšavaju ukupnu responzivnost aplikacija.
Manji overhead kod obrade grešaka
Unaprijeđeni mehanizmi za obradu grešaka, uključujući potpuni stack trace za fatalne greške, smanjuju opterećenje servera i ubrzavaju dijagnostiku problema.
Nova direktiva max_memory_limit
Omogućuje preciznu kontrolu potrošnje memorije na razini cijelog PHP okruženja. Skripte više ne mogu prekoračiti definirani limit — čak ni pokušajem izmjene memory_limit tijekom izvođenja — što povećava stabilnost i štiti od nekontroliranog rasta potrošnje RAM-a.
Brže izvođenje i kraći TTFB
Optimizacije u interpreteru i runtimeu omogućuju brže generiranje odgovora servera, što rezultira kraćim time-to-first-byte i boljim korisničkim iskustvom.
Jednostavnije debugiranje
Potpuni stack trace za kritične greške te nove funkcije poput get_error_handler() i get_exception_handler() značajno skraćuju vrijeme potrebno za analizu i rješavanje problema.
Modernija sintaksa i alati
Novi pipe operator (|>), funkcije array_first() i array_last(), opcija php --ini=diff te unaprijeđeni URL API omogućuju pisanje čišćeg, sigurnijeg i preglednijeg koda — što se dugoročno odražava i na performanse aplikacija.
Rezultat? Aplikacije rade brže, stabilnije i uz manju potrošnju resursa.
Više o svim novostima možete pročitati na službenoj PHP web stranici.


Preporučeno za tebe
Koliko vam je važan UPTIME?
Često se po forumima i društvenim mrežama čuje kako je prednost imati servere u hrvatskom datacentru. No, da li je doista tako? Istina će vas možda začuditi, ali u Hrvatskoj ne postoji datacentar. U Hrvatskoj postoje serverske sobe koje se smjelo nazivaju “datacentrima”, a ne zadovoljavaju niti osnovne standarde koje jedan datacentar mora zadovoljavati.
Što je dobar i kvalitetan backup?
Sigurnosne kopije web stranica i e-pošte, odnosno backup važniji je nego što mislite. Prema istraživanju codeguard.com, svake 3,5 sekunde dogodi se učinkovit napad na neku web stranicu. Međutim, to nije jedini razlog zašto je sigurnosna kopija podataka toliko važna. Sigurnosna kopija web stranice – vrste prijetnji Ispitali smo 6301 web stranicu temeljenu na WordPress CMS-u […]
8 servisa s besplatnim fotografijama
Koliko ste puta bili u situaciji da vam je za potrebe blog članka, newslettera, online oglasa ili izrade web stranica trebala kvalitetna i dobra fotografija? Fotke su za kvalitetu sadržaja kojeg kreirate jako bitne. Stoga, kada nemate vlastite, najbolje ih je potražiti na online servisima koji nude besplatne fotografije, ilustracije, ikone i drugi vizualni sadržaj. Dio […]
Tražite li dalje?