Зміни, що ламають зворотну сумісність
Ядро 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).