<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration84.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'migration84.other-changes.php',
    1 => 'Другие изменения',
    2 => 'Другие изменения',
  ),
  'up' => 
  array (
    0 => 'migration84.php',
    1 => 'Миграция с PHP 8.3.x на PHP 8.4.x',
  ),
  'prev' => 
  array (
    0 => 'migration84.removed-extensions.php',
    1 => 'Удалённые модули',
  ),
  'next' => 
  array (
    0 => 'migration84.windows-support.php',
    1 => 'Подержка ОС Windows',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'appendices/migration84/other-changes.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration84.other-changes" class="sect1">
 <h2 class="title">Другие изменения</h2>

 <div class="sect2" id="migration84.other-changes.core">
  <h3 class="title">Изменения в ядре</h3>

  <div class="sect3" id="migration84.other-changes.core.closures">
   <h4 class="title">Замыкания</h4>

   <p class="simpara">
    Названия замыканий изменили так, чтобы имена включали название родительской функции
    и строку, в которой определили замыкание, что помогает различать замыкания
    в трассировках стека или другом месте вывода отладочной информации.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.core.fibers">
   <h4 class="title">Файберы</h4>

   <p class="simpara">
    Переключение файберов теперь разрешили при запуске деструктора. Раньше переключение
    файберов блокировали из-за конфликтов со сборщиком мусора.
   </p>

   <p class="simpara">
    Деструкторы теперь разрешается выполнять в отдельном файбере:
   </p>

   <p class="simpara">
    Когда в файбере запускается сборка мусора,
    деструкторы, которые вызвал сборщик мусора, выполняются в отдельном файбере:
    gc_destructor_fiber.
    Для выполнения оставшихся деструкторов создаётся новый файбер,
    если этот файбер приостанавливается.
    Сборщик мусора больше не ссылается на предыдущий файбер gc_destructor_fiber,
    поэтому файбер доступен для сборки, раз ссылок на него не осталось.
    Сборщик мусора не соберёт объекты, деструктор которых приостановился,
    до тех пор, пока деструктор не вернется или пока сборщик мусора не уничтожит файбер.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.core.output">
   <h4 class="title">Обработчики вывода</h4>

   <p class="simpara">
    Флаги статуса обработчика вывода, которые передали в параметр <code class="parameter">flags</code>
    функции <span class="function"><a href="function.ob-start.php" class="function">ob_start()</a></span>, теперь очищаются.
   </p>

   <p class="simpara">
    Функция <span class="function"><a href="function.output-add-rewrite-var.php" class="function">output_add_rewrite_var()</a></span> для выбора хостов, которые перезапишутся,
    теперь руководствуется значением директивы
    <a href="outcontrol.configuration.php#ini.url-rewriter.hosts" class="link"><code class="literal">url_rewriter.hosts</code></a>
    вместо директивы
    <a href="session.configuration.php#ini.session.trans-sid-hosts" class="link"><code class="literal">session.trans_sid_hosts</code></a>.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.other-changes.sapi">
  <h3 class="title">Изменения в SAPI-модулях</h3>

  <div class="sect3" id="migration84.other-changes.sapi.apache">
   <h4 class="title">apache2handler</h4>

   <p class="simpara">
    Из-за окончания жизненного цикла удалили поддержку веб-серверов Apache 2.0 и 2.2.
    Теперь требуется версия Apache не ниже 2.4.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.sapi.cli">
   <h4 class="title">Модуль CLI</h4>

   <p class="simpara">
    Встроенный сервер ищет индексный файл рекурсивно путём обхода родительских каталогов,
    когда не находит файл.
    Раньше этот процесс пропускался, если путь выглядел так, как будто ссылается на файл,
    т. е. если последний компонент пути содержал точку.
    Тогда возвращалась ошибка 404.
    Поведение изменили для поиска индексного файла во всех случаях.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.sapi.fpm">
   <h4 class="title">Модуль FPM</h4>

   <p class="simpara">
    Теперь сброс, или отправка, заголовков без тела выполнится успешно.
    
   </p>

   <p class="simpara">
    На странице статуса появилось новое поле, которое показывает пиковое значение объёма выделяемой памяти.
   </p>

   <p class="simpara">
    
    Настройку <code class="literal">events.mechanism</code> в файле <var class="filename">/dev/poll</var>
    для ОС Solaris/Illumos удалили.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.other-changes.functions">
  <h3 class="title">Изменённые функции</h3>

  <div class="sect3" id="migration84.other-changes.functions.core">
   <h4 class="title">Ядро</h4>

   <p class="simpara">
    Функции <span class="function"><a href="function.trigger-error.php" class="function">trigger_error()</a></span> и <span class="function"><a href="function.user-error.php" class="function">user_error()</a></span>
    теперь возвращают конкретное логическое значение <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span> вместо общего <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.dom">
   <h4 class="title">Модуль DOM</h4>

   <p class="simpara">
    В Методе <span class="methodname"><a href="domdocument.registernodeclass.php" class="methodname">DOMDocument::registerNodeClass()</a></span>
    предварительный тип возврата определили как <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span>
    вместо прежнего <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>,
    поскольку на практике метод возвращал только <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.hash">
   <h4 class="title">Модуль Hash</h4>

   <p class="simpara">
    В функции <span class="function"><a href="function.hash-update.php" class="function">hash_update()</a></span>
    предварительный тип возврата теперь <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span> вместо
    прежнего <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>,
    поскольку на практике метод возвращал только <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.intl">
   <h4 class="title">Модуль Intl</h4>

   <p class="simpara">
    Константы <strong><code><a href="class.numberformatter.php#numberformatter.constants.round-toward-zero">NumberFormatter::ROUND_TOWARD_ZERO</a></code></strong>
    и <strong><code><a href="class.numberformatter.php#numberformatter.constants.round-away-from-zero">NumberFormatter::ROUND_AWAY_FROM_ZERO</a></code></strong>
    добавили как синонимы констант
    <strong><code><a href="class.numberformatter.php#numberformatter.constants.round-down">NumberFormatter::ROUND_DOWN</a></code></strong>
    и <strong><code><a href="class.numberformatter.php#numberformatter.constants.round-up">NumberFormatter::ROUND_UP</a></code></strong>
    для согласованности с семейством режимов
    <strong><code><a href="math.constants.php#constant.php-round-half-up">PHP_ROUND_<span class="replaceable">*</span></a></code></strong>.
   </p>

   <p class="simpara">
    Метод <span class="methodname"><a href="resourcebundle.get.php" class="methodname">ResourceBundle::get()</a></span>
    
    получил предварительный тип возврата <code class="literal">ResourceBundle|array|string|int|null</code>.
   </p>

   <p class="simpara">
    Функции <span class="function"><a href="function.idn-to-ascii.php" class="function">idn_to_ascii()</a></span> и <span class="function"><a href="function.idn-to-utf8.php" class="function">idn_to_utf8()</a></span>
    теперь выбрасывают ошибки <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> при каждом вызове,
    если имя в параметре <code class="parameter">domain</code> оказалось пустым или слишком длинным.
   </p>

   <p class="simpara">
    Функции <span class="function"><a href="function.idn-to-ascii.php" class="function">idn_to_ascii()</a></span> и <span class="function"><a href="function.idn-to-utf8.php" class="function">idn_to_utf8()</a></span>
    теперь выбрасывают ошибку <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> при каждом вызове,
    если значение аргумента <code class="parameter">variant</code> не равно
    <strong><code><a href="intl.constants.php#constant.intl-idna-variant-uts46">INTL_IDNA_VARIANT_UTS46</a></code></strong>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.libxml">
   <h4 class="title">Модуль LibXML</h4>

   <p class="simpara">
    Функция <span class="function"><a href="function.libxml-set-streams-context.php" class="function">libxml_set_streams_context()</a></span> теперь сразу выбрасывает ошибку
    <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span>, когда в функцию передают ресурс, который
    не относится к контексту потока,
    вместо того, чтобы выбрасывать ошибку позже, когда появляется потоковый контекст.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.mbstring">
   <h4 class="title">Модуль MBString</h4>

   <p class="simpara">
    Поведение функции <span class="function"><a href="function.mb-strcut.php" class="function">mb_strcut()</a></span> теперь лучше согласуется
    с недопустимыми для кодировок UTF-8 и UTF-16 строками.
    Для допустимых для кодировок UTF-8 и UTF-16 строк поведение не изменилось.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.odbc">
   <h4 class="title">Модуль ODBC</h4>

   <p class="simpara">
    Разработчики изменили значение по умолчанию для параметра <code class="parameter">row</code> в функциях
    <span class="function"><a href="function.odbc-fetch-object.php" class="function">odbc_fetch_object()</a></span>,
    <span class="function"><a href="function.odbc-fetch-array.php" class="function">odbc_fetch_array()</a></span>
    и <span class="function"><a href="function.odbc-fetch-into.php" class="function">odbc_fetch_into()</a></span>, теперь значение равно <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>,
    что согласуется в функцией <span class="function"><a href="function.odbc-fetch-row.php" class="function">odbc_fetch_row()</a></span>.
    Предыдущие значения по умолчанию равнялись
    <code class="literal">-1</code>,
    <code class="literal">-1</code>
    и <code class="literal">0</code> соответственно.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.openssl">
   <h4 class="title">Модуль OpenSSL</h4>

   <p class="simpara">
    Параметр <code class="parameter">extra_attributes</code> в функции <span class="function"><a href="function.openssl-csr-new.php" class="function">openssl_csr_new()</a></span>
    вместо DN-имени (англ. сокр.: Distinguished Name — уникальное имя) субъекта
    устанавливает атрибут <abbr title="Certificate Signing Request">CSR</abbr>; раньше функция делала это неправильно.
   </p>

   <p class="simpara">
    Параметр <code class="parameter">dn</code> в функции
    <span class="function"><a href="function.openssl-csr-new.php" class="function">openssl_csr_new()</a></span> разрешает устанавливать массив (<span class="type"><a href="language.types.array.php" class="type array">array</a></span>)
    значений для одной записи.
   </p>

   <p class="simpara">
    В функцию <span class="function"><a href="function.openssl-csr-sign.php" class="function">openssl_csr_sign()</a></span> добавили
    новый параметр <code class="parameter">serial_hex</code>,
    который разрешает устанавливать серийные номера
    в шестнадцатеричном формате.
   </p>

   <p class="simpara">
    Разбор значений даты и времени в формате UTCTime языка ASN.1 функцией <span class="function"><a href="function.openssl-x509-parse.php" class="function">openssl_x509_parse()</a></span>
    завершится ошибкой, если секунды опустили для версии модуля OpenSSL ниже 3.2 (для таких полей
    возвращает значение <code class="literal">-1</code>).
    Версия OpenSSL выше 3.3 уже не загружала такие сертификаты.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.pdo">
   <h4 class="title">Модуль PDO</h4>

   <p class="simpara">
    Получить значение атрибута <strong><code><a href="pdo.constants.php#pdo.constants.attr-stringify-fetches">PDO::ATTR_STRINGIFY_FETCHES</a></code></strong>
    теперь возможно методом
    <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span>.
   </p>

   <p class="simpara">
    Добавили новую константу <strong><code>PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE</code></strong>,
    чтобы получать данные о потреблении памяти результатами запросов
    методом <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span> для драйверов, которые поддерживают метод.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.pdo-firebird">
   <h4 class="title">Драйвер PDO_FIREBIRD</h4>

   <p class="simpara">
    Значения атрибутов
    
    <strong><code>FB_ATTR_DATE_FORMAT</code></strong>,
    <strong><code>FB_ATTR_TIME_FORMAT</code></strong>
    и <strong><code>FB_ATTR_TIMESTAMP_FORMAT</code></strong>
    теперь возможно получать методом
    
    <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span>.
   </p>

   <p class="para">
    Добавили новые атрибуты, которые указывают уровень изоляции транзакции и режим доступа.
    Добавили пять констант, которые относятся к этой функциональности:

    <ul class="simplelist">
     <li><strong><code><a href="class.pdo-firebird.php#pdo-firebird.constants.transaction-isolation-level">Pdo\Firebird::TRANSACTION_ISOLATION_LEVEL</a></code></strong></li>
     <li><strong><code><a href="class.pdo-firebird.php#pdo-firebird.constants.read-committed">Pdo\Firebird::READ_COMMITTED</a></code></strong></li>
     <li><strong><code><a href="class.pdo-firebird.php#pdo-firebird.constants.repeatable-read">Pdo\Firebird::REPEATABLE_READ</a></code></strong></li>
     <li><strong><code><a href="class.pdo-firebird.php#pdo-firebird.constants.serializable">Pdo\Firebird::SERIALIZABLE</a></code></strong></li>
     <li><strong><code><a href="class.pdo-firebird.php#pdo-firebird.constants.writable-transaction">Pdo\Firebird::WRITABLE_TRANSACTION</a></code></strong></li>
    </ul>
   </p>

   <p class="simpara">
    Конструкторе теперь проверяет работоспособность подключений
    при работе с постоянными соединениями.
   </p>

   <p class="simpara">
    Содержимое, которое создаёт драйвер, меняется в зависимости от значения флага
    <strong><code>FB_API_VER</code></strong> в файле
    <var class="filename">ibase.h</var>.
    Эту информацию получают методом <span class="methodname"><a href="pdo-firebird.getapiversion.php" class="methodname">Pdo\Firebird::getApiVersion()</a></span>.
    Эта информация теперь также упоминается в выводе функции
    <span class="function"><a href="function.phpinfo.php" class="function">phpinfo()</a></span>.
   </p>

   <p class="para">
    Теперь доступны пять новых типов данных:
    <span class="simplelist"><code class="literal">INT128</code>, <code class="literal">DEC16</code>, <code class="literal">DEC34</code>, <code class="literal">TIMESTAMP_TZ</code>, <code class="literal">TIME_TZ</code></span>
    .
    Типы доступны начиная с Firebird 4.0.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.pdo-mysql">
   <h4 class="title">Драйвер PDO_MYSQL</h4>

   <p class="simpara">
    Значение атрибута
    <strong><code><a href="pdo.constants.php#pdo.constants.attr-fetch-table-names">PDO::ATTR_FETCH_TABLE_NAMES</a></code></strong>
    
    теперь возможно получать методом <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.pdo-pgsql">
   <h4 class="title">Драйвер PDO_PGSQL</h4>

   <p class="simpara">
    Добавили поддержку получения информации о потреблении памяти запросами для флага
    <strong><code>PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE</code></strong>.
   </p>

   <p class="simpara">
    Значение тперь возвращается как число с плавающей точкой
    <span class="type"><a href="language.types.float.php" class="type float">float</a></span>, а не как строка (<span class="type"><a href="language.types.string.php" class="type string">string</a></span>),
    если столбец принадлежит типу <code class="literal">FLOAT4OID</code>
    или <code class="literal">FLOAT8OID</code>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.pgsql">
   <h4 class="title">Модуль PGSQL</h4>

   <p class="simpara">
    Параметр <code class="parameter">conditions</code>
    функции <span class="function"><a href="function.pg-select.php" class="function">pg_select()</a></span> теперь необязателен и принимает пустой массив.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.phar">
   <h4 class="title">Модуль Phar</h4>

   <p class="para">
    В методах
    <span class="simplelist"><span class="methodname"><a href="phar.setalias.php" class="methodname">Phar::setAlias()</a></span>, <span class="methodname"><a href="phar.setdefaultstub.php" class="methodname">Phar::setDefaultStub()</a></span></span>
    предварительный тип возврата <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> изменили
    на <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.posix">
   <h4 class="title">Модуль POSIX</h4>

   <p class="simpara">
    Функция <span class="function"><a href="function.posix-isatty.php" class="function">posix_isatty()</a></span> теперь устанавливает номер ошибки,
    если аргумент дескриптора файла или потока недопустим.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.reflection">
   <h4 class="title">Модуль Reflection</h4>

   <p class="simpara">
    Метод <span class="methodname"><a href="reflectiongenerator.getfunction.php" class="methodname">ReflectionGenerator::getFunction()</a></span>
    теперь разрешили вызывать, когда завершится выполнение генератора.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.sockets">
   <h4 class="title">Модуль Sockets</h4>

   <p class="simpara">
    Значение по умолчанию для параметра <code class="parameter">backlog</code>
    функции <span class="function"><a href="function.socket-create-listen.php" class="function">socket_create_listen()</a></span> изменили
    на <strong><code><a href="sockets.constants.php#constant.somaxconn">SOMAXCONN</a></code></strong>.
    Раньше значение по умолчанию равнялось <code class="literal">128</code>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.sodium">
   <h4 class="title">Модуль Sodium</h4>

   <p class="simpara">
    Функции семейства <span class="function">sodium_crypto_aead_aes256gcm_<span class="replaceable">*</span></span>
    теперь доступны для центральных процессоров, которые построили по архитектуре aarch64,
    с криптографическими модулями ARM.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.spl">
   <h4 class="title">Стандартная PHP-библиотека SPL</h4>

   <p class="para">
    Предварительный тип возврата в методах
    <span class="simplelist"><span class="methodname"><a href="splpriorityqueue.insert.php" class="methodname">SplPriorityQueue::insert()</a></span>, <span class="methodname"><a href="splpriorityqueue.recoverfromcorruption.php" class="methodname">SplPriorityQueue::recoverFromCorruption()</a></span>, <span class="methodname"><a href="splheap.insert.php" class="methodname">SplHeap::insert()</a></span>, <span class="methodname"><a href="splheap.recoverfromcorruption.php" class="methodname">SplHeap::recoverFromCorruption()</a></span></span>
    изменили с <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> на <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span>.
   </p>

   <p class="simpara">
    Класс <span class="classname"><a href="class.splobjectstorage.php" class="classname">SplObjectStorage</a></span> теперь реализует
    итератор <span class="interfacename"><a href="class.seekableiterator.php" class="interfacename">SeekableIterator</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.standard">
   <h4 class="title">Стандартные функции</h4>

   <p class="simpara">

    Значение по умолчанию стоимости <code class="literal">&#039;cost&#039;</code> для алгоритма хеширования <strong><code><a href="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong>
    в функции <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> увеличили
    с <code class="literal">10</code> до <code class="literal">12</code>.
    
   </p>

   <p class="simpara">
    Функция <span class="function"><a href="function.debug-zval-dump.php" class="function">debug_zval_dump()</a></span> теперь указывает, упакован ли массив.
   </p>

   <p class="simpara">
    Тип возврата в функции <span class="function"><a href="function.long2ip.php" class="function">long2ip()</a></span> изменили со <code class="literal">string|false</code>
    
    на <span class="type"><a href="language.types.string.php" class="type string">string</a></span>.
   </p>

   <p class="simpara">
    
    Тип возврата в функции <span class="function"><a href="function.highlight-string.php" class="function">highlight_string()</a></span> изменили
    со <code class="literal">string|bool</code> на <span class="type">string|true</span>.
   </p>

   <p class="simpara">
    
    Тип возврата в функции <span class="function"><a href="function.print-r.php" class="function">print_r()</a></span> изменили
    со <code class="literal">string|bool</code> на <span class="type">string|true</span>.
   </p>

   
   <div class="sect4">
    <h5 class="title">Округление чисел функцией <span class="function"><a href="function.round.php" class="function">round()</a></span></h5>

    <p class="simpara">
     Тип параметра <code class="parameter">mode</code> функции
     <span class="function"><a href="function.round.php" class="function">round()</a></span> расширили
     
     до типа <code class="literal">RoundingMode|int</code>,
     
     который теперь принимает новое перечисление <span class="classname"><a href="enum.roundingmode.php" class="classname">RoundingMode</a></span>.
     
    </p>

    <p class="para">
     В функцию <span class="function"><a href="function.round.php" class="function">round()</a></span> добавили четыре новых режима:
     <span class="simplelist">RoundingMode::PositiveInfinity, RoundingMode::NegativeInfinity, RoundingMode::TowardsZero, RoundingMode::AwayFromZero</span>
     
    </p>

    <p class="simpara">
     Внутреннюю реализацию округления до целых чисел переписали,
     чтобы реализацию было легче проверять на корректность и поддерживать.
     По ходу переписывания исправили ряд ошибок округления.
     Например, раньше округление числа <code class="literal">0.49999999999999994</code>
     до ближайшего целого вернуло бы значение <code class="literal">1.0</code>
     вместо правильного результата — <code class="literal">0.0</code>.
     Округление также затронет часть дополнительных входных данных
     и выдаст другой по сравнению с предыдущими версиями PHP результат.
    </p>

    <p class="simpara">
     Исправили ошибку, которую вызывало «предварительное округление» в функции <span class="function"><a href="function.round.php" class="function">round()</a></span>.
     Раньше для обработки как десятичного числа, значения наподобие <code class="literal">0.285</code>,
     которое PHP внутренне представляет как <code class="literal">0.28499999999999998</code>,
     функция вначале «предварительно округляла» число, а затем округляла результат до <code class="literal">0.29</code>.
     Однако «предварительное округление» неправильно округляет отдельные числа, поэтому это исправление
     удаляет «предварительное округление» и изменяет способ сравнения чисел, чтобы значения
     правильно округлялись как десятичные числа, а не как числа с плавающей точкой по стандарту IEEE754.
    </p>

    <p class="simpara">
     Максимальную точность, с которой функция <span class="function"><a href="function.round.php" class="function">round()</a></span> умеет обрабатывать числа,
     увеличили на один знак.
     Например, вызов <code class="code">round(4503599627370495.5)</code> возвращал
     число <code class="literal">4503599627370495.5</code>,
     а теперь возвращает <code class="literal">4503599627370496</code>.
    </p>

   </div>
  </div>

 </div>

 <div class="sect2" id="migration84.other-changes.extensions">
  <h3 class="title">Другие изменения в модулях</h3>

  <div class="sect3" id="migration84.other-changes.extensions.curl">
   <h4 class="title">Модуль cURL</h4>

   <p class="simpara">
    Минимальная версия библиотеки libcurl, которая требуется для работы модуля, теперь 7.61.0.
   </p>

   <p class="simpara">
    Опция <strong><code><a href="curl.constants.php#constant.curlopt-dns-use-global-cache">CURLOPT_DNS_USE_GLOBAL_CACHE</a></code></strong> больше
    ни на что не влияет, и без предупреждения игнорируется.
    Опция устарела на нижележащем уровне — в библиотеке libcurl 7.11.1,
    а в libcurl 7.62.0 опцию удалили.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.gmp">
   <h4 class="title">Модуль GMP</h4>

   
   <p class="simpara">
    <span class="classname"><a href="class.gmp.php" class="classname">GMP</a></span>-объекты разрешили приводить к логическому типу <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>,
    раньше выдавалась ошибка уровня <strong><code><a href="errorfunc.constants.php#constant.e-recoverable-error">E_RECOVERABLE_ERROR</a></code></strong>.
    Поведение приведения перегружается так, чтобы <span class="classname"><a href="class.gmp.php" class="classname">GMP</a></span>-объект,
    который представляет значение <code class="literal">0</code>, приводился к логическому значению <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.libxml">
   <h4 class="title">Модуль LibXML</h4>

   <p class="simpara">
    Минимальная версия библиотеки libxml2, которая требуется для работы модуля, теперь 2.9.4.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.intl">
   <h4 class="title">Модуль Intl</h4>

   <p class="simpara">
    Поведение класса Intl нормализовали так, чтобы при попытке
    использовать неинициализированный объект или при ошибках клонирования
    класс выбрасывал ошибку <span class="exceptionname"><a href="class.error.php" class="exceptionname">Error</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.mbstring">
   <h4 class="title">Модуль MBString</h4>

   <p class="simpara">
    Таблицы данных Юникода обновили до Unicode 16.0.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.mysqlnd">
   <h4 class="title">Драйвер MySQLnd</h4>

   <p class="simpara">
    Добавили поддержку нового типа данных БД MySQL 9 — VECTOR.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.openssl">
   <h4 class="title">Модуль OpenSSL</h4>

   <p class="simpara">
    Минимальная версия библиотеки OpenSSL, которая требуется для работы модуля, теперь 1.1.1.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.pdo-pgsql">
   <h4 class="title">Драйвер PDO_PGSQL</h4>

   <p class="simpara">
    Минимальная версия библиотеки libpq, которая требуется для работы драйвера, теперь 10.0.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.pgsql">
   <h4 class="title">Модуль PGSQL</h4>

   <p class="simpara">
    Минимальная версия библиотеки libpq, которая требуется для работы модуля, теперь 10.0.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.spl">
   <h4 class="title">Стандартная PHP-библиотека SPL</h4>

   <p class="simpara">
    Доступ за пределы массива в <span class="classname"><a href="class.splfixedarray.php" class="classname">SplFixedArray</a></span>
    теперь вместо <span class="exceptionname"><a href="class.runtimeexception.php" class="exceptionname">RuntimeException</a></span>
    выбрасывает исключение <span class="exceptionname"><a href="class.outofboundsexception.php" class="exceptionname">OutOfBoundsException</a></span>.
    Поскольку <span class="exceptionname"><a href="class.outofboundsexception.php" class="exceptionname">OutOfBoundsException</a></span> —
    дочерний класс <span class="exceptionname"><a href="class.runtimeexception.php" class="exceptionname">RuntimeException</a></span>,
    поведение при попытке перехватить эти исключения не меняется.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.xsl">
   <h4 class="title">Модуль XSL</h4>

   <p class="simpara">
    Объявили типизированные свойства <span class="property"><a href="class.xsltprocessor.php#xsltprocessor.props.clonedocument">XSLTProcessor::$cloneDocument</a></span>
    и <span class="property"><a href="class.xsltprocessor.php#xsltprocessor.props.doxinclude">XSLTProcessor::$doXInclude</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.zlib">
   <h4 class="title">Модуль Zlib</h4>

   <p class="simpara">
    Минимальная версия библиотеки zlib, которая требуется для работы модуля, теперь 1.2.11.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.other-changes.performance">
  <h3 class="title">Производительность</h3>

  <div class="sect3" id="migration84.other-changes.performance.core">
   <h4 class="title">Ядро</h4>

   <p class="simpara">
    Улучшили производительность разбора и форматирования чисел с плавающей точкой
    в ZTS-сборках при высокой параллельной нагрузке.
    Это влияет на семейство функций <span class="function"><a href="function.printf.php" class="function">printf()</a></span>,
    и на функции сериализации наподобие <span class="function"><a href="function.json-encode.php" class="function">json_encode()</a></span>
    или <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span>.
   </p>

   <p class="simpara">
    Вызов функции <span class="function"><a href="function.sprintf.php" class="function">sprintf()</a></span> только со спецификаторами <code class="literal">%s</code>
    и <code class="literal">%d</code> скомпилирует эквивалентную интерполяцию строки
    без накладных расходов на вызов функции
    и без повторного анализа строки формата.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.bcmath">
   <h4 class="title">Модуль BCMath</h4>

   <p class="simpara">
    Улучили производительность числовых преобразований и операций.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.dom">
   <h4 class="title">Модуль DOM</h4>

   <p class="simpara">
    Производительность метода <span class="methodname"><a href="domnode.c14n.php" class="methodname">DOMNode::C14N()</a></span> значительно
    улучшили при вызове без xpath-выражения.
    Изменение иногда сокращает время запроса на два порядка
    при обработке документов с десятками тысяч узлов.
   </p>

   <p class="simpara">
    Улучшили производительность и снизили потребление памяти при XML-сериализации.
   </p>

   <p class="simpara">
    Снизили потребление памяти классами узлов.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.ftp">
   <h4 class="title">Модуль FTP</h4>

   <p class="simpara">
    Улучшили производительность загрузки больших файлов
    по протоколу FTP до 10 раз.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.hash">
   <h4 class="title">Модуль Hash</h4>

   <p class="simpara">
    Добавили реализацию алгоритма SHA-256 инструкциями SSE2 и SHA-NI.
    Изменение повышает производительность поддерживаемых процессоров
    примерно в 1,3 раза для SSE2-инструкций и до 3-5 раз для инструкций SHA-NI.
    Благодарим Колина Персиваля (англ. Colin Percival), разработчика сервиса резервного копирования Tarsnap, за эту оптимизацию.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.mbstring">
   <h4 class="title">Модуль MBString</h4>

   <p class="simpara">
    Функция <span class="function"><a href="function.mb-strcut.php" class="function">mb_strcut()</a></span> теперь быстрее обрабатывает строки
    в кодировках UTF-8 и UTF-16.
   </p>

   <p class="simpara">
    Поиск названий кодировок многобайтовых строк теперь выполняется намного быстрее.
   </p>

   <p class="simpara">
    Значительно улучшили производительность преобразования строк в кодировке SJIS-win в кодировку Unicode.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.mysqlnd">
   <h4 class="title">Драйвер MySQLnd</h4>

   <p class="simpara">
    Улучшили производительность при обработке драйвером MySQLnd значений в кавычках в MySQL-запросах.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.pcre">
   <h4 class="title">Модуль PCRE</h4>

   <p class="simpara">
    Улучшили производительность именованных групп захвата.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.random">
   <h4 class="title">Модуль Random</h4>

   <p class="simpara">
    Улучшили производительность класса <span class="classname"><a href="class.random-randomizer.php" class="classname">Random\Randomizer</a></span>,
    повышенное внимание уделили методам
    <span class="methodname"><a href="random-randomizer.getbytes.php" class="methodname">Random\Randomizer::getBytes()</a></span>
    и <span class="methodname"><a href="random-randomizer.getbytesfromstring.php" class="methodname">Random\Randomizer::getBytesFromString()</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.simplexml">
   <h4 class="title">Модуль SimpleXML</h4>

   <p class="simpara">
    Улучшили производительность и снизили потребление памяти при XML-сериализации.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.standard">
   <h4 class="title">Стандартные функции</h4>

   <p class="simpara">
    Значительно улучшили производительность функций <span class="function"><a href="function.strspn.php" class="function">strspn()</a></span>
    и <span class="function"><a href="function.strcspn.php" class="function">strcspn()</a></span>.
    Теперь функции работают за линейное время, а не ограничиваются квадратичным временем.
   </p>

   <p class="simpara">
    Улучшили производительность функции <span class="function"><a href="function.strpbrk.php" class="function">strpbrk()</a></span>.
   </p>

   <p class="simpara">
    Функция <span class="function"><a href="function.get-browser.php" class="function">get_browser()</a></span> теперь работает
    до 1,5-2,5 раза быстрее в отдельных тестах.
   </p>
  </div>
 </div>

</div><?php manual_footer($setup); ?>