Программы, которые были очень близки к переполнению стека вызовов, теперь могут выбрасывать исключение Error, когда занятый в байтах размер стека больше, чем определено в настройке zend.max_allowed_stack_size-zend.reserved_stack_size (fiber.stack_size-zend.reserved_stack_size для файберов).
Выполнение функции proc_get_status() несколько раз теперь всегда
возвращает правильное значение в POSIX-системах. Ранее только первый вызов
функции возвращал правильное значение. Выполнение
функции proc_close() после функции proc_get_status()
теперь также возвращает правильный код выхода. Ранее это вернуло бы
значение -1
.
Внутренне это работает через кеширование результата на POSIX-системах.
Если требуется прежнее поведение, можно проверить
ключ «cached»
в массиве, который возвращает функция
proc_get_status(), чтобы проверить, был ли кеширован результат.
Таймеры Zend Max Execution теперь по умолчанию включены для сборок ZTS в системах Linux.
Включение трейтов со статическими свойствами теперь будет повторно определять статические свойства, унаследованные из родительского класса. Это создаст разные хранилища статических свойств для текущего класса. Это аналогично добавлению статического свойства в классе, без трейтов.
При добавлении в массив с занятым отрицательным индексом,
который, предположим, хранится в переменной $n,
нового значения,
следующий индекс получит значение $n + 1
, а не 0
.
Несоответствия видимости констант классов теперь будет корректно проверено при реализации интерфейсов.
Записи объекта WeakMap, ключ которых сопоставлен с самим собой, (возможно, транзитивно) теперь можно удалить во время сбора цикла если ключ недоступен, кроме как путём перебора значений WeakMap (доступность во время перебора считается слабой). Ранее такие записи не были бы удалены автоматически.
Вместо предупреждений и общих исключений в модуль DateTime были добавлены свойственные только ему исключения и ошибки в иерархии классов DateError и DateException. Это улучшает обработку ошибок и исключений, когда нужно проверить их существование.
Вызов методов DOMChildNode::after(), DOMChildNode::before() и DOMChildNode::replaceWith() на узле, у которого нет родительского узла теперь неработоспособно, а не исключением иерархии, чтобы поведение было совместимым со спецификацией DOM.
Вызов методов классов DOMParentNode
и DOMChildNode без документа теперь
работает, а не выбрасывает исключения DOM_HIERARCHY_REQUEST_ERR
класса DOMException.
Это соответствует поведению спецификации DOM.
Вызов метода DOMDocument::createAttributeNS() без префикса неправильно бы создал пространство имён по умолчанию, помещая элемент внутрь пространства имён вместо атрибута. Эта ошибка теперь исправлена.
Метод DOMDocument::createAttributeNS() раньше
неправильно бросал исключение DOM_NAMESPACE_ERRNAMESPACE_ERR
класса DOMException, когда префикс уже был занят другим
URI. Теперь он правильно выбирает другой префикс при конфликте префиксов.
Новые методы и свойства были добавлены в ряд классов DOM. Если пользовательский класс наследуется от этих классов и объявляет метод или свойство с таким же именем, оно должно быть совместимым. В других случаях будет выброшена типичная ошибка компиляции о несовместимости. Познакомиться со списком новых методов и свойств можно в разделах список новой функциональности и новые функции.
Функции языка Си, для которых задан возвращаемый тип void, теперь возвращают значение null
вместо
вместо объекта object(FFI\CData:void) { }
.
Настройка INI-директивы opcache.consistency_checks была удалена. Эта функция не работала при трассировке JIT, а также с кешем наследования, и была отключена в PHP 8.1.18 и PHP 8.2.5; теперь её невозможно включить. И трассирующий JIT, и кеш наследования могут изменить разделяемую память (shm) после сохранения скрипта путём аннулирования его контрольной суммы. Были попытки исправить пропуски через модифицируемые указатели, но была отклонена из-за сложности. Из-за этого решили удалить эту функцию.
Тип констант класса Phar теперь объявлен.
В функцию range() был внесён ряд изменений:
$step
значения 0
выбрасывается подробнее описанное исключение ValueError.
$step
передаются отрицательные значения для увеличения диапазонов.
$step
передаётся число с плавающей точкой,
которое может быть интерпретировано как целое число, то оно так и оценивается.
E_WARNING
,
если параметр $start
или $end
принимает значение пустой строки. Значение продолжает приводиться к значению 0
.
E_WARNING
,
если параметр $start
или $end
принимает
нечисловую строку размером более одного байта.
E_WARNING
,
если значение, переданное в параметр $start
или $end
,
приводится к целому числу из-за того, что другое значение — число
(например, range(5, 'z');
).
E_WARNING
,
если значение параметра $step
— число с плавающей точкой,
кроме случаев, когда оба входных значения — числовые строки (например,
range('5', '9', 0.5);
не вызовет предупреждения).
range('9', 'A');
).
<?php
range('9', 'A'); // ["9", ":", ";", "<", "=", ">", "?", "@", "A"], начиная с PHP 8.3.0
range('9', 'A'); // [9, 8, 7, 6, 5, 4, 3, 2, 1, 0], до PHP 8.3.0
Теперь функция number_format() обрабатывает отрицательные
значения $decimals
и округляет
значения $num
до abs($decimals)
знаков перед
десятичной точкой. Раньше функция игнорировала отрицательные значения $decimals
.
Флаги проверки ошибок в функции file() теперь перехватывает все недопустимые флаги.
Константа FILE_APPEND
раньше без предупреждения принималась.
Тип констант класса SNMP теперь объявлен.