PHP 8.1 programlama dilinin piyasaya sürülmesi

Bir yıllık geliştirme sürecinin ardından PHP 8.1 programlama dilinin piyasaya sürülmesi sunuldu. Yeni dal, bir dizi yeni özelliğin yanı sıra uyumluluğu bozan çeşitli değişiklikler içeriyor.

Ключевые улучшения в PHP 8.1:

  • Numaralandırmalar için destek eklendi; örneğin, artık aşağıdaki yapıları kullanabilirsiniz: enum Status { case Pending; vaka Aktif; vaka Arşivlendi; } class Post { public function __construct( özel Durum $status = Durum::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Добавлена поддержка легковесных потоков, именуемых файберами (Fiber) и позволяющими управлять потоками выполнения на низком уровне. Поддержку файберов планируется добавить во фреймворки Amphp и ReactPHP. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend(‘after suspending’); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume(‘after resuming’);
  • Улучшена реализация кэша объектного кода (opcache), в которой появилась возможность кэширования информации о наследовании классов. Оптимизация позволила поднять производительность некоторых приложений на 5-8%. Из других оптимизаций отмечается оптимизация работы JIT, реализация поддержки JIT для архитектуры ARM64 (AArch64), ускорение разрешения имён, оптимизация библиотек timelib и ext/date, повышение производительности сериализации и десериализации, оптимизация функция get_declared_classes(), explode(), strtr(), strnatcmp(), dechex(). В общем виде отмечается повышение производительности Symfony Demo на 23.0%, а WordPress на 3.5%.
  • Yeni bir dizi tanımlarken mevcut dizilerin değiştirilmesine izin veren "...$var" dizilerinin içindeki paket açma operatörü, dize anahtarlarını destekleyecek şekilde genişletildi (daha önce yalnızca dijital tanımlayıcılar destekleniyordu). Örneğin, artık kodda şunu kullanabilirsiniz: $array1 = [“a” => 1]; $dizi2 = ["b" => 2]; $dizi = [“a” => 0, …$dizi1, …$dizi2]; var_dump($dizi); // ["a" => 1, "b" => 2]
  • Разрешено использовать ключевое слово «new» в инициализаторах, например, в определениях функций в качестве параметра по умолчанию или в атрибутах аргуметов. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • Предоставлена возможность пометки свойств класса для доступа только для чтения (информация в подобные свойства может быть записана только один раз, после чего не будет доступна для изменения). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post(‘Title’, /* … */); $post->title = ‘Other’; > Error: Cannot modify readonly property Post::$title
  • Реализован новый синтаксис для вызываемых объектов (callable) — замыкание теперь можно сформировать, вызвав функцию и передав ей в качестве аргумента значение «…» (т.е. myFunc(…) вместо Closure::fromCallable(‘myFunc’)): function foo(int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Добавлена полноценная поддержка пересекающихся типов (intersection types), позволяющих создавать новые типы, комбинируя существующие. В отличие от union-типов, определяющих коллекции из двух и более типов, intersection-типы требуют наличия в заполняемом множестве не любого из перечисленных типов, а всех указанных типов. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Statik analizörlere bir fonksiyonun, örneğin bir istisna atarak veya çıkış fonksiyonunu çalıştırarak program yürütmeyi sonlandıracağını bildirmek için kullanılabilecek yeni bir "asla" türü vardır. function dd(karışık $giriş): asla { çıkış; }
  • Dizideki anahtarların 0'dan başlayarak artan sayısal değerlere göre düzenlendiğini belirlemenize olanak tanıyan yeni bir array_is_list işlevi önerilmiştir: $list = [“a”, “b”, “c”]; array_is_list($liste); // true $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($ayrıcaNotAList); // YANLIŞ
  • Для запрета переопределения констант родительского класса теперь можно использовать ключевое слово «final». class Foo { final public const X = «foo»; } class Bar extends Foo { public const X = «bar»; > Fatal error: Bar::X cannot override final constant Foo::X }
  • Değişikliklerin disk önbelleğinden kaydedilmesini zorlamak için fsync ve fdatasync işlevleri önerilmektedir. $dosya = fopen("örnek.txt", "w"); fwrite($dosya, "Bazı içerik"); if (fsync($dosya)) { echo "Dosya başarıyla diske yerleştirildi."; } fclose($dosya);
  • Daha önce kullanılan "0" önekine ek olarak, sekizlik sayılar için "0o" ve "0O" öneklerini kullanma yeteneği eklendi. 016 === 0o16; // doğru 016 === 0O16; // doğru
  • Geriye dönük uyumluluğun ihlaline yol açacak, ancak dizilerle işlemleri önemli ölçüde hızlandırmayı mümkün kılacak $GLOBALS kullanımının seçici olarak sınırlandırılması önerildi. Örneğin $GLOBALS'a yazmanın devre dışı bırakılması ve $GLOBALS'ın pointer ile iletilmesi olasılığı değerlendirilmektedir. 2000 paketin analizi, bunlardan yalnızca 23'ünün bu değişiklikten etkileneceğini gösterdi. Örneğin teklif onaylanırsa 8.1 artık şu gibi ifadeleri desteklemeyecektir: $GLOBALS = []; $KÜRESEL += []; $KÜRESEL =& $x; $x =& $KÜRESEL; unset($GLOBALS); by_ref($GLOBALS);
  • Внутренние методы теперь должны возвращать корректный тип. В PHP 8.1 при возвращении типа, не соответствующего объявлению функции, будут выводиться предупреждение, но в PHP 9.0 предупреждение будет заменено на ошибку.
  • İşlevlerin kaynak kullanımından nesnelerin manipülasyonuna aktarılmasına yönelik çalışmalar devam etti. Finfo_* ve imap_* işlevleri nesnelere aktarıldı.
  • Null değerlerin null olarak işaretlenemeyen dahili işlevlere bağımsız değişken olarak iletilmesi kullanımdan kaldırıldı. PHP 8.1'de, str_contains("string", null) gibi yapıların kullanılması bir uyarıya, PHP 9'da ise bir hataya yol açacaktır.
  • MurmurHash3 ve xxHash karma algoritmaları için destek eklendi.

Kaynak: opennet.ru

Yorum ekle