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