Изменения, ломающие обратную совместимость
Ядро 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; теперь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. Сейчас это было явно запрещено.
Стандартная библиотека 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-закодированной строки из соображений безопасности.