🐘
Хостинг

PHP 8.4 янгиликлари: property hooks, асимметрик кўриниш ва бошқалар

06.11.2026
← Барча мақолалар

PHP 8.4 версияси 2024-йил ноябрь ойида чиқди ва сўнгги йиллардаги энг сезиларли янгиланишлардан бири бўлди. Унда класс хусусиятлари билан ишлашни тубдан ўзгартирадиган property hooks, хусусиятни ўқиш ва ёзиш ҳуқуқини ажратиш имконияти, массивлар учун янги функциялар ва HTML5 ни тўғри тушунадиган янги DOM интерфейси пайдо бўлди. Ушбу мақолада бу янгиликларни оддий мисоллар билан кўриб чиқамиз ва хостингдаги сайтни 8.4 га ўтказишдан олдин нималарга эътибор бериш кераклигини тушунтирамиз.

Property hooks: геттер ва сеттерларсиз текширув

Аввал класс хусусиятига қиймат ёзишда текширув қилиш учун хусусиятни ёпиқ қилиб, алоҳида getNomi() ва setNomi() методларини ёзиш керак эди. Бу жуда кўп такрорланувчи код ҳосил қиларди. PHP 8.4 да эса текширув ва ўзгартириш мантиқини тўғридан-тўғри хусусиятнинг ўзига бириктириш мумкин. Ташқи код оддий хусусият билан ишлаётгандек кўринади, лекин ҳар бир ёзиш ёки ўқишда сиз белгилаган код ишлайди.

Мисол учун, Тошкентдаги кичик интернет-дўкон учун маҳсулот классини олайлик. Маҳсулот номидаги ортиқча бўшлиқлар автоматик олиб ташлансин, нарх эса манфий бўлмасин. Бундан ташқари, ном ва нархдан автоматик тузиладиган тўлиқ ном ҳам керак бўлсин:

class Mahsulot
{
    public string $nomi {
        set(string $value) {
            $this->nomi = trim($value);
        }
    }

    public int $narx {
        set(int $value) {
            if ($value < 0) {
                throw new InvalidArgumentException("Narx manfiy bo'lishi mumkin emas");
            }
            $this->narx = $value;
        }
    }

    // Virtual xususiyat: faqat o'qiladi, xotirada saqlanmaydi
    public string $toliqNomi {
        get => $this->nomi . ' - ' . number_format($this->narx, 0, '.', ' ') . " so'm";
    }
}

$m = new Mahsulot();
$m->nomi = '  Choynak  ';
$m->narx = 85000;
echo $m->toliqNomi; // Choynak - 85 000 so'm

Бу ерда $toliqNomi виртуал хусусият ҳисобланади: унга ҳеч нарса ёзилмайди, ҳар сафар ўқилганда қиймат қайта ҳисобланади. Hooks интерфейсларда ҳам эълон қилиниши мумкин, яъни интерфейс энди нафақат методларни, балки хусусиятларни ҳам талаб қила олади. Бу катта лойиҳаларда кодни анча тозароқ қилади.

Асимметрик кўриниш: ташқаридан ўқиш, ичкаридан ёзиш

Кўп ҳолларда хусусиятни ҳамма ўқиши мумкин бўлиши, лекин фақат класснинг ўзи ўзгартириши керак бўлади. Масалан, буюртма ҳолати ташқи кодга кўриниши керак, аммо уни фақат махсус метод орқали ўзгартириш лозим. PHP 8.4 да бунинг учун ёзиш ҳуқуқини алоҳида кўрсатиш мумкин:

class Buyurtma
{
    public private(set) string $holat = 'yangi';

    public function tolash(): void
    {
        $this->holat = 'tolangan';
    }
}

$b = new Buyurtma();
echo $b->holat;        // yangi
$b->tolash();
echo $b->holat;        // tolangan
$b->holat = 'bekor';   // Error: tashqaridan yozish taqiqlangan

Аввал бундай натижага эришиш учун ёпиқ хусусият ва алоҳида геттер метод ёзиларди. Энди битта қатор етарли. protected(set) варианти эса ворис классларга ҳам ёзиш имконини беради.

Массивлар учун янги функциялар

PHP 8.4 да массивдан шартга мос элементни топиш учун тўртта янги функция қўшилди: array_find(), array_find_key(), array_any() ва array_all(). Улар аввал foreach цикли ёки array_filter() билан ёзиладиган кодни анча қисқартиради. Самарқанддаги клиниканинг қабулга ёзилиш тизимидан мисол келтирамиз:

