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

Хотя в этом разделе это явно не указано, каждая новая функция, класс, интерфейс, перечисление или константа может вызвать повторное объявление Error.

Ядро PHP

Изменение поведения exit()

Языковая конструкция exit()die()) теперь ведут себя более похоже на функции. Это означает, что их можно передавать как callable, на них влияет оператор strict_types, и теперь они выполняют обычные преобразования типов вместо приведения любого нецелого значения к строке.

Таким образом, передача недопустимых типов в exit() и die() теперь приводит к ошибке TypeError.

Рекурсия во время сравнения

Столкновение с рекурсией во время сравнения теперь выбрасывает исключение Error вместо ошибки уровня E_ERROR.

Косвенная модификация свойств, доступных только для чтения

Косвенное изменение свойств, доступных только для чтения внутри __clone() больше не допускается, например, $ref = &$this->readonly. Это уже было запрещено для инициализации свойств, доступных только для чтения, и было упущением в реализации «повторной инициализации свойств, доступных только для чтения при клонировании».

Изменение типа констант

Константы PHP_DEBUG и PHP_ZTS теперь являются логическим типом (bool). Ранее они имели были целым числом (int).

Длина имени временного файла

Имя загруженных файлов и файлов, созданных функцией tempnam() теперь на 13 байт длиннее. Общая длина по-прежнему зависит от платформы.

Удаление уровня ошибки E_STRICT

Уровень ошибки E_STRICT был удалён, так как он больше не используется в движке PHP. Константа E_STRICT объявлена устаревшей.

Константы классов модулей, которые теперь типизированы

Следующие константы классов модулей теперь объявляют тип в своих константы:

Миграция ресурсов в объекты

Несколько ресурсов (resource) были переведены в объекты (object). Проверки возвращаемого значения с помощью функции is_resource() должны быть заменены проверками на false, если не указано иное.

DBA

Функции DBA теперь принимают и возвращают объекты Dba\Connection вместо ресурса (resource) dba_connection.

ODBC

Функции ODBC теперь принимают и возвращают объекты Odbc\Result вместо ресурса (resource) odbc_result.

Функции ODBC теперь принимают и возвращают объекты Odbc\Connection вместо ресурса (resource) odbc_connection.

SOAP

Свойство SoapClient::$httpurl теперь возвращает объект Soap\Url вместо ресурса (resource) soap_url. Проверки с использованием функции is_resource() (т.е. is_resource($client->httpurl)) должны быть заменены проверками на null (т.е. $client->httpurl !== null).

Свойство SoapClient::$sdl теперь возвращает объект Soap\Sdl вместо ресурса (resource) soap_sdl. Проверки с использованием функции is_resource() (т.е. is_resource($client->sdl)) должны быть заменены проверками на null (т.е. $client->sdl !== null).

Новые предупреждения и исключения

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

Curl

Функция curl_multi_select() теперь выбрасывает ошибку ValueError, если параметр timeout меньше 0 или больше PHP_INT_MAX.

Gd

Функции imagejpeg(), imagewebp(), imagepng(), imageavif() теперь выбрасывают ошибку ValueError, если передано недопустимое значение в параметр quality.

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

Функция imagescale() теперь выбрасывает ошибку ValueError, если значение параметров width или height недополнено или переполнено.

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

Функция imagefilter() с фильтром IMG_FILTER_SCATTER теперь выбрасывают ошибку ValueError, если значение параметров sub или plus недополнено или переполнено.

Gettext

bind_textdomain_codeset(), textdomain(), d()*gettext() теперь выбрасывает ошибку ValueError, если значение параметра domain является пустой строкой.

Intl

Функции resourcebundle_get(), ResourceBundle::get() и обращение к смещениям объекта ResourceBundle теперь выбрасывают:

  • TypeError в случае недопустимых типов смещения.
  • ValueError в случае передачи пустой строки (string).
  • ValueError в случае, если целочисленный индекс не помещается в 32-битное целое число со знаком.

