Після року розробки реліз мови програмування 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