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

contributors($setup);

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

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

  <div class="sect3" id="migration83.other-changes.core.ffi">
   <h4 class="title">Класс FFI</h4>

   <p class="para">
    Метод <span class="methodname"><a href="ffi.load.php" class="methodname">FFI::load()</a></span> теперь разрешён в режиме предварительной загрузки,
    когда опция <a href="opcache.configuration.php#ini.opcache.preload-user" class="link">opcache.preload_user</a> —
    это текущий пользователь системы. Ранее
    вызов метода <span class="methodname"><a href="ffi.load.php" class="methodname">FFI::load()</a></span> не был возможен
    во время предзагрузки, если
    настройка директивы <a href="opcache.configuration.php#ini.opcache.preload-user" class="link">opcache.preload_user</a>
    была установлена.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.core.fpm">
   <h4 class="title">Менеджер процессов FPM</h4>

   <p class="para">
    Проверка FPM CLI теперь завершается неудачей, если путь к сокету длиннее, чем поддерживает операционная система.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.core.opcache">
   <h4 class="title">Модуль Opcache</h4>

   <p class="para">
    В CLI и phpdbg SAPIs предварительная загрузка больше не требует
    настройки директивы <a href="opcache.configuration.php#ini.opcache.preload-user" class="link">opcache.preload_user</a>
    при запуске от имени пользователя root.
    В других SAPIs эта директива нужна при запуске от имени пользователя root,
    потому что предзагрузка выполнялась до того, как SAPI переключится на непривилегированного пользователя.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.core.streams">
   <h4 class="title">Потоки</h4>

   <p class="para">
    Блокировка функцией <span class="function"><a href="function.fread.php" class="function">fread()</a></span> при подключении к сокету возвращается немедленно,
    если есть любые буферизованные данные, вместо ожидания дополнительных данных.
   </p>

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

   <p class="para">
    Операции доступа функции <span class="function"><a href="function.stat.php" class="function">stat()</a></span>
    наподобие функции <span class="function"><a href="function.file-exists.php" class="function">file_exists()</a></span> и похожие теперь пользуются реальным
    путём вместо фактического пути потока. Это соответствует открытию
    потока.
   </p>
  </div>
 </div>

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

  <div class="sect3" id="migration83.other-changes.sapi.cli">
   <h4 class="title">Командная строка (CLI)</h4>

   <p class="para">
    Потоки <strong><code><a href="reserved.constants.php#constant.stdout">STDOUT</a></code></strong>, <strong><code><a href="reserved.constants.php#constant.stderr">STDERR</a></code></strong>
    и <strong><code><a href="reserved.constants.php#constant.stdin">STDIN</a></code></strong> больше не закрываются при уничтожении ресурсов,
    что обычно случается при завершении работы CLI.
    Однако всё ещё можно явно закрыть эти потоки
    через функцию <span class="function"><a href="function.fclose.php" class="function">fclose()</a></span> и похожие.
   </p>
  </div>
 </div>

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

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

   <p class="para">
    В функцию <span class="function"><a href="function.gc-status.php" class="function">gc_status()</a></span> добавлено 8 следующих полей:

    <ul class="simplelist">
     <li><code class="literal">running</code> => bool</li>
     <li><code class="literal">protected</code> => bool</li>
     <li><code class="literal">full</code> => bool</li>
     <li><code class="literal">buffer_size</code> => int</li>
     <li><code class="literal">application_time</code> => float: Полное время
     работы приложения в секундах (включая время, затраченное полем collector_time)</li>
     <li><code class="literal">collector_time</code> => float: Время в секундах,
     затраченное циклами сборки (включая время, затраченное полями destructor_time и free_time)</li>
     <li><code class="literal">destructor_time</code> => float: Время в секундах, затраченное
     деструкторами в течение цикла сборки</li>
     <li><code class="literal">free_time</code> => float: Время в секундах, затраченное на освобождение значений
     во время цикла сборки</li>
    </ul>
   </p>

   <p class="para">
    Функция <span class="function"><a href="function.class-alias.php" class="function">class_alias()</a></span> теперь поддерживает создание псевдонимов
    внутреннего класса.
   </p>

   <p class="para">
    Настройка <a href="ini.core.php#ini.open-basedir" class="link">open_basedir</a> с вызовом
    во время выполнения функции <code class="code">ini_set(&#039;open_basedir&#039;, ...);</code> больше не принимает пути,
    содержащие родительскую директорию (<code class="literal">..</code>). Ранее
    запрещались только пути, начинающиеся с <code class="literal">..</code>. Это можно
    легко обойти, добавив <code class="literal">./</code> к пути.
   </p>

   <p class="para">
    Обработчики пользовательских исключений теперь перехватывают их во время завершения работы.
   </p>

   <p class="para">
    Результирующий HTML в функциях <span class="function"><a href="function.highlight-string.php" class="function">highlight_string()</a></span>
    и <span class="function"><a href="function.highlight-file.php" class="function">highlight_file()</a></span> был изменён.
    Пробел между внешними HTML-тегами удалены. Новые строки и пробелы
    больше не преобразовываются в HTML-сущности. Полный HTML теперь обёрнут
    тегом <code class="literal">&lt;pre&gt;</code>. Внешний тег <code class="literal">&lt;span&gt;</code>
    был слит с тегом <code class="literal">&lt;code&gt;</code>.
   </p>

  </div>

  <div class="sect3" id="migration83.other-changes.functions.calendar">
   <h4 class="title">Модуль Calendar</h4>

   <p class="para">
    Функция <span class="function"><a href="function.easter-date.php" class="function">easter_date()</a></span> теперь поддерживает годы с 1970
    по 2 000 000 000 на 64-битных системах, ранее она поддерживала только годы
    в диапазоне 1970—2037.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.functions.curl">
   <h4 class="title">Модуль Curl</h4>

   <p class="para">
    Функция <span class="function"><a href="function.curl-getinfo.php" class="function">curl_getinfo()</a></span> теперь поддерживает две новых константы:
    <strong><code><a href="curl.constants.php#constant.curlinfo-capath">CURLINFO_CAPATH</a></code></strong>
    и <strong><code><a href="curl.constants.php#constant.curlinfo-cainfo">CURLINFO_CAINFO</a></code></strong>. Если параметр option принимает значение <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>,
    будут представлены два следующих дополнительных ключа:
    <code class="literal">capath</code> и <code class="literal">cainfo</code>.
   </p>
  </div>

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

   <p class="para">
    У метода <span class="methodname"><a href="domcharacterdata.appenddata.php" class="methodname">DOMCharacterData::appendData()</a></span> предопределённый тип
    возвращаемого значения изменился на <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span>.
   </p>

   <p class="para">
    У методов <span class="methodname"><a href="domdocument.loadhtml.php" class="methodname">DOMDocument::loadHTML()</a></span>,
    <span class="methodname"><a href="domdocument.loadhtmlfile.php" class="methodname">DOMDocument::loadHTMLFile()</a></span>
    и <span class="methodname"><a href="domdocument.loadxml.php" class="methodname">DOMDocument::loadXML()</a></span> предварительный тип
    возвращаемого значения был изменён на <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>. Раньше это было задокументировано
    как <code class="code">DOMDocument|bool</code>, но начиная с PHP 8.0.0
    объект класса <span class="classname"><a href="class.domdocument.php" class="classname">DOMDocument</a></span>
    не может быть возвращён, поскольку он больше не может быть вызван статически.
   </p>

  </div>

  <div class="sect3" id="migration83.other-changes.functions.gd">
   <h4 class="title">Модуль Gd</h4>

   <p class="para">
    Сигнатура функции <span class="function"><a href="function.imagerotate.php" class="function">imagerotate()</a></span> изменилась.
    Параметр <code class="parameter">$ignore_transparent</code> был удалён,
    поскольку он игнорировался с версии PHP 5.5.0.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.functions.intl">
   <h4 class="title">Модуль интернационализации Intl</h4>

   <p class="para">
    Функция <span class="function"><a href="intldateformatter.settimezone.php" class="function">datefmt_set_timezone()</a></span> (и её псевдоним
    — метод <span class="methodname"><a href="intldateformatter.settimezone.php" class="methodname">IntlDateformatter::setTimeZone()</a></span>)
    теперь возвращают значение <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> при успешном выполнении, ранее они возвращали значение <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
   </p>

   <p class="para">
    Метод <span class="methodname"><a href="intlbreakiterator.settext.php" class="methodname">IntlBreakiterator::setText()</a></span> теперь возвращает значение <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>
    при сбое, ранее он возвращал значение <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
    Теперь он возвращает значение <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> при успешном выполнении, ранее возвращалось значение <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
   </p>

   <p class="para">
    Метод <span class="methodname"><a href="intlchar.enumcharnames.php" class="methodname">IntlChar::enumCharNames()</a></span> теперь возвращает логическое значение.
    Ранее он возвращал значение <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> при успешном выполнении и значение <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> при неудачном завершении.
   </p>

   <p class="para">
    Метод <span class="methodname"><a href="intldateformatter.create.php" class="methodname">IntlDateFormatter::__construct()</a></span> выбрасывает исключение <strong><code><a href="intl.constants.php#constant.u-illegal-argument-error">U_ILLEGAL_ARGUMENT_ERROR</a></code></strong>
    при установке недопустимого языкового стандарта (локали).
   </p>
  </div>

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

   <p class="para">
    Функции <span class="function"><a href="function.mb-strtolower.php" class="function">mb_strtolower()</a></span> и <span class="function"><a href="function.mb-convert-case.php" class="function">mb_convert_case()</a></span>
    соблюдают правила условного регистра для греческой буквы сигма (Σ → σ).
    В функции <span class="function"><a href="function.mb-convert-case.php" class="function">mb_convert_case()</a></span>
    условный регистр применяется только для режимов <strong><code><a href="mbstring.constants.php#constant.mb-case-lower">MB_CASE_LOWER</a></code></strong>
    и <strong><code><a href="mbstring.constants.php#constant.mb-case-title">MB_CASE_TITLE</a></code></strong>, но не для
    <strong><code><a href="mbstring.constants.php#constant.mb-case-lower-simple">MB_CASE_LOWER_SIMPLE</a></code></strong>
    и <strong><code><a href="mbstring.constants.php#constant.mb-case-title-simple">MB_CASE_TITLE_SIMPLE</a></code></strong>.
   </p>

   <p class="para">
    Функция <span class="function"><a href="function.mb-decode-mimeheader.php" class="function">mb_decode_mimeheader()</a></span> интерпретирует подчёркивание
    в QPrint-кодированной MIME-кодировке слов так, как требует стандарт RFC 2047; они
    преобразовываются в пробелы.
    Подчёркивания должны быть закодированы в <code class="literal">«=5F»</code> с таких
    MIME-кодированных словах.
   </p>

   <p class="para">
    В редких случаях функция <span class="function"><a href="function.mb-encode-mimeheader.php" class="function">mb_encode_mimeheader()</a></span> будет применять кодировку передачи
    к своей входной строке, чтобы она могла передать её как необработанный ASCII в PHP 8.2.
   </p>

   <p class="para">
    Функция <span class="function"><a href="function.mb-encode-mimeheader.php" class="function">mb_encode_mimeheader()</a></span> больше не сбрасывает NUL-байты
    при QPrint-кодировании входной строки.
    Ранее это иногда приводило к повреждению функцией mb_encode_mimeheader
    строк в ряде текстовых кодировок,
    особенно UTF-16 и UTF-32.
   </p>

   <p class="para">
    «Нестрогий» режим функции <span class="function"><a href="function.mb-detect-encoding.php" class="function">mb_detect_encoding()</a></span> теперь
    ведёт себя как описано в документации.
    Ранее она возвращала значение <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>, если тот же байт (например, первый)
    входной строки был недопустимым во всех проверяемых кодировках.
    В общем смысле, она исключала предложенные кодировки из рассмотрения,
    если был обнаружен недопустимый байт, и если тот же входной байт исключил
    все оставшиеся кодировки, всё ещё находящиеся на рассмотрении, она могла вернуть значение <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
    С другой стороны, если все предложенные кроме одной кодировки были исключены
    из рассмотрения, она возвращала последнюю оставшуюся, без учёта того,
    сколько ошибок кодирования может встретиться позже в строке.
    Это отличается от поведения, описанного в документации, которое
    говорило: «Если параметр strict установлен в значение false, будет возвращена
    первая совпадающая кодировка».
   </p>
  </div>

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

   <p class="para">
    Функция <span class="function"><a href="mysqli-result.fetch-object.php" class="function">mysqli_fetch_object()</a></span> теперь выбрасывает исключение
    <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> вместо исключения <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span>,
    когда в параметр <code class="parameter">$constructor_args</code> передан непустой аргумент,
    а в классе не определён конструктор.
   </p>

   <p class="para">
    Функция <span class="function"><a href="mysqli.poll.php" class="function">mysqli_poll()</a></span> теперь выбрасывает исключение <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span>,
    когда не переданы ни аргументы параметра <code class="parameter">$read</code>,
    ни аргументы параметра <code class="parameter">$error</code>.
   </p>

   <p class="para">
    В функции <span class="function"><a href="mysqli-result.field-seek.php" class="function">mysqli_field_seek()</a></span>
    и методе <span class="methodname"><a href="mysqli-result.field-seek.php" class="methodname">mysqli_result::field_seek()</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="migration83.other-changes.functions.odbc">
   <h4 class="title">Программный интерфейс ODBC</h4>

   <p class="para">
    Теперь для параметра <code class="parameter">$enable</code>
    функция <span class="function"><a href="function.odbc-autocommit.php" class="function">odbc_autocommit()</a></span> принимает значение <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
    При передаче значения <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> функция будет вести себя так же, как и при передаче значения только для одного параметра,
    то есть — укажет, включена ли автофиксация или нет.
   </p>
  </div>

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

   <p class="para">
    Функция <span class="function"><a href="function.pg-fetch-object.php" class="function">pg_fetch_object()</a></span> теперь выбрасывает исключение
    <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> вместо исключения <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span>,
    когда в параметр <code class="parameter">$constructor_args</code> передаётся непустой аргумент,
    а в классе не определён конструктор.
   </p>

   <p class="para">
    Функция <span class="function"><a href="function.pg-insert.php" class="function">pg_insert()</a></span> теперь выбрасывает исключение <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span>
    вместо ошибки уровня <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>, когда указанная таблица недопустима.
   </p>

   <p class="para">
    Функции <span class="function"><a href="function.pg-insert.php" class="function">pg_insert()</a></span> и <span class="function"><a href="function.pg-convert.php" class="function">pg_convert()</a></span> выбрасывают исключения
    <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> или <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span>
    вместо ошибки уровня <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>, когда значение/тип поля
    правильно не совпадает с типом PostgreSQL.
   </p>

   <p class="para">
    Параметр <code class="parameter">$row</code>
    функций <span class="function"><a href="function.pg-fetch-result.php" class="function">pg_fetch_result()</a></span>,
    <span class="function"><a href="function.pg-field-prtlen.php" class="function">pg_field_prtlen()</a></span>
    и <span class="function"><a href="function.pg-field-is-null.php" class="function">pg_field_is_null()</a></span> теперь может принимать значение <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
   </p>
  </div>

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

   <p class="para">
    Изменены функции <span class="function"><a href="function.mt-srand.php" class="function">mt_srand()</a></span> и <span class="function"><a href="function.srand.php" class="function">srand()</a></span>,
    чтобы не проверять количество аргументов для определения, надо ли использовать случайное начальное число.
    Передача значения <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> сгенерирует случайное начальное число, при передаче значения <code class="literal">0</code>
    оно и будет выбрано случайным числом. Работа функции теперь согласована с методом
    <span class="methodname"><a href="random-engine-mt19937.construct.php" class="methodname">Random\Engine\Mt19937::__construct()</a></span>.
   </p>

  </div>

  <div class="sect3" id="migration83.other-changes.functions.reflection">
   <h4 class="title">Класс Reflection</h4>

   <p class="para">
    Возвращаемый тип метода <span class="methodname"><a href="reflectionclass.getstaticproperties.php" class="methodname">ReflectionClass::getStaticProperties()</a></span>
    больше не может принимать значение <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
   </p>
  </div>

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

   <p class="para">
    Вызов ошибки уровня <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong> в функции <span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span>
    был повышен до <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>.
    
   </p>

   <p class="para">
    Функция <span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span> теперь выдаёт ошибку уровня <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>,
    если входные данные содержат неиспользованные байты.
    
   </p>

   <p class="para">
    Функция <span class="function"><a href="function.array-pad.php" class="function">array_pad()</a></span> теперь ограничена только максимальным количеством
    элементов, которые может содержать массив. Раньше за один раз она могла добавить
    только 1 048 576 элементов.
   </p>

   <p class="para">
    Функция <span class="function"><a href="function.strtok.php" class="function">strtok()</a></span> выдаёт ошибку уровня <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>,
    если токен не предоставлен при запуске токенизации.
   </p>

   <p class="para">
    Функция <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> теперь будет связывать в цепочку базовое
    исключение <span class="classname"><a href="class.random-randomexception.php" class="classname">Random\RandomException</a></span>
    как исключение <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> свойства <code class="parameter">$previous</code>
    исключения <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span>,
    когда генерация соли завершится неудачей.
   </p>

   <p class="para">
    Передаваемый в параметр <code class="parameter">$command</code>
    функции <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span> массив теперь должен содержать хотя бы один
    непустой элемент. Или будет выброшено исключение <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span>.
   </p>

   <p class="para">
    Функция <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span> возвращает значение <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>, если
    переданный в параметр <code class="parameter">$command</code> массив — это не допустимая команда,
    а объект ресурса, который выдаёт предупреждение позже.
    Это уже было в Windows, но теперь это также имеет место,
    если выбрана реализация posix_spawn (бо́льшая часть платформ Linux, BSD и MacOS).
    Всё ещё существуют старые платформы, на которых это поведение не изменено, поскольку posix_spawn
    на них не поддерживается.
   </p>

   <p class="para">
    Функции <span class="function"><a href="function.array-sum.php" class="function">array_sum()</a></span> и <span class="function"><a href="function.array-product.php" class="function">array_product()</a></span> теперь
    предупреждают, когда значения в массиве не могут быть преобразованы в целое число/число с плавающей точкой.
    Раньше массивы и объекты игнорировались, тогда как все остальные значения приводились к целым числам (<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>).
    Больше того, объекты, определяющие числовое приведение (например,
    <a href="book.gmp.php" class="link">GMP</a>), теперь приводятся, а не игнорируются.
    
   </p>

   <p class="para">
    Параметр <code class="parameter">$decimals</code> функции <span class="function"><a href="function.number-format.php" class="function">number_format()</a></span>
    теперь правильно обрабатывает отрицательные целые числа.
    Округление с отрицательным значением для параметра <code class="parameter">$decimals</code> означает,
    что значение параметра <code class="parameter">$num</code> округляется до установленных в параметре <code class="parameter">$decimals</code>
    значащих цифр перед десятичной точкой.
    Ранее отрицательные значения параметра <code class="parameter">$decimals</code>
    молча игнорировались и число округлялось до нуля десятичных знаков.
   </p>

   <p class="para">
    Новый параметр <code class="parameter">$before_needle</code> был добавлен
    в функцию <span class="function"><a href="function.strrchr.php" class="function">strrchr()</a></span>. Он ведет себя так же, как его аналог
    в функциях <span class="function"><a href="function.strstr.php" class="function">strstr()</a></span> или <span class="function"><a href="function.stristr.php" class="function">stristr()</a></span>.
   </p>

   <p class="para">
    Функции <span class="function"><a href="function.str-getcsv.php" class="function">str_getcsv()</a></span> и <span class="function"><a href="function.fgetcsv.php" class="function">fgetcsv()</a></span> теперь возвращают
    пустую строку вместо строки с одним нулевым байтом для последнего поля,
    которое содержит только незавершенное вложение.
   </p>
  </div>

 </div>

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

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

   <p class="para">
    Указание <a href="language.operators.increment.php" class="link">операторов инкремента/декремента</a>
    (<code class="literal">++</code>/<code class="literal">--</code>) на логических
    значениях (<span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>) теперь выдаёт предупреждения.
    Это потому, что пока это не даёт эффекта, но в будущем будет вести себя как
    <code class="code">$bool += 1</code>.
   </p>

   <p class="para">
    Указание <a href="language.operators.increment.php" class="link">оператора декремента</a>
    (<code class="literal">--</code>) на значения <span class="type"><a href="language.types.null.php" class="type null">null</a></span> теперь выдаёт предупреждения.
    Это потому, что пока это не даёт эффекта, но в будущем будет вести себя как
    <code class="code">$null -= 1</code>.
   </p>

   <p class="para">
    Внутренние объекты, которые реализуют приведение _IS_NUMBER, но не обработчик do_operator,
    который переопределяет сложение и вычитание, теперь можно увеличивать или уменьшать на единицу,
    как если бы выполнялись выражения <code class="code">$o += 1</code> или <code class="code">$o -= 1</code>.
   </p>
  </div>

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

   <p class="para">
    Механизм жизненного цикла модуля DOM был переработан так, чтобы неявно удалённые
    узлы по-прежнему можно было получить. Ранее это приводило к исключению.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.extensions.sqlite3">
   <h4 class="title">Класс SQLite3</h4>

   <p class="para">
    Класс <span class="classname"><a href="class.sqlite3.php" class="classname">SQLite3</a></span> теперь вместо исключения <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span>
    выбрасывает исключение <span class="classname"><a href="class.sqlite3exception.php" class="classname">SQLite3Exception</a></span> (расширяя
    класс исключения <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span>).
   </p>

   <p class="para">
    Код ошибки класса SQLite теперь передаётся в коде ошибки исключения, а не
    включается в сообщение об ошибке.
   </p>

  </div>
 </div>

 <div class="sect2" id="migration83.other-changes.ini">
  <h3 class="title">Изменения обработки INI-файла</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     INI-директивы <code class="literal">assert.*</code> устарели для настроек конфигурации.
     Сюда входят следующие настройки INI:
     <ul class="simplelist">
      <li><a href="info.configuration.php#ini.assert.active" class="link">assert.active</a></li>
      <li><a href="info.configuration.php#ini.assert.bail" class="link">assert.bail</a></li>
      <li><a href="info.configuration.php#ini.assert.callback" class="link">assert.callback</a></li>
      <li><a href="info.configuration.php#ini.assert.exception" class="link">assert.exception</a></li>
      <li><a href="info.configuration.php#ini.assert.warning" class="link">assert.warning</a></li>
     </ul>
     Если значение настройки равно значению по умолчанию,
     уведомления об устаревании не будет выдано.
     Вместо них нужно пользоваться INI-директивой <a href="ini.core.php#ini.zend.assertions" class="link">zend.assertions</a>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <a href="info.configuration.php#ini.zend.max-allowed-stack-size" class="link">zend.max_allowed_stack_size</a> —
    это новая INI-директива, которая устанавливает максимальный размер стека.
    Возможные значения — это <code class="literal">0</code> (определяет максимальный размер стека процессов или потоков),
    <code class="literal">-1</code> (без ограничений) или положительное целое число байтов.
    Значение по умолчанию — <code class="literal">0</code>.
    Когда она не может определить  максимальный размер стека процессов
    или потоков, будет выбрано известное системное значение по умолчанию.
    Установка чрезмерно большого значения даст тот же эффект, что и отключение ограничения размера стека.
    Максимальный размер стека для файберов устанавливают директивой
     <a href="info.configuration.php#ini.fiber.stack-size" class="link">fiber.stack_size</a>.
    Выбрасывается ошибка <span class="classname"><a href="class.error.php" class="classname">Error</a></span> когда стек вызовов процессов превышает установленный директивой
     <a href="info.configuration.php#ini.zend.max-allowed-stack-size" class="link">zend.max_allowed_stack_size</a>-<a href="info.configuration.php#ini.zend.reserved-stack-size" class="link">zend.reserved_stack_size</a>
    размер байтов, для предотвращения ошибок сегментации, вызванных переполнением стека,
    для упрощения процесса отладки.
    Размер стека увеличивается во время неконтролируемых рекурсий с участием внутренних функций,
    или магических методов
    <a href="language.oop5.magic.php#object.tostring" class="link">__toString()</a>,
    <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>,
    <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a>,
    <a href="language.oop5.decon.php#object.destruct" class="link">__destruct()</a>.
    Это не связано с переполнением буфера стека и не связано с безопасностью.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <a href="info.configuration.php#ini.zend.reserved-stack-size" class="link">zend.reserved_stack_size</a>
     — это новая INI-директива, которая устанавливает зарезервированный размер стека в байтах.
     Это значение вычитается из максимального размера стека
     в качестве буфера при проверке размера стека.
    </p>
   </li>
   </ul>
 </div>

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

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

   <p class="para">
    При циклическом просмотре списка узлов в объекте <span class="classname"><a href="class.domnodelist.php" class="classname">DOMNodeList</a></span> теперь работает кеширование.
    Поэтому запрос элементов по умолчанию больше не занимает квадратичное время.
   </p>

   <p class="para">
    Получение текстового содержимого из узлов теперь избегает выделения памяти,
    что даёт прирост производительности.
   </p>

   <p class="para">
    Метод <span class="methodname"><a href="domchildnode.remove.php" class="methodname">DOMChildNode::remove()</a></span> теперь работает с производительностью O(1).
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.performance.standard">
   <h4 class="title">Standard</h4>

   <p class="para">
    Проверка ошибок флагов в функции <span class="function"><a href="function.file.php" class="function">file()</a></span> теперь примерно на 7 % быстрее.
   </p>
  </div>

  <div class="sect3" id="migration83.other-changes.performance.spl">
   <h4 class="title">Библиотека SPL</h4>

   <p class="para">
    Класс <span class="classname"><a href="class.recursivedirectoryiterator.php" class="classname">RecursiveDirectoryIterator</a></span> теперь выполняет
    меньше операций ввода-вывода при циклическом переборе каталога.
   </p>
  </div>
 </div>

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