Інші зміни

Зміни у ядрі

Клас FFI

МетодFFI::load() тепер дозволено в режимі попереднього завантаження, коли опція opcache.preload_user - Це поточний користувач системи. Раніше виклик методу FFI::load() не було можливе під час передзавантаження, якщо налаштування директиви opcache.preload_user була встановлена.

Менеджер процесів FPM

Перевірка FPM CLI тепер завершується невдачею, якщо шлях до сокету довший, ніж підтримує операційна система.

Модуль Opcache

У CLI та phpdbg SAPIs попереднє завантаження більше не вимагає налаштування директиви opcache.preload_user під час запуску від імені користувача root. В інших SAPIs ця директива потрібна при запуску від імені користувача root, тому що передзавантаження виконувалось до того, як SAPI переключиться на непривілейованого користувача.

Потоки

Блокування функцією fread() при підключенні до сокету повертається негайно, якщо є будь-які буферизовані дані замість очікування додаткових даних.

Потік пам'яті більше не завершується збоєм, якщо усунення пошуку перевищило кінцеве значення. Натомість пам'ять буде збільшена при наступному записі, а дані між старим кінцем і усуненням заповняться нульовими байтами, аналогічно роботі файлів.

Операции доступа функцииstat() на кшталт функції file_exists() і тепер схожі користуються реальним шляхом замість фактичного шляху потоку. Це відповідає відкриттю потоку.

Зміни у модулях SAPI

Командний рядок (CLI)

Потоки**STDOUT** STDERR і STDIN більше не закриваються при знищенні ресурсів, що зазвичай трапляється при завершенні роботи CLI. Однак, все ще можна явно закрити ці потоки через функцію fclose() та схожі.

Змінені функції

Ядро

У функцію gc_status()добавлено 8 следующих полей:

  • running => bool
  • protected => bool
  • full => bool
  • buffer_size => int
  • application_time => float: Повний час роботи програми в секундах (включаючи час, витрачений полем collector_time)
  • collector_time => float: Час у секундах, витрачений циклами складання (включаючи час, витрачений полями destructor_time та free_time)
  • destructor_time => float: Час у секундах, витрачений деструкторами протягом циклу складання
  • free_time => float: Час у секундах, витрачений на звільнення значень під час циклу складання

Функцияclass_alias() Тепер підтримує створення псевдонімів внутрішнього класу.

Настройкаopen_basedir з викликом під час виконання функції ini_set('open_basedir', ...); більше не приймає шляхів, що містять батьківську директорію ( .. . ). Раніше заборонялися тільки шляхи, що починаються з .. . . Це можна легко обійти, додавши ./к пути.

Обробники винятків користувача тепер перехоплюють їх під час завершення роботи.

Результирующий HTML в функцияхhighlight_string() і highlight_file() був змінений. Пробіл між зовнішніми HTML-тегами видалено. Нові рядки та пробіли більше не перетворюються на HTML-сутності. Повний HTML тепер обернутий тегом <pre>Внешний тег<span> був злитий з тегом <code>

Модуль Calendar

Функцияeaster_date() тепер підтримує роки з 1970 по 2000000000 на 64-бітних системах, раніше вона підтримувала лише роки в діапазоні 1970-2037.

Модуль Curl

Функцияcurl_getinfo() тепер підтримує дві нові константи: CURLINFO_CAPATH і CURLINFO_CAINFOЕсли параметр option принимает значениеnull, будуть представлені два наступні додаткові ключі: capathиcainfo

Модуль DOM

У методаDOMCharacterData::appendData() певний тип значення, що повертається, змінився на true.

У методовDOMDocument::loadHTML() DOMDocument::loadHTMLFile() і DOMDocument::loadXML() попередній тип значення, що повертається, був змінений на bool. Раніше це було задокументовано як DOMDocument|bool, але починаючи з PHP 8.0.0 об'єкт класу DOMDocument не може бути повернутий, оскільки він більше не може бути спричинений статично.

Модуль Gd

Сигнатура функцииimagerotate()изменилась. Параметр$ignore_transparent було видалено, оскільки він ігнорувався з версії PHP 5.5.0.

Модуль інтернаціоналізації Intl

Функцияdatefmt_set_timezone() (і її псевдонім - метод IntlDateformatter::setTimeZone()) тепер повертають значення true за успішного виконання, раніше вони повертали значення null

МетодIntlBreakiterator::setText() тепер повертає значення falseпри сбое, ранее он возвращал значениеnull. Тепер він повертає значення true при успішному виконанні, раніше поверталося значення null

МетодIntlChar::enumCharNames() тепер повертає логічне значення. Раніше він повертав значення null при успішному виконанні та значення false при невдалому завершенні.