Метод IntlDateFormatter::__construct() теперь выбрасывает ошибку ValueError, если передано недопустимое значение в параметр locale.

Метод NumberFormatter::__construct() теперь выбрасывает ошибку ValueError, если передано недопустимое значение в параметр locale.

MBString

Функция mb_encode_numericentity() и mb_decode_numericentity() теперь проверяют, что значение параметра map состоит только из целых числел (int), в противном случае теперь выбрасывается ошибка ValueError.

Функцияmb_http_input() теперь всегда выбрасывает ошибку ValueError, если передано недопустимое значение в параметр type.

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

ODBC

Функция odbc_fetch_row() возвращает значение false, если параметр row меньше или равен 0. Теперь в этом случае выдаётся предупреждение.

PCNTL

Функции pcntl_sigprocmask(), pcntl_sigwaitinfo(), и pcntl_sigtimedwait() теперь выбрасывают:

  • Ошибку ValueError, если массив signals пуст (за исключением функции pcntl_sigprocmask(), если выбран режим mode SIG_SETMASK)
  • Ошибка TypeError, если значение массива signals не является целым числом (int).
  • Ошибка ValueError, если значение массива signals не является допустимым номером сигнала.

Функция pcntl_sigprocmask() теперь выбрасывает ошибку ValueError, если параметр mode не является одним из SIG_BLOCK, SIG_UNBLOCK или SIG_SETMASK.

Функция pcntl_sigtimedwait() теперь выбрасывает:

  • Ошибку ValueError, если значение параметра seconds меньше 0
  • Ошибку ValueError, если значение параметра nanoseconds меньше 0 или больше 1e9
  • Ошибку ValueError, если значения параметров seconds и nanoseconds равны 0

SimpleXML

Вызов функции simplexml_import_dom() с не-XML объектом теперь выбрасывает ошибку TypeError вместо ValueError.

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

Функция round() теперь проверяет значение параметра mode и выбрасывает ошибку ValueError для недопустимых режимов. Ранее недопустимые режимы интерпретировались как PHP_ROUND_HALF_UP.

Функция str_getcsv() теперь выбрасывает ошибки ValueError, когда значения параметров separator и enclosure не имеют длины в один байт или если значение параметра escape не имеет длины в один байт и не является пустой строкой. Это выравнивает поведение, чтобы оно было идентично поведению функций fputcsv() и fgetcsv().

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

Опция "allowed_classes" для функции unserialize() теперь выбрасывает ошибки TypeError и ValueError, если она не является массивом (array) имён классов.

XMLReader

Передача недопустимой кодировки символов в метод XMLReader::open() или XMLReader::XML() теперь выбрасывает ошибку ValueError.

Передача строки (string), содержащей нулевые байты, ранее выдавала предупреждение, а теперь выбрасывает ошибку ValueError.

XMLWriter

Передача строки (string), содержащей нулевые байты, ранее выдавала предупреждение, а теперь выбрасывает ошибку ValueError.

XSL

Метод XSLTProcessor::setParameter() теперь выбрасывает ошибку ValueError, если значения параметров содержат нулевые байты. На самом деле это никогда корректно не работало, поэтому сейчас такое поведение приводит к исключению.

Вызов метода XSLTProcessor::importStyleSheet() с не-XML объектом теперь выбрасывает ошибку TypeError вместо ValueError.

Невозможность вызвать callback-функцию во время оценки теперь выбрасывает исключение, а не выдаёт предупреждение.

DOM

Некоторые методы DOM ранее возвращали значение false или выбрасывали исключениеDOMException с кодом DOM_PHP_ERR, если новый узел не мог быть выделен. Теперь они постоянно выбрасывают исключение DOMException с кодом DOM_INVALID_STATE_ERR. Такая ситуация крайне маловероятна и вероятность того, что она будет затронута, невелика. В результате теперь у метода DOMImplementation::createDocument() предварительный возвращаемый тип DOMDocument вместо DOMDocument|false.

