Реліз мови програмування 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 always False (): false {return false; }
  • Надано можливість фільтрації конфіденційних параметрів даних трасування стека, що виводяться під час помилки. Вирізання певної інформації може знадобитися коли відомості про помилки, що виникають, автоматично направляються в сторонні сервіси, що відстежують проблеми та інформують про них розробників. Наприклад, можна виключити з трасування параметри, що включають імена користувачів, паролі та змінні оточення. function test( $foo, #[\SensitiveParameter] $password, $baz ) { throw new Exception('Error'); } test('foo', 'password', 'baz'); Error 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» з функціями та класами для генерації псеводоспадкових чисел та послідовностей. Модуль надає об'єктно-орієнтований інтерфейс, дозволяє вибирати різні движки для генерації псеводоспадкових чисел, у тому числі придатні для застосування в криптографії, і надає допоміжні функції, наприклад, для випадкового перемішування масивів і рядків, вибору випадкових ключів масиву, одночасного використання кількох генераторів зі своїм незалежним станом. $rng = $is_production? new Random\Engine\Secure() : new Random\Engine\Mt19937(1234); $randomizer = новий 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_key
  • Додані нові методи: 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, яка дозволяє визначити режим доступу до лога з помилками.

Джерело: opennet.ru

Додати коментар або відгук