$qabullar = [
    ['id' => 1, 'shifokor' => 'Karimov', 'tasdiqlangan' => true],
    ['id' => 2, 'shifokor' => 'Aliyeva', 'tasdiqlangan' => false],
    ['id' => 3, 'shifokor' => 'Karimov', 'tasdiqlangan' => true],
];

// Birinchi tasdiqlanmagan qabul
$kutilayotgan = array_find($qabullar, fn($q) => !$q['tasdiqlangan']);

// Hech bo'lmasa bitta tasdiqlanmagan qabul bormi?
$bormi = array_any($qabullar, fn($q) => !$q['tasdiqlangan']);

// Hammasi tasdiqlanganmi?
$hammasi = array_all($qabullar, fn($q) => $q['tasdiqlangan']);

Кичик, лекин фойдали ўзгаришлар

Янги объект яратиб, дарҳол унинг методини чақириш учун энди қавсларга ўраш шарт эмас. Аввал (new DateTimeImmutable())->format('Y-m-d') деб ёзиларди, энди new DateTimeImmutable()->format('Y-m-d') етарли. Бу кичик қулайлик бўлса ҳам, кодни ўқишни осонлаштиради.

Кўп тилли сайтлар учун mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst() ва mb_lcfirst() функциялари қўшилди. Улар кирилл ва бошқа кўп байтли белгилар билан тўғри ишлайди, шунинг учун ўзбек ва рус тилидаги матнларни қайта ишлашда фойдали. Яна бир янгилик #[\Deprecated] атрибути бўлиб, у ўз кодингиздаги эскирган функцияларни белгилаш ва улар чақирилганда огоҳлантириш чиқариш имконини беради.

DOM кенгайтмасида Dom\HTMLDocument класси пайдо бўлди. У HTML5 ҳужжатларни браузерлар каби тўғри таҳлил қилади ва CSS селекторлари билан элемент қидиришни қўллаб-қувватлайди. Шунингдек, lazy objects деб аталадиган механизм қўшилди: объект ҳақиқатан ишлатилгунга қадар яратилмайди. Бу асосан фреймворклар ва кутубхоналар учун мўлжалланган.

Эскирган имкониятлар ва олиб ташланган кенгайтмалар

Янги версияга ўтишдан олдин эскирган нарсаларни билиш муҳим, чунки улар кўпинча журналда огоҳлантиришлар кўпайишига олиб келади. Энг кўп учрайдигани яширин nullable тури: function saqla(Mahsulot $m = null) кўринишидаги ёзув энди эскирган деб ҳисобланади ва уни ?Mahsulot $m = null деб ёзиш керак. Эски плагинларда бундай ёзувлар жуда кўп, шунинг учун 8.4 га ўтгач журналда Deprecated хабарлари кўпайиши мумкин.

Хостингдаги сайтни 8.4 га ўтказиш

Янги имкониятлар фақат янги код ёзганда фойда беради, мавжуд сайтни 8.4 га ўтказишнинг асосий мақсади эса тезлик ва узоқроқ хавфсизлик қўллаб-қувватлашидир. Аввал CMS, мавзу ва плагинларингиз 8.4 ни қўллаб-қувватлашини текширинг. Кейин сайт файллари ва базасининг захира нусхасини олинг ва иложи бўлса синов нусхасида синаб кўринг.

sayt.uz хостингида PHP версияси ҳар бир сайт учун ISPmanager панелида алоҳида танланади, шунинг учун битта сайтни 8.4 га ўтказиш бошқаларига таъсир қилмайди. Ўтгандан кейин бир-икки кун давомида хатолар журналини кузатиб боринг. Агар Fatal error пайдо бўлса, аввалги версияни қайтариб танланг ва муаммони хотиржам тузатинг. Фақат Deprecated огоҳлантиришлари бўлса, сайт ишлашда давом этади, лекин бу огоҳлантиришлар кейинги версияларда хатога айланиши мумкинлигини унутманг.

Ўхшаш мақолалар

🟢 Nuxt иловасини серверга жойлаш: SSR режим, статик генерация, PM2 ва Nginx 📧 ISPmanager'да корпоратив почта қутиси яратиш ва созлаш 🔀 nvm билан Node.js версияларини бошқариш: ўрнатиш, алмаштириш ва .nvmrc 🚀 Узилишсиз деплой: симлинк ва релиз папкалари билан сайтни янгилаш
🌐 Тил
🇺🇿 O'zbek 🇺🇿 Ўзбек ✓ 🇷🇺 Русский 🇬🇧 English