Изменения, ломающие обратную совместимость

Предотвращение возврата отрицательного нуля из number_format()

Раньше функция number_format() возвращала -0. Хотя это совершенно правильно в соответствии со спецификацией чисел с плавающей точкой IEEE 754, эта странность нежелательна для отображения отформатированных чисел в удобочитаемой форме.

<?php

var_dump
(number_format(-0.01)); // теперь выводит string(1) "0" вместо string(2) "-0"

Преобразование числовых ключей при приведении объектов и массивов

Теперь числовые ключи лучше обрабатываются при приведении массивов к объектам и объектов к массивам (через явное приведение, либо используя settype()).

Это означает, что числовые (или числа в виде строк) ключи из массивов, конвертированные в объекты теперь будут доступны:

<?php

// приведение массива к объекту
$arr = [=> 1];
$obj = (object)$arr;
var_dump(
    
$obj,
    
$obj->{'0'}, // теперь работает
    
$obj->{0// теперь работает
);

Результат выполнения данного примера:

object(stdClass)#1 (1) {
  ["0"]=>    // теперь это строковый ключ, а не числовой
  int(1)
}
int(1)
int(1)

И теперь числовые (или числа в виде строк) ключи объектов доступны при конвертации в массивы:

<?php

// приведение объекта в массив
$obj = new class {
    public function 
__construct()
    {
        
$this->{0} = 1;
    }
};
$arr = (array)$obj;
var_dump(
    
$arr,
    
$arr[0], // теперь работает
    
$arr['0'// теперь работает
);

Результат выполнения данного примера:

array(1) {
  [0]=>    // теперь это числовой ключ, а не строковый
  int(1)
}
int(1)
int(1)

Запрещена передача null в get_class()

Раньше передача null в функцию get_class() возвращала имя класса, из которого был сделан вызов. Это поведение было удалено и теперь вместо этого будет будет вызвана ошибка уровня E_WARNING. Для достижения того же поведения, что и раньше, следует просто опустить аргумент.

Предупреждение при подсчёте неисчисляемых типов

Теперь при использовании count() с параметром, который нельзя посчитать будет возникать ошибка уровня E_WARNING (это также касается sizeof() как псевдонима этой функции).

<?php

var_dump
(
    
count(null), // NULL нельзя подсчитать
    
count(1), // числа нельзя подсчитать
    
count('abc'), // строки нельзя подсчитать
    
count(new stdclass), // объекты, не реализующие интерфейс Countable, нельзя подсчитать 
    
count([1,2]) // массивы можно подсчитать
);

Результат выполнения данного примера:

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d
int(0)
int(1)
int(1)
int(1)
int(2)

Переход от ресурсов к объектам в модуле Hash

В рамках долгосрочной миграции отказа от ресурсов, модуль Hash был обновлен для использования объектов вместо ресурсов. Это изменение должно быть плавным для PHP-разработчиков, за исключением случаев, когда используются проверки is_resource() (которые нужно заменить на использование is_object()).

Улучшены значения по умолчанию в SSL/TLS

Были сделаны следующие изменения в значения по умолчанию:

  • tls:// теперь по умолчанию используется TLSv1.0 или TLSv1.1 или TLSv1.2
  • ssl:// псевдоним tls://
  • Константы STREAM_CRYPTO_METHOD_TLS_* по умолчанию равны TLSv1.0 или TLSv1.1 + TLSv1.2, вместо TLSv1.0

Возвращаемое значение gettype() для закрытых ресурсов

Раньше использование gettype() на закрытом ресурсе возвращало строку "unknown type". Теперь будет возвращена строка "resource (closed)".

is_object() и __PHP_Incomplete_Class

Раньше использование is_object() на классе __PHP_Incomplete_Class возвращало false. Теперь будет возвращаться true.

Повышены уровни ошибок неопределенных констант

Не полностью определенные ссылки на неопределенные константы теперь будут генерировать E_WARNING (вместо E_NOTICE). В следующей основной версии PHP они будут генерировать исключения Error.

Поддержка Windows

Официально поддерживаемые минимальные версии Windows теперь являются Windows 7/Server 2008 R2.

Проверка значений свойств по умолчанию трейта

Проверки совместимости значений свойств по умолчанию трейта больше не выполняют приведение типа.

object для имен классов

Имя object ранее было мягко зарезервировано с PHP 7.0. Теперь оно полноценное зарезервированное слово, запрещающее использовать его в качестве имени класса, трейта или интерфейса.

Поддержка NetWare

Поддержка NetWare была удалена.

array_unique() with SORT_STRING

Если sort_flags равен SORT_STRING, ранее массив array копировался, а не уникальные элементы удалялись (сохраняя значения цифровых индексов), но теперь создается новый массив путем добавления уникальных элементов. Это может привести к различным числовым индексам.

Изменения bcmod() с числами с плавающей точкой

Функция bcmod() больше не обрезает числа с плавающей точкой до целых. Таким образом, её поведение теперь соответствует fmod(), а не оператору %. Например, bcmod('4', '3.5') теперь возвращает 0.5 вместо 1.

Функции хеширования и некриптографические хеши

Функции hash_hmac(), hash_hmac_file(), hash_pbkdf2() и hash_init()HASH_HMAC) больше не принимают некриптографические хеши.

Опции функции json_decode()

Опция функции json_decode(), JSON_OBJECT_AS_ARRAY, теперь используется, если второй параметр (assoc) равен null. Ранее JSON_OBJECT_AS_ARRAY всегда игнорировался.

Вывод rand() и mt_rand()

Числа, генерируемые rand() и mt_rand() для определённого параметра переинициализации (seed), могут отличаться от PHP 7.1 на 64-битных машинах (из-за исправления ошибки модульного смещения в реализации).

Удаление ini-настройки sql.safe_mode

Настройка конфигурации sql.safe_mode была удалена.

Изменения в date_parse() и date_parse_from_format()

Элемент массива zone, возвращаемого функциями date_parse_from_format() и date_parse() теперь отображает секунды вместо минут, а его знак инвертируется. Например, -120 теперь будет 7200.

Входящие Cookies

Начиная с PHP 7.2.34 имена входящих cookie больше не декодируются из URL-закодированной строки из соображений безопасности.