array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'ru', ), 'this' => array ( 0 => 'migration74.incompatible.php', 1 => 'Изменения, ломающие обратную совместимость', ), 'up' => array ( 0 => 'migration74.php', 1 => 'Миграция с PHP 7.3.x на PHP 7.4.x', ), 'prev' => array ( 0 => 'migration74.constants.php', 1 => 'Новые глобальные константы', ), 'next' => array ( 0 => 'migration74.deprecated.php', 1 => 'Устаревшая функциональность', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'ru', 'path' => 'appendices/migration74/incompatible.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
Попытка использовать значения с типом 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-закодированной строки из соображений безопасности.