Vesti

PHP 8.5 – šta je novo

php

PHP 8.5 je objavljen 20. novembra 2025. godine i u ovoj najnovijoj verziji donosi nekoliko korisnih unapređenja koja odmah možete iskoristiti u realnim projektima. Ako pratite razvoj PHP-a kroz verzije 8.0, 8.1, 8.2, 8.3 i 8.4, primetićete da PHP 8.x serija ide u smeru povećanja ergonomije, uklanjanja zastarelih delova jezika i približavanja modernijim rešenjima starih problema, naročito funkcionalnom stilu programiranja i doslednijoj standardnoj biblioteci.

PHP 8.5 nastavlja taj pravac. Umesto jedne velike promene, ovo izdanje donosi niz manjih, dobro promišljenih unapređenja koja naš svakodnevni rad čine jasnijim i efikasnijim.

U ovom tekstu ćemo proći kroz svaku novu funkcionalnost, uz detaljno objašnjenje i praktičan primer.

Pipe operator (|>) — moderniji, funkcionalniji i čitljiviji tok podataka

Pipe operator je jedan od najkorisnijih dodataka u jeziku poslednjih godina, jer menja način na koji čitate i organizujete tok obrade podataka. Ako ste ranije ugnježđavali funkcije, sada možete da ih razvijete u linearan niz koraka.

Važno je da razumete ključnu stvar: pipe operator prosleđuje vrednost kao prvi argument sledećem pozivu. To znači da funkcije ili callback-ovi koji se koriste moraju prihvatati ulaz na toj poziciji.

Pipe operator je idealan tamo gde imate više transformacija nad istim podatkom, npr. sanitizaciju, normalizaciju, map/filter transformacije, generisanje odgovora u API-ju, pre-procesiranje input-a i slične tokove.

Evo konkretnog primera korišćenja:

<?php

$result = "Hello World"

    |> htmlentities(...)

    |> strtolower(...)

    |> str_split(...)

    |> fn($arr) => array_filter($arr, fn($char) => $char !== 'o');

print_r($result);

Ovakav stil daje vam kod koji se čita kao mini-processing pipeline, što u značajnoj meri povećava čitljivost u odnosu na klasično ugnježđivanje:

array_filter(array_map(...array_map(strtolower(htmlentities("Hello World")))...)); // neuporedivo teže za čitanje

Pipe operator postaje najkorisniji kada radite sa data flow funkcijama, pre-processing sistemima, formatiranjem, validacijom i transformisanjem podataka pre nego što ih pošaljete u bazu, API ili šablon.

array_first() i array_last()

Pristup prvoj i poslednjoj vrednosti niza do sada je bio neprijatan i često pun edge-case problema. Postojeće funkcije reset() i end() menjale su interni pointer niza, što je u većim funkcijama moglo da uzrokuje teško otkrivljive bagove. Ručne konstrukcije poput:

$array[array_key_first($array)]

bile su praktične, ali predugačke i ne rade dobro sa dinamičkim izrazima.

PHP 8.5 zato uvodi najjednostavniji mogući pristup:

<?php

$items = [10 => 'a', 40 => 'b', 3 => 'c'];

echo array_first($items); // a

echo array_last($items);  // c

echo array_first([]); // null

Ove funkcije su bezbedne, pouzdane, ne menjaju stanje niza i rade jednako dobro sa:

  • ne-sekvencijalnim ključevima,
  • imenovanim ključevima,
  • mešanim tipovima ključeva,
  • nizovima izračunatim u letu.

Drugim rečima: rešavaju svakodnevni problem na pravilan, čist i konačno elegantan način.

Filter ekstenzija

Filter ekstenzija je dugo bila korisna, ali njeno ponašanje je često bilo tiho: greške validacije vraćale su false ili null, što je zahtevalo dodatnu logiku i ručno detektovanje šta se zapravo dogodilo.

U PHP 8.5 možete da kažete filteru da baci izuzetak kada validacija ne uspe, što pojednostavljuje error-handling i čini tok programa predvidljivijim.

<?php

try {

    $value = filter_var("abc", FILTER_VALIDATE_INT, [

        'flags' => FILTER_FLAG_THROW_ON_FAILURE

    ]);

} catch (Throwable $e) {

    echo "Greška u validaciji: " . $e->getMessage();

}

Ovo je posebno korisno ako radite API validacije, input sanitizaciju, web forme ili sigurnosne filtere.

IntlListFormatter

IntlListFormatter omogućava da formatirate listu stavki na način koji je prirodan jeziku korisnika.

Ako pišete aplikacije koje podržavaju više jezika, znate koliko ručno pravljenje listi može biti komplikovano (posebno kod edge-case-ova kao što su liste duge 1, 2 ili više elemenata).

