PHP 8.1 dasturlash tilining chiqarilishi

Bir yillik rivojlanishdan so'ng, PHP 8.1 dasturlash tilining chiqarilishi taqdim etildi. Yangi filial bir qator yangi xususiyatlarni, shuningdek, muvofiqlikni buzadigan bir nechta o'zgarishlarni o'z ichiga oladi.

PHP 8.1 da asosiy yaxshilanishlar:

  • Ro'yxatlar uchun qo'shimcha yordam, masalan, endi siz quyidagi konstruksiyalardan foydalanishingiz mumkin: enum Status { case Pending; case Active; Arxivlangan holat; } class Post { umumiy funktsiya __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Holat::Faol);
  • Tolalar deb nomlangan engil iplar uchun qo'shimcha qo'llab-quvvatlash, bu sizga past darajadagi ijro iplarini boshqarish imkonini beradi. Amphp va ReactPHP ramkalariga tolali yordam qo'shilishi rejalashtirilgan. $fiber = new Fiber(funksiya (): void { $valueAfterResuming = Fiber ::suspend ('to'xtatilgandan keyin'); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume ('dastlashdan keyin');
  • Ob'ekt kodi keshini (opcache) amalga oshirish takomillashtirildi, bu sinf merosi haqidagi ma'lumotlarni keshlash imkonini beradi. Optimallashtirish ayrim ilovalarning unumdorligini 5-8 foizga oshirish imkonini berdi. Boshqa optimallashtirishlarga JIT ishini optimallashtirish, ARM64 arxitekturasi (AAarch64) uchun JIT-ni qo'llab-quvvatlashni amalga oshirish, nom aniqlanishini tezlashtirish, timelib va ​​ext/sana kutubxonalarini optimallashtirish, ortib ketma-ketlashtirish va seriyadan chiqarish unumdorligi, get_declared_classes(), explode() ni optimallashtirish kiradi. , strtr() funksiyasi, strrnatcmp(), dechex(). Umuman olganda, Symfony Demo uchun unumdorlik 23.0%, WordPress uchun esa 3.5% o'sgan.
  • Yangi massivni belgilashda mavjud massivlarni almashtirish imkonini beruvchi “...$var” massivlari ichidagi paketni ochish operatori qatorli kalitlarni qo‘llab-quvvatlash uchun kengaytirilgan (ilgari faqat raqamli identifikatorlar qo‘llab-quvvatlanar edi). Masalan, endi siz kodda foydalanishingiz mumkin: $array1 = [“a” => 1]; $massiv2 = ["b" => 2]; $massiv = [“a” => 0, …$massiv1, …$massiv2]; var_dump($massiv); // ["a" => 1, "b" => 2]
  • Initsializatorlarda, masalan, funksiya ta'riflarida standart parametr sifatida yoki argument atributlarida "yangi" kalit so'zdan foydalanishga ruxsat beriladi. class MyController { umumiy funktsiya __construct( xususiy Logger $logger = new NullLogger(), ) {} }
  • Faqat o'qish uchun ruxsat uchun sinf xususiyatlarini belgilash mumkin (bunday xususiyatlardagi ma'lumotlar faqat bir marta yozilishi mumkin, keyin uni o'zgartirish uchun mavjud bo'lmaydi). class PostData { umumiy funktsiya __construct( faqat o'qish uchun umumiy satr $title, faqat umumiy o'qish uchun DateTimeImmutable $date, ) {} } $post = new Post(‘Title’, /* … */); $post->title = ‘Boshqa’; > Xato: Post::$title faqat oʻqish xususiyatini oʻzgartirib boʻlmadi
  • Chaqirilishi mumkin bo'lgan ob'ektlar uchun yangi sintaksis amalga oshirildi - endi yopilish funksiyani chaqirish va unga argument sifatida "..." qiymatini berish orqali tuzilishi mumkin (masalan, Closure::fromCallable('myFunc) o'rniga myFunc(...)). ')): foo funktsiyasi (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Mavjudlarini birlashtirib, yangi turlarni yaratish imkonini beruvchi kesishma turlari uchun toʻliq qoʻllab-quvvatlash qoʻshildi. Ikki yoki undan ortiq turdagi to'plamlarni belgilaydigan birlashma turlaridan farqli o'laroq, kesishish turlari sanab o'tilgan turlarning birortasi emas, balki to'ldiriladigan to'plamdagi barcha ko'rsatilgan turlarning mavjudligini talab qiladi. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Statik analizatorlarga funktsiya dasturning bajarilishini to'xtatishi haqida xabar berish uchun ishlatilishi mumkin bo'lgan yangi "hech qachon" turi mavjud, masalan, istisno qilish yoki chiqish funktsiyasini bajarish. funktsiya dd(mixed $input): never { exit; }
  • Yangi array_is_list funksiyasi taklif qilindi, bu massivdagi tugmachalarning 0 dan boshlab raqamli qiymatlarni oshirish tartibida joylashishini aniqlash imkonini beradi: $list = [“a”, “b”, “c”]; array_is_list ($ro'yxat); // haqiqiy $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // yolg'on
  • Endi siz ota-sinf konstantalarini bekor qilishning oldini olish uchun "yakuniy" kalit so'zidan foydalanishingiz mumkin. class Foo { final public const X = "foo"; } class Bar kengaytiriladi Foo { public const X = "bar"; > Muhim xato: Bar::X oxirgi doimiy Foo::Xni bekor qila olmaydi }
  • Fsync va fdatasync funksiyalari o'zgarishlarni disk keshidan saqlashga majbur qilish uchun taklif etiladi. $fayl = fopen("sample.txt", "w"); fwrite($fayl, "Ba'zi tarkib"); if (fsync($file)) { echo "Fayl diskda muvaffaqiyatli saqlandi."; } fclose($fayl);
  • Oldin ishlatilgan "0" prefiksiga qo'shimcha ravishda sakkizlik sonlar uchun "0o" va "0O" prefikslaridan foydalanish imkoniyati qo'shildi. 016 === 0o16; // rost 016 === 0O16; // rost
  • $GLOBALS dan foydalanishni tanlab cheklash taklif qilinmoqda, bu orqaga qarab muvofiqlikning buzilishiga olib keladi, lekin massivlar bilan operatsiyalarni sezilarli darajada tezlashtirishga imkon beradi. Masalan, $GLOBALS-ga yozishni o'chirib qo'yish va $GLOBALS-ni ko'rsatgich orqali o'tkazish imkoniyati ko'rib chiqilmoqda. 2000 ta paketni tahlil qilish shuni ko'rsatdiki, ulardan faqat 23 tasi ushbu o'zgarishga ta'sir qiladi. Misol uchun, agar taklif ma'qullansa, 8.1 boshqa iboralarni qo'llab-quvvatlamaydi, masalan: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
  • Ichki usullar endi to'g'ri turni qaytarishi kerak. PHP 8.1 da funksiya deklaratsiyasiga mos kelmaydigan turni qaytarish ogohlantirishni keltirib chiqaradi, ammo PHP 9.0 da ogohlantirish xato bilan almashtiriladi.
  • Funksiyalarni resurslardan foydalanishdan obyektlarni manipulyatsiya qilishga o‘tkazish bo‘yicha ishlar davom ettirildi. Finfo_* va imap_* funktsiyalari ob'ektlarga o'tkazildi.
  • Null bo'lmagan deb belgilangan ichki funktsiyalarga argument sifatida null qiymatlarni o'tkazish bekor qilindi. PHP 8.1 da str_contains("string", null) kabi konstruksiyalardan foydalanish ogohlantirishga, PHP 9 da xatolikka olib keladi.
  • MurmurHash3 va xxHash xeshing algoritmlari uchun qo'shimcha qo'llab-quvvatlash.

Manba: opennet.ru

a Izoh qo'shish