Попытка использовать значения с типом null, bool, int, float или resource как массив (например, $null["key"]
) теперь создаст уведомление.
Функция 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() теперь будет выдавать уведомление (вместо предупреждения уровня E_STRICT), если она используется с кодировкой, для которой поддерживается только преобразование основных символов. В этом случае она эквивалентна использованию htmlspecialchars().
Функции fread() и fwrite() теперь будут возвращать false
, если операция не удалась. Ранее возвращалась пустая строка или 0. К ошибкам EAGAIN/EWOULDBLOCK это не относится.
Эти функции теперь также вызывают уведомление при неудачном выполнении, например, при записи в файловый ресурс, предназначенный только для чтения.
Теперь функции BCMath будут выдавать предупреждения, если передано число с ошибкой, например, "32foo"
. Подобный аргумент, как и раньше, будет интерпретирован как ноль.
Попытка сериализации класса CURLFile теперь создаст исключение. Ранее исключение выбрасывалось только при десериализации.
Использование CURLPIPE_HTTP1
объявлено устаревшим, и не будет поддерживаться с версии cURL 7.62.0.
Параметр $version
функции curl_version() объявлен устаревшим. Если передаётся значение, не равное CURLVERSION_NOW
по умолчанию, будет вызвано предупреждение, а параметр проигнорирован.
Вызов var_dump() или похожей отладочной функции с экземпляром DateTime или DateTimeImmutable больше не оставляет после своего выполнения доступных свойств.
Сравнение объектов DateInterval (с использованием ==
, <
и т.д.) теперь создаёт предупреждение и всегда возвращает false
. Ранее все объекты DateInterval считались одинаковыми, если у них не было свойств.
Значение параметров по умолчанию в функциях idn_to_ascii() и idn_to_utf8() теперь INTL_IDNA_VARIANT_UTS46
вместо устаревшего INTL_IDNA_VARIANT_2003
.
Функциональность встроенного сервера была удалена. Она была сломана как минимум с PHP 7.0.
Недокументированное свойство mysqli::$stat
было удалено в пользу использования mysqli::stat().
Функция openssl_random_pseudo_bytes() теперь будет выбрасывать исключение в тех же ситуациях, что и функция random_bytes(). В частности, выбрасывается исключение Error, если количество запрошенных байтов меньше или равно нулю. Исключение Exception выбрасывается, если не получена достаточная случайность. Аргумент $crypto_strong
гарантированно будет равен true
, если функция ничего не выбрасывает, поэтому явно проверять его не нужно.
При использовании флага PREG_UNMATCHED_AS_NULL
, завершающие несовпадающие подмаски теперь будут иметь значение null
(или [null, -1]
, если включено сохранение позиции подмаски). Это означает, что размер $matches
всегда будет одинаковым.
Попытка сериализовать экземпляр PDO или PDOStatement теперь создаст Exception, а не PDOException, по аналогии с другими внутренними классами, которые не поддерживают сериализацию.
Объекты Reflection теперь создают исключение, если попробовать их сериализовать. Сериализация объектов Reflection никогда не поддерживалась и приводила к повреждению объектов Reflection. Сейчас это было явно запрещено.
Изменились значения констант классов ReflectionClassConstant, ReflectionMethod и ReflectionProperty.
Вызов get_object_vars() с экземпляром ArrayObject теперь всегда будет возвращать свойства самого ArrayObject (или подкласса). Ранее он возвращал значения упакованного массива/объекта, если не был указан флаг ArrayObject::STD_PROP_LIST
.
Другие затронутые операции:
На приведение типа (array)
эти изменения не повлияют. Они по-прежнему возвращают либо упакованный массив, либо свойства ArrayObject, в зависимости от того, используется ли флаг ArrayObject::STD_PROP_LIST
.
Метод SplPriorityQueue::setExtractFlags() выбросит исключение, если передан ноль. Ранее это приводило к отлавливаемой фатальной ошибке при следующей операции извлечения.
ArrayObject, ArrayIterator, SplDoublyLinkedList и SplObjectStorage теперь поддерживают __serialize()
и __unserialize()
в дополнение к интерфейсу Serializable. Поэтому теперь созданные в более старых версиях PHP сериализованные данные, всё ещё могут быть неверно обработаны. Однако новые созданные сериализованные данные в PHP 7.4, не будут восприниматься в более старых версиях.
Функция token_get_all() теперь отобразит метку T_BAD_CHARACTER
в случае обнаружения непредвиденных символов в потоке меток.
Начиная с PHP 7.4.11 имена входящих cookie больше не декодируются из URL-закодированной строки из соображений безопасности.