Попытка использовать значения типа null, bool, int, float или resource как массив (например, $null["key"]) теперь создаст уведомление.
Функция get_declared_classes() больше не возвращает анонимные классы, которые еще не были созданы.
fn теперь зарезервированное ключевое слово. В частности, оно не может больше использоваться как имя функции или класса. Но при этом, этим ключевым словом можно назвать имя метода или константы в классе.
Использование <?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() теперь будет выдавать уведомление (вместо предупреждения уровня 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. Сейчас это было явно запрещено.
Вызов 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
в случае обнаружения непредвиденных символов в потоке меток.