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