🐘
Веб-сайт

PHP 8.3 янги имкониятлари: дастурчилар билиши керак бўлган янгиликлар

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

PHP 8.3 версияси 2023-йилнинг охирида расмий равишда чиқди ва у тилнинг ривожланишидаги навбатдаги муҳим қадам бўлди. Бу янгиланиш инқилобий ўзгаришлардан кўра кўпроқ амалий яхшиланишларга эътибор қаратади: код хавфсизлигини ошириб, хатоларни эрта босқичда тутиб оладиган ва кундалик ишни қулайлаштирадиган функциялар қўшилган. Агар сиз Laravel, Symfony ёки ўз лойиҳангизда PHP билан ишласангиз, ушбу янгиликларни билиш кодингизни тоза ва ишончли сақлашда ёрдам беради. Қуйида ҳар бир муҳим имкониятни реал код мисоллари билан батафсил кўриб чиқамиз ва янги ёндашув эскисидан нима билан фарқ қилишини тушунтирамиз.

Типли класс константалари

Аввалги версияларда класс константаларига тип белгилаб бўлмас эди, бу эса катта лойиҳаларда чалкашликка ва қийин топиладиган хатоларга сабаб бўларди. PHP 8.3 да энди сиз константага аниқ тип бириктиришингиз мумкин, бу эса мерос олинган классда константа қиймати нотўғри турга ўзгартирилишининг олдини олади. Бу айниқса катта код базаси устида ишловчи жамоалар учун фойдали, чунки нотўғри тип ишлатилса, PHP дарҳол хато беради ва муаммо ишлаб чиқаришга етиб бормайди.

interface HasLimit {
    const int MAX_USERS = 100;
}

class Service implements HasLimit {
    // Хато: int ни bool га ўзгартириб бўлмайди
    // const bool MAX_USERS = true;
    const int MAX_USERS = 250; // Тўғри
}

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

json_validate() — JSON ни тезроқ текшириш

Илгари келган JSON сатрининг тўғрилигини текшириш учун кўпчилик json_decode() дан фойдаланарди ва кейин хатоларни қараб чиқарди. Лекин бу усул бутун JSON ни хотирада PHP массивига айлантирарди, бу эса катта ҳажмдаги маълумотларда кераксиз хотира сарфига олиб келарди. PHP 8.3 да янги json_validate() функцияси пайдо бўлди, у фақат сатрнинг яроқлилигини текширади ва ҳеч нарсани декодламайди, натижада тезроқ ишлайди ва камроқ хотира ишлатади.

$json = '{"name": "Али", "age": 30}';

if (json_validate($json)) {
    $data = json_decode($json, true);
    // Маълумот билан ишлаш
} else {
    echo "Яроқсиз JSON";
}

Бу функция айниқса API эндпойнтларида фойдали, чунки у ерда фойдаланувчидан келган маълумотни дарҳол фильтрлаш керак. Агар мақсадингиз фақат текшириш бўлса ва маълумотни ҳозирча ишлатмоқчи бўлмасангиз, бу янги функция эски усулдан анча самаралироқ ишлайди ва юқори трафикда сервер юкини камайтиради.

#[Override] атрибути — мерос назорати

Катта лойиҳаларда ота-класс методини фарзанд классда қайта ёзганингизда, баъзан метод номини хато ёзиб қўйиш ёки ота-классда метод номи ўзгаргач коднинг жимгина бузилиши мумкин. Янги #[Override] атрибути методнинг ҳақиқатан ҳам ота-классдаги методни қайта ёзишини PHP га аниқ билдиради. Агар бундай ота метод мавжуд бўлмаса, PHP дарҳол хато беради ва сиз хатони ишлаб чиқаришга чиқармасдан тутиб оласиз.

class BaseController {
    public function handle(): void {}
}

class UserController extends BaseController {
    #[Override]
    public function handle(): void {
        // Ота методни қайта ёзади
    }
}

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

Динамик константа ўқиш

Илгари класс константасини динамик ном орқали ўқиш учун constant() функциясидан фойдаланиш керак эди, бу эса кодни бироз ноқулай қиларди. PHP 8.3 да энди сиз константа номини ўзгарувчи орқали тўғридан-тўғри қавслар ичида кўрсатишингиз мумкин, худди метод ёки хусусиятларда бўлгани каби. Бу синтаксис кодни изчилроқ ва ўқилиши осонроқ қилади.

class Status {
    const ACTIVE = 'active';
    const BLOCKED = 'blocked';
}

$name = 'ACTIVE';
echo Status::{$name}; // 'active'

Бу янгилик энумлар ва созлама класслари билан ишлаганда айниқса қулай, чунки кўпинча қийматни динамик равишда танлаш керак бўлади. Эски constant('Status::' . $name) усулига нисбатан бу анча табиийроқ ва хатога камроқ мойил, чунки IDE бундай кодни яхшироқ таҳлил қила олади.

Randomizer яхшиланишлари ва бошқа ўзгаришлар

PHP 8.2 да киритилган Randomizer класси 8.3 да янги методлар билан кенгайтирилди. Энди getBytesFromString() орқали маълум белгилар тўпламидан тасодифий сатр яратиш мумкин, бу парол ёки токен генерация қилишда жуда қулай. Шунингдек getFloat() ва nextFloat() методлари аниқ диапазонда ишончли тасодифий ҳақиқий сонларни қайтаради.

use Random\Randomizer;

$r = new Randomizer();
$token = $r->getBytesFromString(
    '0123456789abcdef', 16
);
echo $token; // масалан: 'a3f90c7b2e14d8a6'

Бундан ташқари, PHP 8.3 да бир қатор эскирган (deprecated) хусусиятлар белгиланди, масалан get_class() ни аргументсиз чақириш энди огоҳлантириш беради. Бу ўзгаришлар тилни келажакда тоза сақлаш учун зарур. Янгилашга арзийдими деган саволга жавоб: ҳа, чунки 8.3 да ортга мослик бузилиши минимал ва асосан қўшимча хусусиятлар келтиради.

Янгилашга арзийдими ва мослик ҳақида

PHP 8.3 га ўтиш кўпчилик лойиҳалар учун оғриқсиз кечади, чунки катта бузувчи ўзгаришлар йўқ. Агар сиз аллақачон 8.1 ёки 8.2 да бўлсангиз, кодингиз деярли ўзгартиришсиз ишлайди ва сиз янги хавфсизлик ҳамда самарадорлик яхшиланишларидан фойдаланасиз. Янгиланишдан олдин лойиҳангизни тест муҳитида ишга тушириб, эскирган функциялар бўйича огоҳлантиришларни кўриб чиқишни тавсия қиламиз. Умуман олганда, PHP 8.3 замонавий веб-ишлаб чиқиш учун ишончли, тез ва хавфсиз асос бўлиб хизмат қилади.

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

🌾 Қишлоқ хўжалиги ва агро сайти: маҳсулотлар каталоги ❤️ Хайрия фонди сайти: шаффоф ва ишонч 🎉 Тўйxона ва банкет зали сайти: бирон қилиш 🚙 Автомобил ижара сайти: каталог ва бирон
🌐 Тил
🇺🇿 O'zbek 🇺🇿 Ўзбек 🇷🇺 Русский 🇬🇧 English