PHP 8.5 версияси 2025-йил ноябрь ойида чиқди. У 8.4 каби катта туб ўзгаришлар олиб келмади, лекин кундалик код ёзишни сезиларли қулайлаштирадиган бир нечта янгилик қўшди. Энг кўп муҳокама қилингани pipe оператори бўлди, у функцияларни кетма-кет занжир қилиб чақириш имконини беради. Бундан ташқари, URL манзиллар билан ишлаш учун янги стандарт кенгайтма, массивнинг биринчи ва охирги элементини олиш функциялари ва натижани эътиборсиз қолдиришдан огоҳлантирадиган атрибут пайдо бўлди. Қуйида ҳар бирини амалий мисоллар билан кўриб чиқамиз.
Pipe оператори: ичма-ич чақирувлар ўрнига занжир
PHP'да бир қийматни бир нечта функциядан кетма-кет ўтказиш керак бўлганда код одатда ичма-ич ёзилади. Масалан, мақола сарлавҳасидан URL учун қисқа ном ясашда аввал бўшлиқларни олиб ташлаш, кейин кичик ҳарфга ўтказиш, сўнг бўшлиқларни чизиқча билан алмаштириш керак. Ичма-ич ёзилган код ўнгдан чапга ўқилади ва қавслар кўпайиб кетади. Янги |> оператори эса қийматни чапдан ўнгга, худди иш кетма-кетлигидек ўтказади.
Бухородаги меҳмонхона сайти учун хона саҳифаларининг манзилини ясайдиган кодни солиштириб кўрамиз:
$сарлавҳа = ' Люкс Хона Бог Томонда ';
// Аввалги усул: ичма-ич чақирувлар
$слуг = str_replace(' ', '-', стртолоwер(трим($сарлавҳа)));
// PHP 8.5: pipe оператори
$слуг = $сарлавҳа
|> трим(...)
|> стртолоwер(...)
|> (фн($с) => str_replace(' ', '-', $с));
эчо $слуг; // люкс-хона-бог-томонда
Бу ерда эътибор бериш керак бўлган икки қоида бор. Биринчидан, операторнинг ўнг томонида битта параметр қабул қиладиган чақириладиган ифода туриши керак, шунинг учун trim(...) каби биринчи даражали чақирув синтаксиси ишлатилади. Иккинчидан, ўқ функцияси (fn) ишлатилса, уни қавсга олиш шарт, акс ҳолда синтаксис хатоси чиқади. Бир нечта параметр талаб қиладиган функциялар, масалан str_replace(), айнан шундай ўқ функцияси ичига ўралади.
Клонлашда хусусиятларни ўзгартириш
PHP 8.1 дан бери readonly хусусиятлар мавжуд, лекин уларнинг битта қиймати ўзгарган нусхасини яратиш ноқулай эди: клонланган объектда readonly хусусиятни қайта ёзиб бўлмайди. PHP 8.5 да clone() иккинчи аргумент сифатида янги қийматлар массивини қабул қилади. Бу ўзгармас объектлар билан ишлашни анча соддалаштиради.
final class Narx
{
public function __construct(
public readonly int $summa,
public readonly string $valyuta = 'UZS',
) {}
public function chegirma(int $foiz): static
{
return clone($this, ['summa' => intdiv($this->summa * (100 - $foiz), 100)]);
}
}
$narx = new Narx(400000);
$yangi = $narx->chegirma(10);
echo $yangi->summa; // 360000
URI кенгайтмаси: манзилларни тўғри таҳлил қилиш
Узоқ йиллар давомида PHP'да URL манзилни қисмларга ажратиш учун parse_url() функцияси ишлатилган. Лекин у ҳеч қайси расмий стандартга тўлиқ мос келмайди ва баъзи ғайриоддий манзилларни браузердан бошқача тушунади, бу эса хавфсизлик муаммоларига сабаб бўлиши мумкин. PHP 8.5 да стандарт таркибга кирувчи URI кенгайтмаси қўшилди. Унда икки хил класс бор: RFC 3986 стандартига мос Uri\Rfc3986\Uri ва браузерлар ишлатадиган WHATWG стандартига мос Uri\WhatWg\Url.
$uri = new Uri\Rfc3986\Uri('https://example.uz/katalog?sahifa=2');
echo $uri->getHost(); // example.uz
echo $uri->getPath(); // /katalog
echo $uri->getQuery(); // sahifa=2
Бу кенгайтма айниқса фойдаланувчи киритган ҳаволаларни текширадиган сайтлар учун фойдали. Масалан, фақат ўз доменингизга қайта йўналтиришга рухсат бериш керак бўлса, манзилни браузер тушунганидек таҳлил қилиш очиқ қайта йўналтириш заифлигидан ҳимоя қилишга ёрдам беради.
array_first(), array_last() ва NoDiscard атрибути
Массивнинг биринчи ёки охирги элементини олиш учун илгари reset(), end() ёки array_key_first() билан мураккаб ёзувлар керак эди. Энди array_first() ва array_last() функциялари тўғридан-тўғри қийматни қайтаради, массив бўш бўлса эса null беради. Бу, масалан, сўнгги буюртмани ёки энг биринчи изоҳни олишда кодни қисқартиради.
#[\NoDiscard] атрибути билан белгиланган функциянинг натижаси ишлатилмаса, PHP огоҳлантириш беради. Бу натижаси муҳим бўлган функциялар учун мўлжалланган, масалан хато ҳолатини қайтарадиган сақлаш функцияси. Агар натижани атайлаб эътиборсиз қолдирмоқчи бўлсангиз, чақирув олдидан (void) ёзилади.
#[\NoDiscard("saqlash natijasini tekshiring")]
function saqla(array $malumot): bool
{
// ... bazaga yozish
return true;
}
saqla($forma); // Warning: natija ishlatilmadi
$ok = saqla($forma); // to'g'ri
(void) saqla($forma); // ataylab e'tiborsiz
Хатоларни тузатишни осонлаштирадиган ўзгаришлар
Аввал Fatal error юз берганда, масалан хотира тугаганда ёки бажарилиш вақти ошганда, журналда фақат хато бўлган қатор кўрсатиларди. PHP 8.5 да бундай хатолар учун ҳам чақирувлар занжири (backtrace) чиқарилади, шунинг учун муаммога қайси йўл орқали келинганини аниқлаш осонлашди. Яна get_error_handler() ва get_exception_handler() функциялари қўшилди, улар жорий ўрнатилган хато ишловчисини қайтаради.
Шунингдек, доимий ифодаларда, масалан атрибут параметрларида, статик аноним функциялардан фойдаланиш мумкин бўлди. Бу текширув қоидаларини атрибутлар орқали эълон қиладиган фреймворклар учун қулай. Такрорий сўровларда DNS ва уланиш маълумотларини қайта ишлатиш учун cURL'нинг доимий улашиладиган дастаклари ҳам қўшилди.
Эскирган нарсалар ва ўтишдан олдинги текширув
PHP 8.5 да бир нечта эски ёзув усуллари эскирган деб белгиланди. Улардан энг кўп учрайдиганлари:
- Тескари тирноқ оператори, яъни
`ls -la`кўринишидаги буйруқ бажариш, эскирган. Унинг ўрнигаshell_exec()ишлатилади. - Ностандарт тур ўзгартириш номлари
(boolean),(integer),(double)ва(binary)эскирган. Уларнинг ўрнига(bool),(int),(float)ва(string)ёзилади.
Бу ўзгаришлар сайт ишлашини тўхтатмайди, лекин журналда Deprecated огоҳлантиришларини кўпайтиради. Сайтни 8.5 га ўтказишдан олдин CMS ва плагинларингизнинг ушбу версияни расман қўллаб-қувватлашини текширинг, чунки янги версия чиққандан кейин баъзи плагинларга мослашиш учун вақт керак бўлади. Ишлаб турган сайт учун кўпинча аввал синов нусхасида текшириб, кейин асосий сайтга ўтиш энг хавфсиз йўл.
sayt.uz хостингида PHP версияси ISPmanager панелида ҳар бир сайт учун алоҳида танланади, шунинг учун 8.5 ни аввал битта синов субдоменида, масалан test.example.uz да синаб кўриш мумкин. Агар панелда керакли версия кўринмаса, кабинет орқали техник ёрдамга мурожаат қилиб, унинг мавжудлигини аниқланг.