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

### Предотвращение возврата отрицательного нуля из функции 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() с константой `SORT_STRING`

Хотя функция array_unique() с флагом `SORT_STRING` раньше копировала массив и удаляла неуникальные элементы (без последующей упаковки массива), теперь новый массив создаётся путём добавления уникальных элементов. Это может привести к получению разных числовых индексов.

### Изменения в работе функции bcmod() с числами с плавающей точкой

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

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

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

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

Теперь используется опция `JSON_OBJECT_AS_ARRAY` функции json_decode(), если второй параметр (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-закодированной строки из соображений безопасности.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open