Реліз мови програмування PHP 8.3

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

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

  • Під час клонування класів надано можливість повторної ініціалізації властивостей з атрибутом "readonly". Перевизначення readonly-властивостей допускається лише всередині функції «__clone»: readonly class Post { public function __construct( public DateTime $createdAt, ) {} public function __clone() { $this->createdAt = new DateTime(); // Дозволено, незважаючи на те, що властивість «createdAt» доступна в режимі тільки для читання. } }
  • Надано можливість використання констант із зазначенням типу в класах, типажах та перерахуваннях: class Foo { const string BAR = 'baz'; }
  • Додано підтримку атрибуту «#[Override]», за допомогою якого розробник може інформувати інтерпретатор про те, що зазначений метод перевизначає якийсь батьківський метод. Якщо перевизначення не буде інтерпретатор виведе помилку.
  • Змінено обробку негативних значень як індекс масиву. Наприклад, при додаванні до порожнього масиву елемента з номером «-5» і додаванні ще одного елемента, раніше другий елемент зберігався з індексом «0», а починаючи з версії PHP 8.3 буде зберігатися з індексом «-4». $array = []; $array[-5] = 'a'; $array[] = 'b'; var_export($array); // Було array (-5 => 'a', 0 => 'b') // Стало array (-5 => 'a', -4 => 'b')
  • Додана можливість створення анонімних класів у режимі лише для читання: $class = new readonly class { public function __construct( public string $foo = 'bar', ) {} };
  • Додана функція json_validate() для швидкої перевірки відповідності рядка формату JSON без виконання операцій декодування. json_validate(string $json, int $depth = 512, int $flags = 0): bool
  • До класу Randomizer, що надає високорівневий API для генерації псеводоспадкових чисел і послідовностей, додані нові методи: getBytesFromString для формування рядка заданого розміру, що використовує у випадковому порядку символи, що є в іншому рядку; getFloat і nextFloat для генерації випадкового числа з плаваючою комою, що укладається у вказаний діапазон.
  • Додано можливість вилучення констант, використовуючи синтаксис динамічних класів: class Foo {const BAR = 'bar'; } $name = 'BAR'; // Раніше для отримання константи BAR потрібно було викликати constant(Foo::class . '::' . $name); // А тепер достатньо вказати Foo:: {$ name};
  • Додано генерацію окремих винятків (DateMalformedIntervalStringException, DateInvalidOperationException, DateRangeError) у разі проблем, що виникають в операціях роботи з датами та часом.
  • Поліпшено обробку помилок, що виникають у процесі аналізу серіалізованих даних у функції unserialize(). У разі проблем unserialize() тепер видає код E_WARNING замість E_NOTICE.
  • Внесено зміни до функції range(). Забезпечена генерація виключення при спробі передачі об'єктів, ресурсів або масивів у змінних, що визначають межі діапазону, а також при вказанні негативного значення у $step або невизначеного значення в будь-якому параметрі. Забезпечено виведення списку символів при вказівці рядків замість чисел (наприклад, range('5', 'z')).
  • Змінено поведінку типажів зі статичними властивостями, які тепер перевизначають статичні властивості, успадковані з батьківського класу.
  • Додано налаштування для захисту від переповнення стека. У ini-файл додані директиви zend.max_allowed_stack_size та zend.reserved_stack_size, що визначають максимально дозволений та зарезервований розмір стека. Програма буде завершуватися помилкою при наближенні до вичерпання стека, коли стек заповнений більше, ніж різницю між значеннями zend.max_allowed_stack_size і zend.reserved_stack_size (виконання буде зупинено не доводячи ситуацію до виникнення segmentation fault). За умовчанням значення zend.max_allowed_stack_size виставлено в 0 (0 - розмір визначається автоматично, для вимкнення обмеження можна виставити -1).
  • Додані нові POSIX функції posix_sysconf(), posix_pathconf(), posix_fpathconf() і posix_eaccess().
  • Додана функція mb_str_pad, що є аналогом рядкової функції str_pad(), розрахований на роботу з багатобайтовими кодуваннями, такими як UTF-8.
  • Дозволено створення замикань з методів та передачі іменованих аргументів у ці замикання. $ Test = new Test (); $closure = $test->magic(…); $closure(a: 'hello', b: 'world');
  • Змінено поведінку під час обробки видимості констант в інтерфейсах. interface I { public const FOO = 'foo'; } class C implements I { private const FOO = 'foo'; }
  • Розширені можливості функцій array_sum(), array_product(), posix_getrlimit(), gc_status(), class_alias(), mysqli_poll(), array_pad() та proc_get_status().
  • Оголошена застаріла можливість передачі негативного значення $widths в mb_strimwidth(). Видалено константу NumberFormatter::TYPE_CURRENCY. Припинено підтримку виклику функції ldap_connect() з двома параметрами $host та $port. Видалено налаштування opcache.consistency_checks.

Джерело: opennet.ru

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