PHP to sada radi za vas, uz poštovanje pravila jezika:

<?php

$fmt = new IntlListFormatter('sr_RS', IntlListFormatter::TYPE_UNIT);

echo $fmt->format(['jabuka', 'banana', 'kruška']);

// jabuka, banana i kruška

Za engleski bi rezultat bio:

apple, banana, and pear

Ovo rešava kompletnu lokalizaciju listi bez dodatnog ručnog kodiranja.

max_memory_limit

max_memory_limit je nova INI direktiva koja postavlja apsolutni maksimum dozvoljen PHP memorijski limit.

Čak i ako u kodu pokušate da pozovete:

ini_set('memory_limit', '4G');

ovaj limit neće moći da pređe vrednost postavljenu preko max_memory_limit.

Ovo je važno za hosting okruženja, klastere, shared hosting, container-based deployment i sve sisteme u kojima programeri ili skripte ne smeju da podignu potrošnju memorije iznad bezbedne granice.

curl_multi_get_handles

Ako radite sa paralelnim HTTP pozivima, ova funkcija vam omogućava da u svakom trenutku iz multi-cURL resursa izvučete sve aktivne handle-ove i analizirate njihov status.

<?php

$mh = curl_multi_init();

$ch1 = curl_init("https://example.com");

$ch2 = curl_init("https://php.net");

curl_multi_add_handle($mh, $ch1);

curl_multi_add_handle($mh, $ch2);

$handles = curl_multi_get_handles($mh);

print_r($handles);

Koristi se za naprednije praćenje upita, logovanje i kreiranje sistema koji dinamički kontrolišu HTTP operacije.

php --ini=diff

Ova CLI opcija omogućava vam da vidite samo ono što ste promenili u odnosu na podrazumevanu konfiguraciju.
U složenim deployments sistemima ovo je zlata vredno, jer štedi sate traženja odakle dolazi problematična INI vrednost.

php --ini=diff

Rezultat će izlistati samo vrednosti koje se razlikuju, što je veroma korisno za DevOps i debugging.

locale_is_right_to_left i Locale::isRightToLeft

Ako aplikacija treba da podrži jezike poput arapskog ili hebrejskog, mora da zna kada da prebaci UI u RTL režim. Do sada ste to morali da definišete ručno ili preko interne mape.
PHP 8.5 uvodi elegantno i zvanično rešenje:

<?php

var_dump(locale_is_right_to_left("ar"));

var_dump(Locale::isRightToLeft("he_IL"));

Možete automatski menjati CSS, layout, direction atribut i komponente.

Stack trace za fatalne greške

Fatalne greške u PHP-u ranije često nisu pružale dovoljno informacija da razumete šta se tačno dogodilo. U PHP-u 8.5 stack trace je uključen podrazumevano, čak i za najkritičnije fatalne greške.

To znači da ako dobijete:

class A {}

class A {} // redeklaracija

bićete nagrađeni kompletnom, jasnom putanjom do greške:

Fatal error: Cannot redeclare class A...

Stack trace:

#0 index.php(10): ...

Debug postaje dramatično lakši.

get_exception_handler() i get_error_handler()

Do sada niste mogli da proverite koji handler je aktivan, ni iz aplikacije ni iz biblioteke.
Sada konačno imate tu mogućnost.

<?php

set_error_handler(fn() => true);

$handler = get_error_handler();

var_dump($handler);

Ovo je važan dodatak za biblioteke, framework-ove i sve situacije gde je važno znati koji sistem trenutno preuzima kontrolu nad greškama.

PHP_BUILD_PROVIDER i PHP_BUILD_DATE

Ove dve konstante vam govore:

  • ko je buildovao PHP (distribucija, vendor, custom builder),
  • kada je buildovan.
<?php

echo PHP_BUILD_PROVIDER;

echo PHP_BUILD_DATE;

Ako radite u enterprise okruženju, sa više servera, različitim imidžima i custom build-ovima, ove informacije su ključne za audit, logovanje i nadzor.

Zaključak

Sve funkcionalnosti koje smo vam ovde predstavili prave razliku u svakodnevnom radu. Pipe operator čini kod preglednijim i savremenijim, array_first i array_last uklanjaju jedan od najstarijih problema u PHP-u, filter izuzeci omogućavaju strožu validaciju, a intl i cURL ekstenzije dobijaju dugo očekivana proširenja. Debugging je jasniji, konfiguracija transparentnija, a introspekcija handlera napokon moguća.

Na kraju možemo da zaključimo da je PHP 8.5 zrelo, lepo zaokruženo izdanje koje vam daje moderniji, stabilniji i prijatniji jezik za rad, bez potrebe da menjate postojeći kod.

Ostavi komentar

Vaša adresa neće biti objavljena