PHP 8.5.0 Released!

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

Ядро PHP

Псевдонимы "array" и "callable"

Больше нельзя использовать "array" и "callable" в качестве имён псевдонимов классов в class_alias().

Свободное сравнение несравнимых объектов

Ранее свободное сравнение несравнимых объектов (например, перечислений, CurlHandle и других внутренних классов) с логическими значениями было несогласованным. При сравнении с логическим литералом $object == true происходило приведение типа (bool)$object. При сравнении со статически неизвестным значением $object == $true всегда возвращалось значение false. Поведение было унифицировано, теперь всегда происходит приведение типа (bool)$object.

Возвращаемое значение gc_collect_cycles

Возвращаемое значение gc_collect_cycles() больше не включает строки и ресурсы, которые были косвенно собраны через циклы.

Замена ключевого слова static в окончательных подклассе

Теперь разрешается заменять ключевое слово static на self или конкретное имя класса в окончательных (final) подклассах.

Обработчики тиков

Обработчики тиков теперь деактивируются после выполнения всех функций завершения работы, деструкторов и очистки обработчиков вывода.

Связывание трейтов

Теперь трейты связываются до родительского класса. Небольшое изменение в поведении, которое больше соответствует ожиданиям пользователей.

Ошибки при компиляции и связывании классов

Ошибки, возникающие во время компиляции и связывания классов, теперь всегда откладываются и обрабатываются после компиляции или связывания классов. Фатальные ошибки, возникающие во время компиляции или связывания классов, приводят к немедленной обработке всех отложенных ошибок без вызова пользовательских обработчиков ошибок.

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

Исключения, выбрасываемые пользовательскими обработчиками ошибок при обработке ошибок связывания классов, больше не повышаются до уровня фатальных ошибок и не препятствуют связыванию.

Ошибка применения атрибута во время компиляции

Применение #[\Attribute] к абстрактному классу, перечислению, интерфейсу или трейту вызывает ошибку во время компиляции. Ранее атрибут можно было добавить, но при вызове метода ReflectionAttribute::newInstance() выдавалась ошибка. Ошибку можно отложить с момента компиляции до момента выполнения с помощью нового атрибута #[\DelayedTargetValidation].

INI-настройка disable_classes

INI-настройка disable_classes удалена, так как приводила к нарушению различных допущений движка.

Деструктуризация значений, не являющихся массивами

Деструктуризация значений, не являющихся массивами (кроме null), с помощью [] или функции list() теперь выдаёт предупреждение.

Модуль Bzip2

Функция bzcompress() теперь выбрасывает ошибку ValueError, если значение параметра $block_size вне диапазона от 1 до 9.

Функция bzcompress() теперь выбрасывает ошибку ValueError, если значение параметра $work_factor вне диапазона от 0 до 250.

DOM

Клонирование DOMNamedNodeMap, DOMNodeList, Dom\NamedNodeMap, Dom\NodeList, Dom\HTMLCollection и Dom\DtdNamedNodeMap теперь выбрасывает ошибку. Такое поведение никогда не приводило к созданию рабочего объекта, поэтому никаких последствий не ожидается.

Модуль FileInfo

Функция finfo_file() и метод finfo::file() теперь выбрасывают ошибку ValueError вместо TypeError, если значение параметра $filename содержит нулевые байты. Теперь тип выбрасываемой ошибки соответствует остальной частью языка.

Модуль интернационализации

Для работы модуля теперь требуется как минимум ICU 57.1.

Метод IntlDateFormatter::setTimeZone() и функция datefmt_set_timezone() теперь выбрасывают исключение IntlException при неинициализированных классах или ошибках клонирования.

Все методы класса Locale теперь выбрасывают исключение ValueError, если значение параметра locale содержит нулевые байты.

Поведение константы Collator::SORT_REGULAR при обработке числовых строк теперь соответствует поведению SORT_REGULAR в модуле ext/standard.

Модуль LDAP

Функция ldap_get_option() и ldap_set_option() теперь выбрасывают исключение ValueError при передаче недопустимого параметра.

Модуль MBString

Таблицы данных Unicode были обновлены до версии Unicode 17.0.

Модуль MySQLi

Вызов конструктора mysqli для уже созданного объекта теперь невозможен и выбрасывает ошибку Error.

Модуль ODBC

ODBC теперь предполагает, что доступна как минимум функциональность ODBC 3.5. Определение ODBCVER и флаги системы сборки, управляющие им, были удалены.

ODBC больше не имеет флагов сборки для сборки с конкретными драйверами (за исключением DB2) и удаляет особые случаи для этих драйверов. Настоятельно рекомендуется использовать диспетчер драйверов, такой как iODBC или unixODBC, на операционных системах кроме Windows.

Модуль Opcache

Модуль Opcache теперь всегда встроен в бинарный файл PHP и всегда загружается. INI-директивы opcache.enable и opcache.enable_cli по-прежнему работают.

Флаги конфигурации --enable-opcache/--disable-opcache были удалены и сборка больше не создаёт объекты opcache.so или php_opcache.dll.

Использование INI-директив zend_extension=opcache.so или zend_extension=php_opcache.dll выдаст предупреждение.

Модуль PCNTL

Функция pcntl_exec() теперь выбрасывает ошибку ValueError, если элементы параметра $args содержат нулевые байты..

Функция pcntl_exec() теперь выбрасывает ошибку ValueError, если записи или ключи параметра $env_vars содержат нулевые байты.

Модуль PCRE

Модуль скомпилирован без полу-устаревшего параметра компиляции PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK.

Модуль PDO