Ранее объекты DOMXPath можно было клонировать, но в результате получался непригодный для использования объект. Теперь это невозможно и клонирование объекта DOMXPath теперь приведёт к ошибке Error.

Метод DOMImplementation::getFeature() был удалён.

GMP

Класс GMP теперь окончательный и больше не может быть расширен.

MBString

При работе с недопустимыми строками (с ошибками кодировки), функция mb_substr() теперь интерпретирует символьные индексы так же, как и большинство других функций mbstring. Это означает, что символьные индексы, возвращаемые функцией mb_strpos(), могут быть переданы в функцию mb_substr().

Для строк SJIS-Mac (MacJapanese) индексы символов, передаваемые в функцию mb_substr() теперь ссылаются на индексы кодовых точек Unicode, которые получаются при преобразовании строки в Unicode. Это важно, поскольку около 40 символов SJIS-Mac преобразуются в последовательность из нескольких кодовых точек Unicode.

MySQLi

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

Константа MYSQLI_STMT_ATTR_PREFETCH_ROWS удалена. Функция недоступна в mysqlnd.

Константы MYSQLI_CURSOR_TYPE_FOR_UPDATE и MYSQLI_CURSOR_TYPE_SCROLLABLE удалены. Этот функционал никогда не был реализован ни в mysqlnd, ни в libmysql.

Неиспользуемая константа MYSQLI_TYPE_INTERVAL, которая в настоящее время является заглушкой и псевдонимом MYSQLI_TYPE_ENUM удалена.

MySQLnd

Код ошибки, сообщаемый о превышении времени ожидания сервера MySQL, был изменён с 2006 на 4031 для серверов MySQL версии 8.0.24 и выше.

Opcache

Максимальное значение opcache.interned_strings_buffer на 64-разрядных архитектурах теперь 32767. Ранее оно составляло 4095.

JIT

Значения конфигурации по умолчанию для JIT изменились с opcache.jit=tracing и opcache.jit_buffer_size=0 на opcache.jit=disable и opcache.jit_buffer_size=64M соответственно.

Это не влияет на поведение наблюдаемых объектов по умолчанию, поскольку JIT по-прежнему отключён по умолчанию. Однако теперь он отключается с помощью параметра opcache.jit, а не с помощью opcache.jit_buffer_size. Это может повлиять на пользователей, которые ранее включали JIT с помощью opcache.jit_buffer_size, не указывая также режим JIT с помощью opcache.jit. Чтобы включить JIT-компиляцию, установите соответствующее значение конфигурации opcache.jit.

Если JIT компиляция включена, PHP теперь будет завершаться с критической ошибкой при запуске, если инициализация JIT компилятора по какой-либо причине не удалась.

PCNTL

Функции pcntl_sigprocmask(), pcntl_sigwaitinfo(), и pcntl_sigtimedwait() теперь всегда возвращают значение false в случае возникновения ошибки. Ранее в некоторых случаях они могли возвращать значение -1.

PCRE

Поставляемая в комплекте pcre2lib была обновлена до версии 10.44. Как следствие, {,3} теперь распознается как квантификатор, а не как текст. Кроме того, изменилось значение некоторых классов символов в режиме UCP. Полный список изменений смотрите в » списке изменений PCRE2.

PDO_DBLIB

Атрибуты Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER и Pdo\Dblib::ATTR_DATETIME_CONVERT теперь работают как логические атрибуты вместо целочисленных атрибутов. Таким образом, установка атрибута с помощью PDO::setAttribute() и получение его с помощью PDO::getAttribute() ожидает и возвращает логическое значение (bool).

PDO_FIREBIRD

Атрибут PDO::ATTR_AUTOCOMMIT теперь работает как логический атрибут вместо целочисленного атрибута. Таким образом, установка атрибута с помощью PDO::setAttribute() и получение его с помощью PDO::getAttribute() ожидает и возвращает логическое значение (bool).

