PHP 8.1 proqramlaşdırma dili buraxılışı

Bir illik inkişafdan sonra PHP 8.1 proqramlaşdırma dilinin buraxılışı təqdim olundu. Yeni filiala bir sıra yeni funksiyalar, eləcə də uyğunluğu pozan bir neçə dəyişiklik daxildir.

PHP 8.1-də əsas təkmilləşdirmələr:

  • Sadalamalar üçün əlavə dəstək, məsələn, indi aşağıdakı konstruksiyalardan istifadə edə bilərsiniz: enum Status { case Pending; case Active; Arxivləşdirilmiş iş; } class Post { ictimai funksiya __construct( şəxsi Status $status = Status::Pending; ) {} ictimai funksiya setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • İcra iplərini aşağı səviyyədə idarə etməyə imkan verən Fibers adlı yüngül iplər üçün əlavə dəstək. Fiber dəstəyinin Amphp və ReactPHP çərçivələrinə əlavə edilməsi planlaşdırılır. $lif = yeni Fiber(funksiya (): void { $valueAfterResuming = Fiber::suspend('dayandırıldıqdan sonra'); // ... }); $valueAfterSuspending = $fiber->start(); $fiber->resume('davam etdikdən sonra');
  • Obyekt kodu keşinin (opcache) tətbiqi təkmilləşdirilərək, sinif irsi haqqında məlumatı keş etməyə imkan verir. Optimallaşdırma bəzi tətbiqlərin məhsuldarlığını 5-8% artırmağa imkan verdi. Digər optimallaşdırmalara JIT əməliyyatının optimallaşdırılması, ARM64 arxitekturası (AAarch64) üçün JIT dəstəyinin həyata keçirilməsi, ad həllinin sürətləndirilməsi, timelib və ext/date kitabxanalarının optimallaşdırılması, artan seriallaşdırma və sıradan çıxarma performansı, get_declared_classes(), explode() funksiyalarının optimallaşdırılması daxildir. , strtr() funksiyası, strrnatcmp(), dechex(). Ümumilikdə, Symfony Demo üçün 23.0%, WordPress üçün isə 3.5% performans artımı var.
  • Yeni massiv müəyyən edilərkən mövcud massivləri əvəz etməyə imkan verən "...$var" massivlərinin içərisindəki qablaşdırma operatoru sətir düymələrini dəstəkləmək üçün genişləndirilmişdir (əvvəllər yalnız rəqəmsal identifikatorlar dəstəklənirdi). Məsələn, indi kodda istifadə edə bilərsiniz: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $massiv = [“a” => 0, …$massiv1, …$massiv2]; var_dump($massiv); // ["a" => 1, "b" => 2]
  • "Yeni" açar sözünün başlanğıc parametrlərində, məsələn, funksiya təriflərində standart parametr kimi və ya arqument atributlarında istifadə edilməsinə icazə verilir. class MyController { ictimai funksiya __construct( şəxsi Logger $logger = yeni NullLogger(), ) {} }
  • Yalnız oxumaq üçün giriş üçün sinif xüsusiyyətlərini qeyd etmək mümkündür (belə xassələrdə məlumat yalnız bir dəfə yazıla bilər, bundan sonra onu dəyişdirmək mümkün olmayacaq). class PostData { ictimai funksiya __konstruksiya (yalnız oxunan sətir $başlıq, yalnız oxumaq üçün açıq olan DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Digər'; > Xəta: Yalnız oxumaq xüsusiyyətini dəyişdirmək mümkün deyil Post::$title
  • Çağırılan obyektlər üçün yeni sintaksis tətbiq edilib - indi bağlanma funksiyanı çağıraraq və ona arqument kimi "..." dəyərini ötürməklə yaradıla bilər (yəni Closure::fromCallable('myFunc) əvəzinə myFunc(...) ')): foo funksiyası (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Mövcudları birləşdirərək yeni növlər yaratmağa imkan verən kəsişmə növləri üçün tam dəstək əlavə edildi. İki və ya daha çox növün kolleksiyalarını müəyyən edən birləşmə tiplərindən fərqli olaraq, kəsişmə növləri sadalanan növlərin heç birinin deyil, doldurulacaq dəstdə göstərilən növlərin hamısının olmasını tələb edir. function generatorSlug(HasTitle&HasId $post) { strtolower($post->getTitle()) qaytarın. $post->getId(); }
  • Statik analizatorlara funksiyanın proqramın icrasını dayandıracağı barədə məlumat vermək üçün istifadə edilə bilən yeni "heç vaxt" növü var, məsələn, istisna atmaqla və ya çıxış funksiyasını yerinə yetirməklə. funksiya dd(qarışıq $input): heç vaxt { çıxma; }
  • Yeni array_is_list funksiyası təklif edilmişdir ki, bu da massivdəki düymələrin 0-dan başlayaraq ədədi qiymətlərin artırılması qaydasında düzüldüyünü müəyyən etməyə imkan verir: $list = [“a”, “b”, “c”]; array_is_list($list); // doğru $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // yalan
  • İndi ana sinif sabitlərinin ləğv edilməsinin qarşısını almaq üçün "son" açar sözündən istifadə edə bilərsiniz. class Foo { final public const X = "foo"; } sinif Bar genişlənir Foo { public const X = "bar"; > Fatal xəta: Bar::X son sabit Foo::X-i ləğv edə bilməz }
  • Fsync və fdatasync funksiyaları dəyişiklikləri disk keşindən yadda saxlamağa məcbur etmək üçün təklif olunur. $fayl = fopen("sample.txt", "w"); fwrite($fayl, "Bəzi məzmun"); if (fsync($file)) { echo "Fayl diskdə uğurla saxlanıldı."; } fclose($fayl);
  • Əvvəllər istifadə olunan “0” prefiksinə əlavə olaraq, səkkizlik ədədlər üçün “0o” və “0O” prefikslərindən istifadə etmək imkanı əlavə edildi. 016 === 0o16; // doğru 016 === 0O16; // doğru
  • Geriyə uyğunluğun pozulmasına gətirib çıxaracaq, lakin massivlərlə əməliyyatları əhəmiyyətli dərəcədə sürətləndirməyə imkan verəcək $GLOBALS-ın istifadəsini selektiv şəkildə məhdudlaşdırmaq təklif olunur. Məsələn, $GLOBALS-a yazmağı söndürmək və $GLOBALS-ı göstərici ilə ötürmək imkanları nəzərdən keçirilir. 2000 paketin təhlili göstərdi ki, onlardan yalnız 23-ü bu dəyişiklikdən təsirlənəcək. Məsələn, təklif təsdiqlənərsə, 8.1 daha belə ifadələri dəstəkləməyəcək: $GLOBALS = []; $GLOBALS += []; $QLOBALS =& $x; $x =& $QLOBALLAR; təyin edilmədi($GLOBALS); by_ref($GLOBALS);
  • Daxili üsullar indi düzgün növü qaytarmalıdır. PHP 8.1-də funksiya bəyannaməsinə uyğun gəlməyən növün qaytarılması xəbərdarlıq yaradacaq, lakin PHP 9.0-da xəbərdarlıq xəta ilə əvəz olunacaq.
  • Funksiyaların resurslardan istifadədən obyektlərin manipulyasiyasına köçürülməsi üzrə işlər davam etdirilmişdir. Finfo_* və imap_* funksiyaları obyektlərə köçürüldü.
  • Sıfır dəyərlərin arqument kimi qeyri-null olaraq işarələnmiş daxili funksiyalara ötürülməsi köhnəlmişdir. PHP 8.1-də str_contains("string", null) kimi konstruksiyalardan istifadə xəbərdarlıqa, PHP 9-da isə xətaya səbəb olacaq.
  • MurmurHash3 və xxHash hashing alqoritmləri üçün əlavə dəstək.

Mənbə: opennet.ru

Добавить комментарий