PHP 8.4.1 Released!

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

Ядро PHP

Программы, которые были очень близки к переполнению стека вызовов

Программы, которые были очень близки к переполнению стека вызовов, теперь могут выбрасывать исключение Error, когда занятый в байтах размер стека больше, чем определено в настройке zend.max_allowed_stack_size-zend.reserved_stack_size (fiber.stack_size-zend.reserved_stack_size для файберов).

Выполнение функции proc_get_status() несколько раз

Выполнение функции proc_get_status() несколько раз теперь всегда возвращает правильное значение в POSIX-системах. Ранее только первый вызов функции возвращал правильное значение. Выполнение функции proc_close() после функции proc_get_status() теперь также возвращает правильный код выхода. Ранее это вернуло бы значение -1. Внутренне это работает через кеширование результата на POSIX-системах. Если требуется прежнее поведение, можно проверить ключ «cached» в массиве, который возвращает функция proc_get_status(), чтобы проверить, был ли кеширован результат.

Таймеры Zend Max Execution

Таймеры Zend Max Execution теперь по умолчанию включены для сборок ZTS в системах Linux.

Включение трейтов со статическими свойствами

Включение трейтов со статическими свойствами теперь будет повторно определять статические свойства, унаследованные из родительского класса. Это создаст разные хранилища статических свойств для текущего класса. Это аналогично добавлению статического свойства в классе, без трейтов.

Присваивание отрицательного индекса пустому массиву

При добавлении в массив с занятым отрицательным индексом, который, предположим, хранится в переменной $n, нового значения, следующий индекс получит значение $n + 1, а не 0.

Проверка несоответствия видимости констант классов

Несоответствия видимости констант классов теперь будет корректно проверено при реализации интерфейсов.

Записи WeakMap, ключ которых соответствует самим себе

Записи объекта WeakMap, ключ которых сопоставлен с самим собой, (возможно, транзитивно) теперь можно удалить во время сбора цикла если ключ недоступен, кроме как путём перебора значений WeakMap (доступность во время перебора считается слабой). Ранее такие записи не были бы удалены автоматически.

Модуль Date

Вместо предупреждений и общих исключений в модуль DateTime были добавлены свойственные только ему исключения и ошибки в иерархии классов DateError и DateException. Это улучшает обработку ошибок и исключений, когда нужно проверить их существование.

Модуль DOM

Вызов методов 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. Если пользовательский класс наследуется от этих классов и объявляет метод или свойство с таким же именем, оно должно быть совместимым. В других случаях будет выброшена типичная ошибка компиляции о несовместимости. Познакомиться со списком новых методов и свойств можно в разделах список новой функциональности и новые функции.

Класс FFI

Функции языка Си, для которых задан возвращаемый тип void, теперь возвращают значение null вместо вместо объекта object(FFI\CData:void) { }.

Модуль Opcache

Настройка INI-директивы opcache.consistency_checks была удалена. Эта функция не работала при трассировке JIT, а также с кешем наследования, и была отключена в PHP 8.1.18 и PHP 8.2.5; теперь её невозможно включить. И трассирующий JIT, и кеш наследования могут изменить разделяемую память (shm) после сохранения скрипта путём аннулирования его контрольной суммы. Были попытки исправить пропуски через модифицируемые указатели, но была отклонена из-за сложности. Из-за этого решили удалить эту функцию.

Модуль Phar

Тип констант класса Phar теперь объявлен.

Стандартные функции

В функцию range() был внесён ряд изменений:

  • Теперь выбрасывается исключение TypeError, когда объекты (object), ресурсы (resource) или массивы (array) передаются в качестве граничных значений.
  • Теперь при передаче в параметр $step значения 0 выбрасывается подробнее описанное исключение ValueError.
  • Теперь выбрасывается исключение ValueError, когда в параметр $step передаются отрицательные значения для увеличения диапазонов.
  • Если в параметр $step передаётся число с плавающей точкой, которое может быть интерпретировано как целое число, то оно так и оценивается.
  • Теперь выбрасывается исключение ValueError, если любой аргумент представляет бесконечное число или нечисло (NAN).
  • Теперь вызвается ошибка уровня 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() создаёт список символов, если одно из них — числовая строка (например, 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

Тип констант класса SNMP теперь объявлен.

Добавить

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

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