🐘
Hosting

PHP 8.4 yangiliklari: property hooks, asimmetrik ko'rinish va boshqalar

06.11.2026
← Barcha maqolalar

PHP 8.4 versiyasi 2024-yil noyabr oyida chiqdi va so'nggi yillardagi eng sezilarli yangilanishlardan biri bo'ldi. Unda klass xususiyatlari bilan ishlashni tubdan o'zgartiradigan property hooks, xususiyatni o'qish va yozish huquqini ajratish imkoniyati, massivlar uchun yangi funksiyalar va HTML5 ni to'g'ri tushunadigan yangi DOM interfeysi paydo bo'ldi. Ushbu maqolada bu yangiliklarni oddiy misollar bilan ko'rib chiqamiz va hostingdagi saytni 8.4 ga o'tkazishdan oldin nimalarga e'tibor berish kerakligini tushuntiramiz.

Property hooks: getter va setter'larsiz tekshiruv

Avval klass xususiyatiga qiymat yozishda tekshiruv qilish uchun xususiyatni yopiq qilib, alohida getNomi() va setNomi() metodlarini yozish kerak edi. Bu juda ko'p takrorlanuvchi kod hosil qilardi. PHP 8.4 da esa tekshiruv va o'zgartirish mantiqini to'g'ridan-to'g'ri xususiyatning o'ziga biriktirish mumkin. Tashqi kod oddiy xususiyat bilan ishlayotgandek ko'rinadi, lekin har bir yozish yoki o'qishda siz belgilagan kod ishlaydi.

Misol uchun, Toshkentdagi kichik internet-do'kon uchun mahsulot klassini olaylik. Mahsulot nomidagi ortiqcha bo'shliqlar avtomatik olib tashlansin, narx esa manfiy bo'lmasin. Bundan tashqari, nom va narxdan avtomatik tuziladigan to'liq nom ham kerak bo'lsin:

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

Bu yerda $toliqNomi virtual xususiyat hisoblanadi: unga hech narsa yozilmaydi, har safar o'qilganda qiymat qayta hisoblanadi. Hooks interfeyslarda ham e'lon qilinishi mumkin, ya'ni interfeys endi nafaqat metodlarni, balki xususiyatlarni ham talab qila oladi. Bu katta loyihalarda kodni ancha tozaroq qiladi.

Asimmetrik ko'rinish: tashqaridan o'qish, ichkaridan yozish

Ko'p hollarda xususiyatni hamma o'qishi mumkin bo'lishi, lekin faqat klassning o'zi o'zgartirishi kerak bo'ladi. Masalan, buyurtma holati tashqi kodga ko'rinishi kerak, ammo uni faqat maxsus metod orqali o'zgartirish lozim. PHP 8.4 da buning uchun yozish huquqini alohida ko'rsatish mumkin:

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

Avval bunday natijaga erishish uchun yopiq xususiyat va alohida getter metod yozilardi. Endi bitta qator yetarli. protected(set) varianti esa voris klasslarga ham yozish imkonini beradi.

Massivlar uchun yangi funksiyalar

PHP 8.4 da massivdan shartga mos elementni topish uchun to'rtta yangi funksiya qo'shildi: array_find(), array_find_key(), array_any() va array_all(). Ular avval foreach sikli yoki array_filter() bilan yoziladigan kodni ancha qisqartiradi. Samarqanddagi klinikaning qabulga yozilish tizimidan misol keltiramiz:

$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']);

Kichik, lekin foydali o'zgarishlar

Yangi obyekt yaratib, darhol uning metodini chaqirish uchun endi qavslarga o'rash shart emas. Avval (new DateTimeImmutable())->format('Y-m-d') deb yozilardi, endi new DateTimeImmutable()->format('Y-m-d') yetarli. Bu kichik qulaylik bo'lsa ham, kodni o'qishni osonlashtiradi.

Ko'p tilli saytlar uchun mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst() va mb_lcfirst() funksiyalari qo'shildi. Ular kirill va boshqa ko'p baytli belgilar bilan to'g'ri ishlaydi, shuning uchun o'zbek va rus tilidagi matnlarni qayta ishlashda foydali. Yana bir yangilik #[\Deprecated] atributi bo'lib, u o'z kodingizdagi eskirgan funksiyalarni belgilash va ular chaqirilganda ogohlantirish chiqarish imkonini beradi.

DOM kengaytmasida Dom\HTMLDocument klassi paydo bo'ldi. U HTML5 hujjatlarni brauzerlar kabi to'g'ri tahlil qiladi va CSS selektorlari bilan element qidirishni qo'llab-quvvatlaydi. Shuningdek, lazy objects deb ataladigan mexanizm qo'shildi: obyekt haqiqatan ishlatilgunga qadar yaratilmaydi. Bu asosan freymvorklar va kutubxonalar uchun mo'ljallangan.

Eskirgan imkoniyatlar va olib tashlangan kengaytmalar

Yangi versiyaga o'tishdan oldin eskirgan narsalarni bilish muhim, chunki ular ko'pincha jurnalda ogohlantirishlar ko'payishiga olib keladi. Eng ko'p uchraydigani yashirin nullable turi: function saqla(Mahsulot $m = null) ko'rinishidagi yozuv endi eskirgan deb hisoblanadi va uni ?Mahsulot $m = null deb yozish kerak. Eski plaginlarda bunday yozuvlar juda ko'p, shuning uchun 8.4 ga o'tgach jurnalda Deprecated xabarlari ko'payishi mumkin.

Hostingdagi saytni 8.4 ga o'tkazish

Yangi imkoniyatlar faqat yangi kod yozganda foyda beradi, mavjud saytni 8.4 ga o'tkazishning asosiy maqsadi esa tezlik va uzoqroq xavfsizlik qo'llab-quvvatlashidir. Avval CMS, mavzu va plaginlaringiz 8.4 ni qo'llab-quvvatlashini tekshiring. Keyin sayt fayllari va bazasining zaxira nusxasini oling va iloji bo'lsa sinov nusxasida sinab ko'ring.

sayt.uz hostingida PHP versiyasi har bir sayt uchun ISPmanager panelida alohida tanlanadi, shuning uchun bitta saytni 8.4 ga o'tkazish boshqalariga ta'sir qilmaydi. O'tgandan keyin bir-ikki kun davomida xatolar jurnalini kuzatib boring. Agar Fatal error paydo bo'lsa, avvalgi versiyani qaytarib tanlang va muammoni xotirjam tuzating. Faqat Deprecated ogohlantirishlari bo'lsa, sayt ishlashda davom etadi, lekin bu ogohlantirishlar keyingi versiyalarda xatoga aylanishi mumkinligini unutmang.

O'xshash maqolalar

🟢 Nuxt ilovasini serverga joylash: SSR rejim, statik generatsiya, PM2 va Nginx 📧 ISPmanager'da korporativ pochta qutisi yaratish va sozlash 🔀 nvm bilan Node.js versiyalarini boshqarish: o'rnatish, almashtirish va .nvmrc 🚀 Uzilishsiz deploy: symlink va release papkalari bilan saytni yangilash
🌐 Til
🇺🇿 O'zbek ✓ 🇺🇿 Ўзбек 🇷🇺 Русский 🇬🇧 English