PHP 8.4.1 Released!

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

Предотвращение возврата отрицательного нуля из функции 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-закодированной строки из соображений безопасности.

Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top