Изменения, ломающие обратную совместимость
Предотвращение возврата отрицательного нуля из number_format()
Раньше функция number_format() возвращала -0
.
Хотя это совершенно правильно в соответствии со спецификацией чисел с плавающей точкой IEEE 754,
эта странность нежелательна для отображения отформатированных чисел в удобочитаемой форме.
<?php
var_dump(number_format(-0.01)); // теперь выводит string(1) "0" вместо string(2) "-0"
Преобразование числовых ключей при приведении объектов и массивов
Теперь числовые ключи лучше обрабатываются при приведении массивов к объектам и объектов к массивам (через явное приведение, либо используя settype()).
Это означает, что числовые (или числа в виде строк) ключи из массивов, конвертированные в объекты теперь будут доступны:
<?php
// приведение массива к объекту
$arr = [0 => 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-закодированной строки из соображений безопасности.