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

Ядро PHP

Масивоподібне звернення до немасивів

Спроба використовувати значення з типом null, bool, int, float або resource як масив (наприклад, $null["key"]) Тепер створить повідомлення.

Функцияget_declared_classes()

Функцияget_declared_classes() більше не повертає анонімних класів, які ще не були створені.

Ключевое словоfn

Литералfn тепер зарезервоване ключове слово. Зокрема, його більше не можна вказувати як ім'я функції або класу. Але при цьому цим ключовим словом можна назвати ім'я методу або константи в класі.

Тег<?php наприкінці файлу

Запис <?php в кінці файлу (без завершального нового рядка) тепер інтерпретуватиметься як тег PHP, що відкриває. Раніше вона оброблялася або як короткий тег з наступним літералом php і призводив до синтаксичної помилки (при short_open_tag=1), або сприймався як рядковий літерал <?php(в случаеshort_open_tag=0

Поточні обгортки

При включенні даних потоку виразами include або require метод streamWrapper::stream_set_option() буде викликатись з параметром STREAM_OPTION_READ_BUFFER. Для користувальницьких потокових обгорток, можливо, знадобиться реалізація методу streamWrapper::stream_set_option(), щоб прибрати попередження (як правило, вистачає тільки повернення false

Серіалізація

Видалено формат серіалізації o. Оскільки сам PHP ним не користується, він міг лише порушити десеріалізацію рядків, створених вручну.

Константи алгоритму пароля

Ідентифікатори алгоритму хешування паролів тепер рядки, що обнулюються, а не цілі числа.

  • PASSWORD_DEFAULT раніше було цілочисленним 1; тепер рядок '2y' (у PHP 7.4.0, 7.4.1 та 7.4.2 було null) .
  • PASSWORD_BCRYPT раніше було цілим 1; тепер рядок '2y'
  • PASSWORD_ARGON2I раніше було цілочисленним 2; тепер рядок 'argon2i'
  • PASSWORD_ARGON2ID раніше було цілочисленним 3; тепер рядок 'argon2id'

Програми, які правильно використовують константи PASSWORD_DEFAULT, PASSWORD_BCRYPT, PASSWORD_ARGON2I та PASSWORD_ARGON2ID, працюватимуть як і раніше.

Функцияhtmlentities()

Функцияhtmlentities() тепер буде видавати повідомлення (замість попередження рівня E_STRICT), якщо воно використовується з кодуванням, для якого підтримується лише перетворення основних символів. У цьому випадку вона еквівалентна використанню htmlspecialchars()

Функції fread() і fwrite()

Функції fread() і fwrite()теперь будут возвращать**false**якщо операція не вдалася. Раніше повертався порожній рядок або 0. До помилок EAGAIN/EWOULDBLOCK це не стосується.

Ці функції тепер також викликають повідомлення при невдалому виконанні, наприклад, під час запису файловий ресурс, призначений лише читання.

Обчислення над числами з довільною точністю BCMath

Тепер функції BCMath видаватимуть попередження, якщо передано число з помилкою, наприклад, "32foo". Подібний аргумент, як і раніше, буде інтерпретовано як нуль.

CURL

Спроба серіалізації класу CURLFile тепер створить виняток. Раніше виняток викидався лише за десеріалізації.

Использование**CURLPIPE_HTTP1** оголошено застарілим і не підтримуватиметься з версії cURL 7.62.0.

Параметр$version функції curl_version() оголошено застарілим. Якщо передається значення, не рівне CURLVERSION_NOW за промовчанням буде викликано попередження, а параметр проігноровано.

дата та час

Виклик var_dump() або схожої налагоджувальної функції з екземпляром DateTime або DateTimeImmutable більше не залишає після виконання доступних властивостей.

Порівняння об'єктів DateInterval(с использованием== < і т.д.) тепер створює попередження і завжди повертає false. Раніше всі об'єкти DateInterval вважалися однаковими, якщо вони не мали властивостей.

Intl

Значение параметров по умолчанию в функцияхidn_to_ascii() і idn_to_utf8() тепер INTL_IDNA_VARIANT_UTS46 замість застарілого INTL_IDNA_VARIANT_2003

MySQLi

Функціональність вбудованого сервера видалено. Вона була зламана як мінімум із PHP 7.0.

Недокументована властивість mysqli::$stat було видалено на користь використання mysqli::stat()

OpenSSL

Функцияopenssl_random_pseudo_bytes() тепер викидатиме виняток у тих же ситуаціях, що й функція random_bytes(). Зокрема, викидається виняток Error, якщо кількість запрошених байтів менша або дорівнює нулю. Виняток Exception викидається, якщо не отримано достатньої випадковості. Аргумент $crypto_strong гарантовано дорівнюватиме **true**якщо функція нічого не викидає, тому явно перевіряти його не потрібно.

Регулярні вирази (сумісні Perl)

При использовании флага**PREG_UNMATCHED_AS_NULL, завершающие несовпадающие подмаски теперь будут иметь значениеnull**(или[null, -1], якщо увімкнено збереження позиції підмаски). Це означає, що розмір $matches завжди буде однаковим.

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

Спроба серіалізувати екземпляр PDO або PDOStatement тепер створить Exception, а неPDOException, За аналогією з іншими внутрішніми класами, які не підтримують серіалізацію.

Reflection

Об'єкти Reflection тепер створюють виняток, якщо спробувати серіалізувати їх. Серіалізація об'єктів Reflection ніколи не підтримувалась і призводила до пошкодження об'єктів Reflection. Нині це було явно заборонено.

Изменились значения констант классовReflectionClassConstant ReflectionMethod і ReflectionProperty

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

Виклик get_object_vars() з екземпляром ArrayObject тепер завжди повертатиме властивості самого ArrayObject (або підкласу). Раніше він повертав значення упакованого масиву/об'єкта, якщо не було вказано прапора ArrayObject::STD_PROP_LIST

Інші порушені операції:

  • ReflectionObject::getProperties()
  • reset() current()і т.д. Використовуйте натомість методиIterator
  • Ймовірно, решта працює з властивостями об'єкта при доступі у вигляді списку, наприклад,array_walk()

На приведение типа(array) ці зміни не вплинуть. Вони, як і раніше, повертають або упакований масив, або властивості. ArrayObject, залежно від того, чи використовується прапор ArrayObject::STD_PROP_LIST

МетодSplPriorityQueue::setExtractFlags() викине виняток, якщо передано нуль. Раніше це призводило до фатальної помилки, що відловлюється, при наступній операції вилучення.

ArrayObject ArrayIterator SplDoublyLinkedList і SplObjectStorage тепер підтримують __serialize()и__unserialize()в дополнение к интерфейсуSerializable. Тому тепер створені в більш старих версіях PHP серіалізовані дані все ще можуть бути неправильно оброблені. Однак нові створені серіалізовані дані в PHP 7.4 не сприйматимуться в більш старих версіях.

Лексер (Tokenizer)

Функцияtoken_get_all()теперь отобразит метку**T_BAD_CHARACTER** у разі виявлення непередбачених символів у потоці міток.

Вхідні Cookies

Починаючи з PHP 7.4.11 імена вхідні cookie більше не декодуються з URL-закодованого рядка з міркувань безпеки.