Изменения, которые ломают обратную совместимость
 
  Ядро PHP
  
   Массивоподобное обращение к немассивам
   
    Попытка использовать значения с типом null, bool,
    int, float или resource как массив
    (например, $null["key"]) теперь создаст уведомление.
   
   
  
  
   Ключевое слово fn
   
    Литерал fn теперь зарезервированное ключевое слово. В частности,
    его больше не разрешено указывать как имя функции или класса.
    Но при этом, этим ключевым словом разрешено назвать имя метода или константы в классе.
   
   
  
   Тег <?php в конце файла
   
    Запись <?php в конце файла (без завершающей новой строки)
    теперь будет интерпретироваться как открывающий тег PHP.
    Ранее она обрабатывалась либо как короткий открывающий тег
    с последующим литералом php
    и приводил к синтаксической ошибке (при short_open_tag=1),
    либо воспринимался как строковый литерал <?php
    (в случае short_open_tag=0).
   
   
  
  
   Сериализация
   
    Удалён формат сериализации o.
    Поскольку сам PHP им не пользуется, он мог только нарушить десериализацию строк, созданных вручную.
   
   
  
   Константы алгоритма пароля
   
    Идентификаторы алгоритма хеширования паролей теперь обнуляемые строки, а не целые числа.
   
   
   
    Приложения, правильно использующие константы PASSWORD_DEFAULT,
    PASSWORD_BCRYPT, PASSWORD_ARGON2I и PASSWORD_ARGON2ID, будут
    работать как и раньше.
   
   
  
   
   
    Функция htmlentities() теперь будет выдавать уведомление
    (вместо предупреждения уровня E_STRICT), если она используется
    с кодировкой, для которой поддерживается только преобразование основных символов.
    В этом случае она эквивалентна использованию htmlspecialchars().
   
   
  
   
   
    Функции 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
   считались одинаковыми, если у них не было свойств.
  
  
 
 
  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,
   не будут восприниматься в более старых версиях.
  
  
 
 
  Входящие Cookies
  
   Начиная с PHP 7.4.11 имена входящих cookie
   больше не декодируются из URL-закодированной строки из соображений безопасности.