"array" и "callable"
Больше нельзя использовать "array" и "callable"
в качестве имён псевдонимов классов в class_alias().
Ранее свободное сравнение несравнимых объектов
(например, перечислений, CurlHandle и других внутренних классов)
с логическими значениями было несогласованным.
При сравнении с логическим литералом $object == true происходило
приведение типа (bool)$object.
При сравнении со статически неизвестным значением $object == $true
всегда возвращалось значение false.
Поведение было унифицировано, теперь всегда происходит приведение типа (bool)$object.
Возвращаемое значение gc_collect_cycles() больше не включает строки и ресурсы, которые были косвенно собраны через циклы.
Теперь разрешается заменять ключевое слово static на self или конкретное имя класса в окончательных (final) подклассах.
Обработчики тиков теперь деактивируются после выполнения всех функций завершения работы, деструкторов и очистки обработчиков вывода.
Теперь трейты связываются до родительского класса. Небольшое изменение в поведении, которое больше соответствует ожиданиям пользователей.
Ошибки, возникающие во время компиляции и связывания классов, теперь всегда откладываются и обрабатываются после компиляции или связывания классов. Фатальные ошибки, возникающие во время компиляции или связывания классов, приводят к немедленной обработке всех отложенных ошибок без вызова пользовательских обработчиков ошибок.
Исключения, выбрасываемые пользовательскими обработчиками ошибок при обработке ошибок связывания классов, больше не повышаются до уровня фатальных ошибок и не препятствуют связыванию.
Применение #[\Attribute] к абстрактному классу, перечислению, интерфейсу или трейту
вызывает ошибку во время компиляции. Ранее атрибут можно было добавить,
но при вызове метода ReflectionAttribute::newInstance() выдавалась ошибка.
Ошибку можно отложить с момента компиляции до момента выполнения с помощью нового атрибута
#[\DelayedTargetValidation].
INI-настройка disable_classes удалена, так как приводила к нарушению различных допущений движка.
Функция bzcompress() теперь выбрасывает ошибку ValueError,
если значение параметра $block_size вне диапазона от 1 до 9.
Функция bzcompress() теперь выбрасывает ошибку ValueError,
если значение параметра $work_factor вне диапазона от 0 до 250.
Клонирование DOMNamedNodeMap, DOMNodeList, Dom\NamedNodeMap, Dom\NodeList, Dom\HTMLCollection и Dom\DtdNamedNodeMap теперь выбрасывает ошибку. Такое поведение никогда не приводило к созданию рабочего объекта, поэтому никаких последствий не ожидается.
Функция 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_get_option() и ldap_set_option() теперь выбрасывают исключение ValueError при передаче недопустимого параметра.
Таблицы данных Unicode были обновлены до версии Unicode 17.0.
Вызов конструктора mysqli для уже созданного объекта теперь невозможен и выбрасывает ошибку Error.
ODBC теперь предполагает, что доступна как минимум функциональность ODBC 3.5. Определение ODBCVER и флаги системы сборки, управляющие им, были удалены.
ODBC больше не имеет флагов сборки для сборки с конкретными драйверами (за исключением DB2) и удаляет особые случаи для этих драйверов. Настоятельно рекомендуется использовать диспетчер драйверов, такой как iODBC или unixODBC, на операционных системах кроме Windows.
Модуль 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_exec() теперь выбрасывает ошибку ValueError,
если элементы параметра $args содержат нулевые байты..
Функция pcntl_exec() теперь выбрасывает ошибку ValueError,
если записи или ключи параметра $env_vars
содержат нулевые байты.
Модуль скомпилирован без полу-устаревшего параметра компиляции PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK.
Аргументы конструктора, заданные в сочетании с
константой 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.
Теперь при попытке установить слишком длинное имя курсора в классе PDOStatement, полученном от драйвера Firebird, выбрасывается исключение ValueError.
SQLite PDO::quote() теперь будет выбрасывать исключение или выдавать предупреждение, в зависимости от режима ошибок, если строка содержит нулевой байт.
Метод PDO::sqliteCreateCollation() теперь выбрасывает исключение, если у callback-функции неправильный тип возвращаемого значения, что делает его более совместимым с поведением метода Pdo\Sqlite::createCollation().
Функция 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.
Метод ReflectionAttribute::newInstance() теперь может выбрасывать ошибки для внутренних атрибутов, если атрибут был применён к недопустимой цели, а ошибка была отложена с момента компиляции до момента выполнения с помощью атрибута #[\DelayedTargetValidation].
Попытка записать данные сессии, где ключ $_SESSION содержит
символ вертикальной черты (|),
теперь будет выдавать предупреждение вместо молчаливой ошибки.
Функция session_start() более строго относится к аргументу options. Теперь функция выбрасывает ошибку ValueError, если массив не является хеш-картой, или ошибку TypeError, если значение read_and_close не является допустимым типом, совместимым с int.
Передача выражения XPath, которое возвращает что-либо,
кроме набора узлов, в методе SimpleXMLElement::xpath()
теперь выдаёт предупреждение и возвращает значение false,
вместо того, чтобы молчаливо завершаться с ошибкой и возвращать пустой массив.
Функции snmpget(), snmpset(), snmp2_get(), snmp2_set(), snmp3_get(), snmp3_set() и SNMP::__construct() теперь выбрасывают ошибку ValueError, если имя хоста слишком большое, содержит нулевые байты или если порт указан с отрицательным значением или больше 65535, а значения времени ожидания и повторных попыток меньше -1 или слишком большое.
Метод SoapClient::__doRequest() теперь принимает
новый необязательный параметр $uriParserClass,
который принимает строковые аргументы или null.
Значение null представляет исходный метод (parse_url()),
а новые обработчики будут использоваться при передаче
либо Uri\Rfc3986\Uri, либо Uri\WhatWg\Url.
Функции 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.
Класс ArrayObject больше не принимает перечисления, так как изменение свойств $name или $value может нарушить допущения движка.
Параметр $length метода SplFileObject::fwrite()
теперь может принимать значение null.
Значение по умолчанию изменено с 0 на null.
Использование функции семейства printf с форматером, в котором ранее не была указана точность, приводило к некорректной переустановке точности вместо того, чтобы рассматривать ее как точность 0.
Методы tidy::__construct(), tidy::parseFile(), tidy::parseString() теперь выбрасывают ошибку ValueError, если конфигурация содержит некорректное значение или пытается установить внутреннюю запись, доступную только для чтения, и ошибку TypeError, если ключ конфигурации не является строкой.