Модуль теперь открывает некоторые API Firebird C++, поэтому для сборки модуля теперь требуется компилятор C++. Более того, модуль теперь должен быть скомпилирован с fbclient 3.0 или выше.

PDO_MYSQL

Атрибуты PDO::ATTR_AUTOCOMMIT, PDO::ATTR_EMULATE_PREPARES и PDO::MYSQL_ATTR_DIRECT_QUERY теперь работают как логические атрибуты вместо целочисленных атрибутов. Таким образом, установка атрибута с помощью PDO::setAttribute() и получение его с помощью PDO::getAttribute() ожидает и возвращает логическое значение (bool).

PDO_PGSQL

Учётные данные DSN, если они установлены, имеют приоритет перед их аналогами из конструктора PDO, поскольку они ближе к тем, что указаны в документации.

SimpleXML

Класс SimpleXMLElement – это не только представление элемента XML, но и RecursiveIterator. До версии PHP 8.4.0 некоторые из его методов (например, SimpleXMLElement::asXML() или SimpleXMLElement::getName()) и приведение таких экземпляров к строке (string) неявно сбрасывали итератор.

Это могло привести к неожиданным бесконечным циклам при перемотке итератора. Например:

<?php

$xmlString
= "<root><a><b>1</b><b>2</b><b>3</b></a></root>";
$xml = simplexml_load_string($xmlString);

$nodes = $xml->a->b;
foreach (
$nodes as $nodeData) {
echo
"Данные узла: " . $nodeData . "\n";

$xml = $nodes->asXml();
}

приведёт к бесконечному циклу.

Данные узла: 1
Данные узла: 2
Данные узла: 2
Данные узла: 2
Данные узла: 2
Данные узла: 2
Данные узла: 2
// ...

Однако теперь это поведение исправлено и элемент SimpleXMLElement больше не будет неявно сбрасывать данные итератора, если только не будет явно перемотан. Таким образом, предыдущий пример теперь будет выглядеть так:

Данные узла: 1
Данные узла: 2
Данные узла: 3

SOAP

Свойство SoapClient::$typemap теперь является массивом (array) а не ресурсом (resource). Проверки с помощью функции is_resource() (т.е. is_resource($client->typemap)) должны быть заменены проверкой на null (т.е. $client->typemap !== null).

Модуль SOAP получил необязательную зависимость от модуля session. Если PHP собран без модуля session и с включённым флагом конфигурации --enable-rtld-now, будут возникать ошибки при запуске, если также используется модуль SOAP. Чтобы решить эту проблему, либо не используйте rtld-now, либо загрузите модуль session.

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

При использовании функции strcspn() и значение параметра characters является пустой строкой, теперь возвращается длина строки, вместо того чтобы неправильно останавливаться на первом нулевом байте.

Функция http_build_query() теперь корректно обрабатывает типизированные перечисления.

Функции stream_bucket_make_writeable() и stream_bucket_new() теперь возвращают экземпляр класса StreamBucket, а не экземпляр stdClass.

Tidy

Сбои в конструкторе теперь выбрасывают исключения, а не выдают предупреждения и не приводят к поломке объекта.

XML

Функции xml_set_()*_handler() теперь объявляют и проверяют наличие эффективной сигнатуры callable|string|null для параметров handler. Более того, значения типов строк (string), соответствующих именам методов, заданных с помощью функции xml_set_object(), теперь проверяются на существование метода в классе ранее переданного объекта. Это означает, что функция xml_set_object() теперь всегда должна вызываться перед установкой имён методов как callable. Передача пустой строки для отключения обработчика по-прежнему разрешена, но объявлена устаревшей.

Однако, поскольку функция xml_set_object() и передача не callable строк объявлены устаревшими, рекомендуется заменить такие экземпляры на callable, ссылающийся непосредственно на метод.