😎 » PHP - FAQ » Міграція РНР » Що нового у PHP 8.2
26 0  

Що нового у PHP 8.2

Після року розробки представлений реліз мови програмування PHP 8.2. Нова гілка включає серію нових можливостей, а також кілька змін, що порушують Сумісність.

Ключові зміни в PHP 8.2:

Додана можливість позначки класу доступним тільки для читання. Властивості в подібних класах можуть бути задані тільки один раз, після чого не будуть доступні для зміни. Раніше тільки для читання могли позначатися окремі властивості класу, А тепер разом можна включити даний режим для всіх властивостей класу. Вказівка прапора" readonly " на рівні класу також блокує динамічне додавання властивостей до класу.

   readonly class Post
   {
       public function __construct(
           public string $title, 
           public Author $author,
       ) {}
   }
   $post = new Post(/* … */);
   $post->unknown = 'wrong'; // Error: Cannot create dynamic property Post::$unknown

Додані окремі типи "true", "false" і "null", які можуть приймати тільки одне допустиме значення і використовуватися, наприклад, для повернення функцією ознаки завершення з помилкою або порожнього значення. Раніше "true"," false "і" null "могли використовуватися тільки в зв'язці з іншими типами (наприклад, "string / false"), а тепер можуть застосовуватися окремо:

   function alwaysFalse(): false
   {
       return false;
   }


Надана можливість фільтрації конфіденційних параметрів в даних трасування стека, що виводяться під час помилки. Вирізання певної інформації може знадобитися коли відомості про виникаючі помилки автоматично направляються в сторонні сервіси, що відстежують проблеми і інформують про них розробників. Наприклад, можна виключити з трасування параметри, що включають імена користувачів, паролі і змінні оточення.

   function test(
       $foo,
       #[\SensitiveParameter] $password,
       $baz
   ) {
       throw new Exception('Error');
   }
   test('foo', 'password', 'baz');
 
   Fatal error: Uncaught Exception: Error in test.php:8
   Stack trace:
   #0 test.php(11): test('foo',  Object(SensitiveParameterValue), 'baz')
   #1 {main}
     thrown in test.php on line 8


Дозволено визначення констант в типажах (trait, механізм для повторного використання коду). Доступ до констант, визначених у типажі, можна отримати через клас, який використовує типаж (але не через ім'я типу).

   trait Foo  
   {
       public const CONSTANT = 1;

       public function bar(): int
       {
           return self::CONSTANT; // Fatal error
       }
   }

   class Bar
   {
       use Foo;
   }

   var_dump(Bar::CONSTANT); // 1


Додана можливість завдання типів в диз'юнктивної нормальної формі (dnf, Disjunctive Normal Form), що дозволяє поєднати об'єднання типів (колекції з двох і більше типів) і перетин типів (типи, значення яких підпадають одночасно під кілька типів).

   class Foo {
       public function bar((A&B)|null $entity) {
           if ($entity === null) {
               return null;
           }
           return $entity;
       }
   }


Запропоновано нове розширення "Random" C функціями і класами для генерації псевдовипадкових чисел і послідовностей. Модуль надає об'єктно-орієнтований інтерфейс, дозволяє вибирати різні движки для генерації псевдовипадкових чисел, в тому числі придатні для застосування в криптографії, і надає допоміжні функції, наприклад, для випадкового перемішування масивів і рядків, вибору випадкових ключів масиву, одночасного використання декількох генераторів зі своїм незалежним станом.

   $rng = $is_production
       ? new Random\Engine\Secure()
       : new Random\Engine\Mt19937(1234);
 
   $randomizer = new Random\Randomizer($rng);
   $randomizer->shuffleString('foobar');


Реалізовано незалежне від локалі перетворення регістру символів. Функції, подібні strtolower () і strtoupper (), тепер завжди перетворюють регістр символів в діапазоні ASCII як при виставленні локалі "з".
Додані нові функції: mysqli_execute_query, curl_upkeep, memory_reset_peak_usage, ini_parse_quantity, libxml_get_external_entity_loader, sodium_crypto_stream_xchacha20_xor_ic, openssl_cipher_key_length.
Додані нові методи: mysqli::execute_query, ZipArchive::getStreamIndex, ZipArchive::getStreamName, ZipArchive::clearError, ReflectionFunction::isAnonymous, ReflectionMethod:: hasPrototype.
Оголошена застарілою можливість динамічного створення властивостей в класі. У PHP 9.0 звернення до властивостей, спочатку не визначеним в класі, буде призводити до помилки (ErrorException). Класи, що надають методи __get і _ _ set для створення властивостей, або динамічні властивості в stdClass продовжать працювати без змін, припиниться підтримка тільки неявної роботи з неіснуючими властивостями для того щоб захистити розробника від прихованих помилок. Для збереження роботи старого коду запропоновано атрибут " #[AllowDynamicProperties]", що дозволяє використання динамічних властивостей.
Оголошена застарілою можливість підстановки значень змінних в рядки за допомогою виразів "${var}" і ${(var)}". Підтримка зазвичай використовуваних підстановок " {$var}" і "$var " збережена. Наприклад:

   "Hello {$world}"; OK
   "Hello $world";   OK 
   "Hello ${world}"; Deprecated: Using ${} in strings is deprecated


Оголошені застарілими частково підтримувані об'єкти, що викликаються (callable), які можуть бути викликані через " call_user_func ($callable)", але не підтримують виклик у формі"$callable ()":

   "self::method"
   "parent::method"
   "static::method"
   ["self", "method"]
   ["parent", "method"]
   ["static", "method"]
   ["Foo", "Bar::method"]
   [new Foo, "Bar::method"]


У Налаштування додана директива error_log_mode, що дозволяє визначити режим доступу до логу з помилками.


Залишити свій коментар:

Досвід у веброзробці:

2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2009
2023