МетодIntlDateFormatter::__construct() викидає виняток U_ILLEGAL_ARGUMENT_ERROR під час встановлення неприпустимого мовного стандарту (локалі).

Модуль MBString

Функції mb_strtolower() і mb_convert_case() дотримуються правил умовного регістру для грецької літери сигма (? → σ). У функції mb_convert_case() умовний регістр застосовується лише для режимів MB_CASE_LOWER і MB_CASE_TITLE, але не для MB_CASE_LOWER_SIMPLE і MB_CASE_TITLE_SIMPLE

Функцияmb_decode_mimeheader() інтерпретує підкреслення в QPrint-кодованому MIME-кодуванні слів так, як вимагає стандарт RFC 2047; вони перетворюються на прогалини. Підкреслення повинні бути закодовані в «=5F» з таких MIME-кодованих слів.

В редких случаях функцияmb_encode_mimeheader() буде застосовувати кодування передачі до свого вхідного рядка, щоб воно могло передати його як необроблений ASCII PHP 8.2.

Функцияmb_encode_mimeheader() більше не скидає NUL-байти при QPrint-кодуванні вхідного рядка. Раніше це іноді призводило до пошкодження функцією mb_encode_mimeheader рядків у ряді текстових кодувань, особливо UTF-16 і UTF-32.

"Нестрогий" режим функції mb_detect_encoding() тепер поводиться як описано у документації. Раніше вона повертала значення **false**якщо той же байт (наприклад, перший) вхідного рядка був неприпустимим у всіх кодуваннях, що перевіряються. У загальному сенсі, вона виключала запропоновані кодування з розгляду, якщо був виявлений неприпустимий байт, і якщо той же вхідний байт виключив всі кодування, що залишилися, все ще знаходяться на розгляді, вона могла повернути значення false. З іншого боку, якщо всі запропоновані крім одного кодування були виключені з розгляду, вона повертала останню, що залишилася, без урахування того, скільки помилок кодування може зустрітися пізніше в рядку. Це відрізняється від поведінки, описаної в документації, яка говорила: «Якщо параметр strict встановлений у значення false, буде повернуто перше збігається кодування».

Модуль mysqli

Функцияmysqli_fetch_object() тепер викидає виняток ValueErrorвместо исключенияException, когда в параметр$constructor_args передано непустий аргумент, а класі не визначено конструктор.

Функцияmysqli_poll() тепер викидає виняток ValueError, коли не передано жодні аргументи параметра $readні аргументи параметра $error

У функції mysqli_field_seek()и методеmysqli_result::field_seek() тип, що повертається тепер визначений як true замість bool.

Програмний інтерфейс ODBC

Теперь для параметра$enableфункцияodbc_autocommit()принимает значение**nullПри передаче значенияnull** функція поводитиметься так само, як і при передачі значення тільки для одного параметра, тобто — покаже, чи включена автофіксація чи ні.

Модуль PGSQL

Функцияpg_fetch_object() тепер викидає виняток ValueErrorвместо исключенияException, когда в параметр$constructor_args передається непустий аргумент, а класі не визначений конструктор.

Функцияpg_insert() тепер викидає виняток ValueError замість помилки рівня E_WARNING, коли вказана таблиця неприпустима.

Функції pg_insert() і pg_convert() викидають винятки ValueError або TypeError замість помилки рівня E_WARNING, коли значення/тип поля правильно не співпадає з типом PostgreSQL.

Параметр$rowфункцийpg_fetch_result() pg_field_prtlen() і pg_field_is_null() тепер може набувати значення null

Модуль Random

Змінено функції mt_srand() і srand()щоб не перевіряти кількість аргументів для визначення, чи потрібно використовувати випадкове початкове число. Передача значення **null**сгенерирует случайное начальное число, при передаче значения воно і буде обрано випадковим числом. Робота функції тепер узгоджена з методом Random\Engine\Mt19937::__construct()

Клас Reflection

Тип методу, що повертається ReflectionClass::getStaticProperties() більше не може набувати значення null

Стандартні функції

Виклик помилки рівня E_NOTICE у функції unserialize() був підвищений до E_WARNING

Функцияunserialize() тепер видає помилку рівня **E_WARNING**якщо вхідні дані містять невикористані байти.

Функцияarray_pad() тепер обмежена лише максимальною кількістю елементів, які можуть містити масив. Раніше за один раз вона могла додати лише 1048576 елементів.

Функцияstrtok() видає помилку рівня E_WARNING, якщо токен не надано під час запуску токенізації.

Функцияpassword_hash() тепер буде зв'язувати в ланцюжок базовий виняток Random\RandomExceptionкак исключениеExceptionсвойства$previousисключенияValueErrorколи генерація солі завершиться невдачею.

Переданий параметр $command функції proc_open() масив тепер має містити хоча б один непустий елемент. Або буде викинуто виняток ValueError