Аргументы конструктора, заданные в сочетании с константой PDO::FETCH_CLASS, теперь следуют обычной семантике CUFA (call_user_func_array()). Это означает, что строковые ключи будут действовать как именованные аргументы. Кроме того, автоматическая оборачивание аргументов по значению, передаваемых в параметр по ссылке, было удалено и теперь выдаётся обычное предупреждение E_WARNING. Чтобы передать переменную по ссылке в аргумент конструктора, используйте общее присвоение ссылки на значение массива: $ctor_args = [&$valByRef].

Попытка вызова метода PDOStatement::setFetchMode() во время вызова PDO::fetch(), PDO::fetchObject(), PDO::fetchAll(), например, с использованием таких уловок, как передача объекта запроса в качестве аргумента конструктора при извлечении в объект, теперь будет выбрасывать ошибку Error.

Изменились значения констант PDO::FETCH_GROUP, PDO::FETCH_UNIQUE, PDO::FETCH_CLASSTYPE, PDO::FETCH_PROPS_LATE и PDO::FETCH_SERIALIZE.

Теперь выбрасывается исключение ValueError, если константа PDO::FETCH_PROPS_LATE используется с режимом извлечения, отличным от PDO::FETCH_CLASS, в соответствии с другими флагами извлечения.

Теперь выбрасывается исключение ValueError, если константа PDO::FETCH_INTO используется в качестве режима извлечения в методе PDO::fetchAll(), аналогично PDO::FETCH_LAZY.

Драйвер PDO_FIREBIRD

Теперь при попытке установить слишком длинное имя курсора в классе PDOStatement, полученном от драйвера Firebird, выбрасывается исключение ValueError.

Драйвер PDO_SQLITE

SQLite PDO::quote() теперь будет выбрасывать исключение или выдавать предупреждение, в зависимости от режима ошибок, если строка содержит нулевой байт.

Метод PDO::sqliteCreateCollation() теперь выбрасывает исключение, если у callback-функции неправильный тип возвращаемого значения, что делает его более совместимым с поведением метода Pdo\Sqlite::createCollation().

Модуль POSIX

Функция posix_kill() теперь выбрасывает исключение ValueError, если аргумент process_id меньше или больше, чем поддерживает платформа (целое число со знаком или большой диапазон), функция posix_setpgid() теперь выбрасывает исключение ValueError, если process_id или process_group_id меньше нуля или больше, чем поддерживает платформа.

Функция posix_setrlimit() теперь выбрасывает исключение ValueError, если аргументы hard_limit или soft_limit меньше -1 или если soft_limit больше hard_limit.

Модуль интроспекции кода Reflection

Метод ReflectionAttribute::newInstance() теперь может выбрасывать ошибки для внутренних атрибутов, если атрибут был применён к недопустимой цели, а ошибка была отложена с момента компиляции до момента выполнения с помощью атрибута #[\DelayedTargetValidation].

Модуль Session

Попытка записать данные сессии, где ключ $_SESSION содержит символ вертикальной черты (|), теперь будет выдавать предупреждение вместо молчаливой ошибки.

Функция session_start() более строго относится к аргументу options. Теперь функция выбрасывает ошибку ValueError, если массив не является хеш-картой, или ошибку TypeError, если значение read_and_close не является допустимым типом, совместимым с int.

Модуль SimpleXML

Передача выражения XPath, которое возвращает что-либо, кроме набора узлов, в методе SimpleXMLElement::xpath() теперь выдаёт предупреждение и возвращает значение false, вместо того, чтобы молчаливо завершаться с ошибкой и возвращать пустой массив.

Модуль SNMP

Функции snmpget(), snmpset(), snmp2_get(), snmp2_set(), snmp3_get(), snmp3_set() и SNMP::__construct() теперь выбрасывают ошибку ValueError, если имя хоста слишком большое, содержит нулевые байты или если порт указан с отрицательным значением или больше 65535, а значения времени ожидания и повторных попыток меньше -1 или слишком большое.

Модуль SOAP

Метод SoapClient::__doRequest() теперь принимает новый необязательный параметр $uriParserClass, который принимает строковые аргументы или null. Значение null представляет исходный метод (parse_url()), а новые обработчики будут использоваться при передаче либо Uri\Rfc3986\Uri, либо Uri\WhatWg\Url.

Модуль Sockets

Функции socket_create_listen(), socket_bind() и socket_sendto() теперь выбрасывают ошибку ValueError, если порт меньше 0 или больше 65535, а также если любой из элементов массива $hints имеет числовой индекс.

Функция socket_addrinfo_lookup() теперь выбрасывает ошибку TypeError, если какое-либо из значений $hints не может быть преобразовано в целое число, и может выбросить ошибку ValueError, если какое-либо из этих значений переполняется.

Функция socket_set_option() с опциями MCAST_LEAVE_GROUP/MCAST_LEAVE_SOURCE_GROUP теперь выбрасывает исключение, если значение не является корректным объектом или массивом.

Функция socket_set_option() с контекстом многоадресной рассылки теперь выбрасывает ошибку ValueError, если созданный сокет не принадлежит семейству AF_INET/AF_INET6.

Модуль SPL

Класс ArrayObject больше не принимает перечисления, так как изменение свойств $name или $value может нарушить допущения движка.

Параметр $length метода SplFileObject::fwrite() теперь может принимать значение null. Значение по умолчанию изменено с 0 на null.

Стандартные модули

Использование функции семейства printf с форматером, в котором ранее не была указана точность, приводило к некорректной переустановке точности вместо того, чтобы рассматривать ее как точность 0.

Модуль Tidy

Методы tidy::__construct(), tidy::parseFile(), tidy::parseString() теперь выбрасывают ошибку ValueError, если конфигурация содержит некорректное значение или пытается установить внутреннюю запись, доступную только для чтения, и ошибку TypeError, если ключ конфигурации не является строкой.

Добавить

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

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