Зміни, що ламають зворотну сумісність

Ядро PHP

Обмеження доступу до $GLOBALS

Доступ к массиву$GLOBALS тепер має низку обмежень. Читання та запис окремих елементів масиву, наприклад, $GLOBALS['var'], як і раніше працює. Читання всього масиву $GLOBALS також підтримується. Однак операції, пов'язані зі зміною всього $GLOBALS, заборонено. Наприклад, array_pop($GLOBALS) призведе до помилки.

Використання static-змінних у успадкованих методах

Коли метод, який використовує статичні змінні, успадковується (але не перевизначається), успадкований метод тепер використовуватиме статичні змінні разом із батьківським методом.

Loading...

Це означає, що статичні змінні в методах тепер поводяться так само, як і статичні властивості.

Необов'язкові параметри, вказані перед обов'язковими параметрами

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

Loading...

Результат виконання наведеного прикладу в PHP 8.0:

Deprecated: Required parameter $flavour follows optional parameter $container
 in example.php on line 3
Готовим миску с малиновым йогуртом.

Результат виконання наведеного прикладу в PHP 8.1:

Deprecated: Optional parameter $container declared before required parameter
 $flavour is implicitly treated as a required parameter in example.php on line 3
ArgumentCountError - makeyogurt(): Argument #1 ($container) not passed

Обратите внимание, что значение по умолчанию**null** може використовуватися перед обов'язковими параметрами для вказівки типу, що припускає значення nullАле цей параметр все одно буде обов'язковим.

Сумісність типу значення, що повертається з внутрішніми класами

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

Нові ключові слова

readonly тепер є ключовим словом. Однак, його можна використовувати як ім'я функції.

never тепер є зарезервованим словом, тому його не можна використовувати для назви класу, інтерфейсу або трейту, а також заборонено використовувати у просторах імен.

Перехід від ресурсів до об'єктів

Декілька ресурсів (resource) тепер представлені як об'єкти (object). Перевірки значення, що повертається з використанням функції is_resource() слід замінити перевірками на false

  • Функції FileInfoтепер приймають та повертають об'єктиfinfoзамість ресурсів (resource fileinfo

  • Функції FTPтепер приймають та повертають об'єктиFTP\Connectionзамість ресурсів (resource ftp

  • Функції IMAPтепер приймають та повертають об'єктиIMAP\Connectionзамість ресурсів (resource imap

  • TheLDAPтепер приймають та повертають об'єктиLDAP\Connectionзамість ресурсів (resource ldap link

  • Функції LDAPтепер приймають та повертають об'єктиLDAP\Resultзамість ресурсів (resource ldap result

  • Функції LDAPтепер приймають та повертають об'єктиLDAP\ResultEntryзамість ресурсів (resource ldap result entry

  • Функції PgSQLтепер приймають та повертають об'єктиPgSql\Connectionзамість ресурсів (resource pgsql link

  • Функції PgSQLтепер приймають та повертають об'єктиPgSql\Resultзамість ресурсів (resource pgsql result

  • Функції PgSQLтепер приймають та повертають об'єктиPgSql\Lobзамість ресурсів (resource pgsql large object

  • Функції PSpellтепер приймають та повертають об'єктиPSpell\Dictionaryзамість ресурсів (resource pspell

  • Функції PSpellтепер приймають та повертають об'єктиPSpell\Configзамість ресурсів (resource pspell config

MySQLi

Функції mysqli_fetch_fields() і mysqli_fetch_field_direct() тепер завжди повертають у властивості max_length. Це значення можна обчислити, перебираючи набір результатів та вибираючи максимальну довжину. Такий алгоритм раніше використовував PHP.

Опция**MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH** більше немає сенсу.

Опция**MYSQLI_STORE_RESULT_COPY_DATA** більше немає сенсу. Передача будь-якого значення параметр modeметодаmysqli::store_result() більше немає сенсу.

mysqli::connect() тепер повертає true замість null у разі успішного виконання.

Режим обробки помилок за умовчанням було змінено з "silent" на "exceptions". Дивіться сторінку Режими обробки помилок MySQLi для отримання додаткових відомостей про те, що це спричиняє і як явно встановити цей атрибут. Щоб відновити попередню поведінку, використовуйте: mysqli_report(MYSQLI_REPORT_OFF);

Класи, що розширюють mysqli_stmt::execute(), тепер потрібно вказати додатковий необов'язковий параметр.

MySQLnd

INI-директиваmysqlnd.fetch_data_copy було видалено. Це не повинно призводити до видимих ​​для користувача змін у поведінці.

OpenSSL

Секретні ключі EC тепер експортуватимуться у форматі PKCS#8, а не у традиційному форматі, як і всі інші ключі.

Функції openssl_pkcs7_encrypt() і openssl_cms_encrypt() тепер за замовчуванням використовують шифр AES-128-CBC, а чи не RC2-40. Шифр RC2-40 вважається небезпечним і не включений за промовчанням у OpenSSL 3.

Об'єкти даних PHP

Атрибут**PDO::ATTR_STRINGIFY_FETCHES** тепер перетворює логічні значення (bool) на "0"или"1". Раніше логічні значення (bool) були строковими.

Виклик PDOStatement::bindColumn()с**PDO::PARAM_LOB** тепер буде постійно пов'язувати результат потоку, якщо PDO::ATTR_STRINGIFY_FETCHES не увімкнуто. Раніше результатом був або потік, або рядок в залежності від драйвера бази даних, що використовується, і часу виконання прив'язки.

Драйвер MySQL

Цілі числа та числа з плаваючою комою у наборах результатів тепер повертатимуться з використанням власних типів PHP замість рядків (string) при використанні емульованих підготовлених операторів. Це відповідає поведінці своїх підготовлених операторів. Попередню поведінку можна відновити, увімкнувши опцію PDO::ATTR_STRINGIFY_FETCHES

Драйвер SQLite

Цілі числа та числа з плаваючою комою у наборах результатів тепер повертатимуться з використанням власних типів PHP. Попередню поведінку можна відновити, увімкнувши опцію PDO::ATTR_STRINGIFY_FETCHES

Phar

Щоб відповідати інтерфейсу ArrayAccess Phar::offsetUnset() і PharData::offsetUnset() більше повертають логічне значення (bool).

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

version_compare() більше не приймає недокументованих скорочень операторів.

Функції htmlspecialchars() htmlentities() htmlspecialchars_decode() html_entity_decode() і get_html_translation_table()теперь по умолчанию используютENT_QUOTES | ENT_SUBSTITUTE замість ENT_COMPAT. Це означає, що тепер ' екранується в '. Крім того, у разі неправильного UTF-8 замість порожнього рядка буде повернено заміщувальний символ Unicode.

debug_zval_dump() тепер виводить refcount оболонок посилань з їх refcount, замість того, щоб просто додавати & до значення. Це більш точно моделює еталонну виставу, починаючи з PHP 7.0.

debug_zval_dump() тепер виводить interned замість фіктивного refcount для інтернованих рядків та незмінних масивів.

Стандартна бібліотека PHP (SPL)

SplFixedArray тепер буде закодовано в JSON як масив (array).