"array" и "callable"
Слова "array" и "callable" больше нельзя указывать
как псевдонимы классов при вызове функции class_alias().
Нестрогое сравнение несравнимых объектов —
перечислений, объектов CurlHandle и других внутренних классов —
с логическими значениями прежде оставалось непоследовательным.
При сравнении с логическим литералом в выражениях наподобие $object == true
объект неявно приводился к логическому значению, как если бы сравнение выполняли с явным приведением типа: (bool) $object.
При сравнении со значением, которое невозможно вычислить в статическом контексте, — в выражениях наподобие
$object == $true, возвращалось значение false.
Поведение унифицировали: объекты без внутренней логики сравнения теперь сравниваются только после неявного приведения (bool) $object.
Значение, которое возвращает функция gc_collect_cycles(), больше не включает строки и ресурсы, которые сборщик мусора попутно собрал при удалении циклических ссылок.
В окончательных подклассах ключевое слово static разрешили заменять на self или название конкретного класса.
Обработчики тиков теперь деактивируются после выполнения всех функций завершения работы, деструкторов и очистки обработчиков вывода.
Теперь трейты связываются до родительского класса. Небольшое изменение в поведении, которое больше соответствует ожиданиям пользователей.
Ошибки, возникающие во время компиляции и связывания классов, теперь всегда откладываются и обрабатываются после компиляции или связывания классов. Фатальные ошибки, возникающие во время компиляции или связывания классов, приводят к немедленной обработке всех отложенных ошибок без вызова пользовательских обработчиков ошибок.
Исключения, выбрасываемые пользовательскими обработчиками ошибок при обработке ошибок связывания классов, больше не повышаются до уровня фатальных ошибок и не препятствуют связыванию.
Применение #[\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,
теперь обрабатываются по правилам стандартной семантики функции 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.
При попытке указать опцию PDO::FETCH_PROPS_LATE
с несовместимыми режимами извлечения теперь выбрасывается
ошибка ValueError, как и при других несовместимых комбинациях флагов.
Опция совместима только с режимом PDO::FETCH_CLASS.
При попытке выбрать строки
методом PDO::fetchAll()
в режиме PDO::FETCH_INTO
теперь выбрасывается ошибка ValueError —
как и в режиме выборки 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.
Передача целочисленного значения 0 в аргументе locales
функции setlocale() больше не поддерживается и теперь выбрасывает
ошибку TypeError.
Передача выражения 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, если ключ конфигурации не является строкой.