Функцияproc_open() повертає значення false, якщо передано до параметра $command масив - це не допустима команда, а об'єкт ресурсу, який видає попередження пізніше. Це вже було в Windows, але тепер це також має місце, якщо вибрано реалізацію posix_spawn (більша частина платформ Linux, BSD та MacOS). Ще існують старі платформи, на яких ця поведінка не змінена, оскільки posix_spawn на них не підтримується.

Функції array_sum() і array_product() тепер попереджають, коли значення масиві не можуть бути перетворені в ціле число/число з плаваючою точкою. Раніше масиви та об'єкти ігнорувалися, тоді як усі інші значення наводилися до цілих чисел (int). Більше того, об'єкти, що визначають числове наведення (наприклад, GMP), тепер наводяться, а чи не ігноруються.

Параметр$decimal функції number_format() тепер правильно обробляє негативні цілі числа. Округлення з негативним значенням для параметра $decimal означає, що значення параметра $num округляється до встановлених у параметрі $decimals значущих цифр перед десятковою точкою. Раніше негативні значення параметра $decimals мовчки ігнорувалися і число округлялося до нуля десяткових знаків.

Новий параметр $before_needle був доданий у функцію strrchr(). Він поводиться так само, як його аналог у функціях strstr() або stristr()

Функції str_getcsv() і fgetcsv() тепер повертають порожній рядок замість рядка з одним нульовим байтом для останнього поля, що містить лише незавершене вкладення.

Інші зміни у модулях

Ядро

Указаниеоператорів інкременту/декременту ++ --) На логічних значеннях (bool) тепер видає попередження. Це тому, що поки це не дає ефекту, але в майбутньому поводитиметься як $bool += 1

Указаниеоператора декременту --) На значення null тепер видає попередження. Це тому, що поки це не дає ефекту, але в майбутньому поводитиметься як $null -= 1

Внутрішні об'єкти, що реалізують приведення _IS_NUMBER, але не оброблювач do_operator, який перевизначає складання і віднімання, тепер можна збільшувати або зменшувати на одиницю, начебто виконували вирази $o += 1или$o -= 1

Модуль DOM

Механізм життєвого циклу модуля DOM був перероблений так, щоб неявно віддалені вузли, як і раніше, можна було отримати. Раніше це призводило до виключення.

Клас SQLite3

КлассSQLite3 тепер замість виключення Exception викидає виняток SQLite3Exception(расширяя класс исключенияException

Код помилки класу SQLite тепер передається в код помилки виключення, а не входить до повідомлення про помилку.

Зміни обробки INI-файлу

  • INI-директивиassert.*застаріли для конфігураційних налаштувань. Сюди входять наступні налаштування INI:

    Якщо значення настройки дорівнює значенням за промовчанням, повідомлення про старіння не буде видане. Натомість потрібно користуватися INI-директивоюzend.assertions

  • zend.max_allowed_stack_size - це нова INI-директива, яка встановлює максимальний розмір стека. Можливі значення – це (Визначає максимальний розмір стека процесів або потоків),-1(без обмежень) чи позитивне ціле число байтів. Значення за замовчуванням - . Коли вона не може визначити максимальний розмір стека процесів або потоків, буде вибрано відоме системне значення за промовчанням. Установка надмірно великого значення дасть той самий ефект, що й відключення обмеження розміру стека. Максимальний розмір стека для файбер встановлюють директивою fiber.stack_size. Викидається помилкаErrorколи стек викликів процесів перевищує встановлений директивою zend.max_allowed_stack_size-zend.reserved_stack_size розмір байтів, щоб запобігти помилкам сегментації, викликаних переповненням стека, спрощення процесу налагодження. Розмір стека збільшується під час неконтрольованих рекурсій за участю внутрішніх функцій або магічних методів.__toString() __clone() __sleep() __destruct(). Це не пов'язано з переповненням стека буфера і не пов'язане з безпекою.

  • zend.reserved_stack_size - це нова INI-директива, яка встановлює зарезервований розмір стека в байтах. Це значення віднімається з максимального розміру стека як буфера під час перевірки розміру стека.

Продуктивність

Модуль DOM

Під час циклічного перегляду списку вузлів в об'єкті DOMNodeList тепер працює кешування. Тому запит елементів за замовчуванням не займає квадратичний час.

Отримання текстового вмісту з вузлів тепер уникає виділення пам'яті, що дає приріст продуктивності.

МетодDOMChildNode::remove() тепер працює з продуктивністю O(1).

Standard

Перевірка помилок прапорів у функції file() тепер приблизно на 7% швидше.

Бібліотека SPL

КлассRecursiveDirectoryIterator тепер виконує менше операцій введення-виведення при циклічному переборі каталогу.