Хотя в этом разделе это явно не указано, каждая новая функция, класс, интерфейс, перечисление или константа может вызвать повторное объявление Error.
Языковая конструкция exit() (и die())
теперь ведут себя более похоже на функции.
Это означает, что их можно передавать как callable,
на них влияет оператор strict_types
,
и теперь они выполняют обычные преобразования типов
вместо приведения любого нецелого значения к строке.
Таким образом, передача недопустимых типов в exit() и die() теперь приводит к ошибке TypeError.
Столкновение с рекурсией во время сравнения теперь выбрасывает
исключение Error вместо
ошибки уровня E_ERROR
.
Косвенное изменение свойств, доступных только для чтения внутри __clone()
больше не допускается, например, $ref = &$this->readonly
.
Это уже было запрещено для инициализации свойств, доступных только для чтения,
и было упущением в реализации «повторной инициализации свойств,
доступных только для чтения при клонировании».
Константы PHP_DEBUG
и PHP_ZTS
теперь являются логическим типом (bool).
Ранее они имели были целым числом (int).
Имя загруженных файлов и файлов, созданных функцией tempnam() теперь на 13 байт длиннее. Общая длина по-прежнему зависит от платформы.
Следующие константы классов модулей теперь объявляют тип в своих константы:
Несколько ресурсов (resource) были переведены в объекты (object).
Проверки возвращаемого значения с помощью функции is_resource() должны быть
заменены проверками на false
, если не указано иное.
Функции DBA теперь принимают и возвращают объекты
Dba\Connection вместо ресурса (resource) dba_connection
.
Функции ODBC теперь принимают и возвращают объекты
Odbc\Result вместо ресурса (resource) odbc_result
.
Функции ODBC теперь принимают и возвращают объекты
Odbc\Connection вместо ресурса (resource) odbc_connection
.
Свойство 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_multi_select() теперь выбрасывает ошибку
ValueError, если
параметр timeout
меньше
0
или больше PHP_INT_MAX
.
Функции
imagejpeg(), imagewebp(), imagepng(), imageavif()
теперь выбрасывают ошибку ValueError,
если передано недопустимое значение в параметр quality
.
Функция imageavif()
теперь выбрасывает ошибку ValueError,
если передано недопустимое значение в параметр speed
.
Функция imagescale()
теперь выбрасывает ошибку ValueError,
если значение параметров width
или height
недополнено или переполнено.
Функция imagescale()
теперь выбрасывают ошибку ValueError,
если передано недопустимое значение в параметр mode
.
Функция imagefilter() с фильтром IMG_FILTER_SCATTER
теперь выбрасывают ошибку ValueError,
если значение параметров sub
или plus
недополнено или переполнено.
bind_textdomain_codeset(), textdomain(), d()*gettext()
теперь выбрасывает ошибку ValueError, если
значение параметра domain
является пустой строкой.
Функции resourcebundle_get(), ResourceBundle::get() и обращение к смещениям объекта ResourceBundle теперь выбрасывают:
Метод IntlDateFormatter::__construct()
теперь выбрасывает ошибку ValueError,
если передано недопустимое значение в параметр locale
.
Метод NumberFormatter::__construct()
теперь выбрасывает ошибку ValueError,
если передано недопустимое значение в параметр locale
.
Функция mb_encode_numericentity() и
mb_decode_numericentity() теперь проверяют, что
значение параметра map
состоит только из целых числел (int),
в противном случае теперь выбрасывается ошибка ValueError.
Функцияmb_http_input()
теперь всегда выбрасывает ошибку ValueError,
если передано недопустимое значение в параметр type
.
Функция mb_http_output() теперь проверяет, что
значение параметра encoding
не содержит нулевых байтов,
в противном случае теперь выбрасывается ошибка ValueError.
Функция odbc_fetch_row() возвращает значение false
, если
параметр row
меньше или равен 0
.
Теперь в этом случае выдаётся предупреждение.
Функции pcntl_sigprocmask(), pcntl_sigwaitinfo(), и pcntl_sigtimedwait() теперь выбрасывают:
signals
пуст
(за исключением функции pcntl_sigprocmask(), если выбран
режим mode
SIG_SETMASK
)
signals
не является целым числом (int).
signals
не является допустимым номером сигнала.
Функция pcntl_sigprocmask() теперь выбрасывает
ошибку ValueError, если параметр mode
не является одним из SIG_BLOCK
, SIG_UNBLOCK
или SIG_SETMASK
.
Функция pcntl_sigtimedwait() теперь выбрасывает:
seconds
меньше 0
nanoseconds
меньше 0
или больше 1e9
seconds
и nanoseconds
равны 0
Вызов функции 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::open() или XMLReader::XML() теперь выбрасывает ошибку ValueError.
Передача строки (string), содержащей нулевые байты, ранее выдавала предупреждение, а теперь выбрасывает ошибку ValueError.
Передача строки (string), содержащей нулевые байты, ранее выдавала предупреждение, а теперь выбрасывает ошибку ValueError.
Метод XSLTProcessor::setParameter() теперь выбрасывает ошибку ValueError, если значения параметров содержат нулевые байты. На самом деле это никогда корректно не работало, поэтому сейчас такое поведение приводит к исключению.
Вызов метода XSLTProcessor::importStyleSheet() с не-XML объектом теперь выбрасывает ошибку TypeError вместо ValueError.
Невозможность вызвать callback-функцию во время оценки теперь выбрасывает исключение, а не выдаёт предупреждение.
Некоторые методы DOM ранее возвращали значение false
или
выбрасывали исключениеDOMException с кодом
DOM_PHP_ERR
, если новый узел не мог быть выделен.
Теперь они постоянно выбрасывают исключение DOMException
с кодом DOM_INVALID_STATE_ERR
.
Такая ситуация крайне маловероятна и вероятность того, что она будет затронута, невелика.
В результате теперь у метода DOMImplementation::createDocument()
предварительный возвращаемый тип DOMDocument вместо DOMDocument|false
.
Ранее объекты DOMXPath можно было клонировать, но в результате получался непригодный для использования объект. Теперь это невозможно и клонирование объекта DOMXPath теперь приведёт к ошибке Error.
Метод DOMImplementation::getFeature() был удалён.
Класс GMP теперь окончательный и больше не может быть расширен.
При работе с недопустимыми строками (с ошибками кодировки), функция mb_substr() теперь интерпретирует символьные индексы так же, как и большинство других функций mbstring. Это означает, что символьные индексы, возвращаемые функцией mb_strpos(), могут быть переданы в функцию mb_substr().
Для строк SJIS-Mac (MacJapanese) индексы символов, передаваемые в функцию mb_substr() теперь ссылаются на индексы кодовых точек Unicode, которые получаются при преобразовании строки в Unicode. Это важно, поскольку около 40 символов SJIS-Mac преобразуются в последовательность из нескольких кодовых точек Unicode.
Неиспользуемая и недокументированная константа
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
удалена.
Код ошибки, сообщаемый о превышении времени ожидания сервера MySQL,
был изменён с 2006
на 4031
для серверов MySQL версии 8.0.24 и выше.
Максимальное значение
opcache.interned_strings_buffer
на 64-разрядных архитектурах теперь 32767
.
Ранее оно составляло 4095
.
Значения конфигурации по умолчанию для 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_sigprocmask(),
pcntl_sigwaitinfo(), и
pcntl_sigtimedwait() теперь всегда
возвращают значение false
в случае возникновения ошибки.
Ранее в некоторых случаях они могли возвращать значение -1
.
Поставляемая в комплекте pcre2lib была обновлена до версии 10.44.
Как следствие, {,3}
теперь распознается как квантификатор, а не как текст.
Кроме того, изменилось значение некоторых классов символов в режиме UCP.
Полный список изменений смотрите
в » списке изменений PCRE2.
Атрибуты Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER
и Pdo\Dblib::ATTR_DATETIME_CONVERT
теперь работают как логические атрибуты
вместо целочисленных атрибутов.
Таким образом, установка атрибута с помощью PDO::setAttribute()
и получение его с помощью PDO::getAttribute() ожидает
и возвращает логическое значение (bool).
Атрибут PDO::ATTR_AUTOCOMMIT
теперь работает как логический атрибут
вместо целочисленного атрибута.
Таким образом, установка атрибута с помощью PDO::setAttribute()
и получение его с помощью PDO::getAttribute() ожидает
и возвращает логическое значение (bool).
Модуль теперь открывает некоторые API Firebird C++, поэтому для сборки модуля теперь требуется компилятор C++. Более того, модуль теперь должен быть скомпилирован с fbclient 3.0 или выше.
Атрибуты PDO::ATTR_AUTOCOMMIT
, PDO::ATTR_EMULATE_PREPARES
и PDO::MYSQL_ATTR_DIRECT_QUERY
теперь работают как логические
атрибуты вместо целочисленных атрибутов.
Таким образом, установка атрибута с помощью PDO::setAttribute()
и получение его с помощью PDO::getAttribute()
ожидает и возвращает логическое значение (bool).
Учётные данные DSN, если они установлены, имеют приоритет перед их аналогами из конструктора PDO, поскольку они ближе к тем, что указаны в документации.
Класс 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
Свойство 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.
Сбои в конструкторе теперь выбрасывают исключения, а не выдают предупреждения и не приводят к поломке объекта.
Функции xml_set_()*_handler()
теперь объявляют и проверяют наличие эффективной
сигнатуры callable|string|null
для параметров handler
.
Более того, значения типов строк (string), соответствующих именам методов,
заданных с помощью функции xml_set_object(),
теперь проверяются на существование метода в классе ранее переданного объекта.
Это означает, что функция xml_set_object() теперь всегда должна вызываться
перед установкой имён методов как callable.
Передача пустой строки для отключения обработчика по-прежнему разрешена, но объявлена устаревшей.
Однако, поскольку функция xml_set_object() и передача не callable строк объявлены устаревшими, рекомендуется заменить такие экземпляры на callable, ссылающийся непосредственно на метод.