<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'migration84.other-changes.php',
    1 => 'Otros cambios',
    2 => 'Otros cambios',
  ),
  'up' => 
  array (
    0 => 'migration84.php',
    1 => 'Migraci&oacute;n de PHP 8.3.x a PHP 8.4.x',
  ),
  'prev' => 
  array (
    0 => 'migration84.removed-extensions.php',
    1 => 'Extensiones eliminadas',
  ),
  'next' => 
  array (
    0 => 'migration84.windows-support.php',
    1 => 'Soporte para Windows',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Otros cambios</h2>

 <div class="sect2" id="migration84.other-changes.core">
  <h3 class="title">Cambios en el núcleo</h3>

  <div class="sect3" id="migration84.other-changes.core.closures">
   <h4 class="title">Clausuras</h4>

   <p class="simpara">
    Los nombres de las clausuras se han ajustado para incluir el nombre de la función padre
    y la línea de definición para hacerlos más fáciles de distinguir, por ejemplo,
    en las trazas de pila.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.core.fibers">
   <h4 class="title">Fibras</h4>

   <p class="simpara">
    Ahora se permiten las conmutaciones de fibras durante la ejecución del destructor. Esto estaba
    previamente bloqueado debido a conflictos con la recolección de basura.
   </p>

   <p class="simpara">
    Los destructores ahora pueden ejecutarse en una fibra separada:
   </p>

   <p class="simpara">
    Cuando el recolector de basura se activa en una fibra,
    los destructores llamados por el recolector de basura se ejecutan en una fibra separada:
    la gc_destructor_fiber.
    Si esta fibra se suspende, se crea una nueva para ejecutar los destructores
    restantes.
    La gc_destructor_fiber anterior ya no es referenciada por el recolector de basura
    y puede ser recolectada si ya no es referenciada en otro lugar.
    Los objetos cuyo destructor está suspendido no serán recolectados hasta que el
    destructor regrese o hasta que la <span class="classname"><a href="class.fiber.php" class="classname">Fiber</a></span> sea recolectada.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.core.output">
   <h4 class="title">Manejadores de salida</h4>

   <p class="simpara">
    Los flags de estado de los manejadores de salida pasados al parámetro <code class="parameter">flags</code>
    de <span class="function"><a href="function.ob-start.php" class="function">ob_start()</a></span> ahora se borran.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.output-add-rewrite-var.php" class="function">output_add_rewrite_var()</a></span> ahora usa
    <a href="outcontrol.configuration.php#ini.url-rewriter.hosts" class="link"><code class="literal">url_rewriter.hosts</code></a>
    en lugar de
    <a href="session.configuration.php#ini.session.trans-sid-hosts" class="link"><code class="literal">session.trans_sid_hosts</code></a>
    para la selección de los hosts que serán reescritos.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.other-changes.sapi">
  <h3 class="title">Cambios en los módulos SAPI</h3>

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

   <p class="simpara">
    Se ha eliminado el soporte para Apache 2.0 y 2.2 EOL.
    La versión mínima de Apache requerida ahora es 2.4.
   </p>
  </div>

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

   <p class="simpara">
    El servidor integrado busca un archivo índice de manera recursiva recorriendo los directorios
    padres si no se puede localizar el archivo especificado.
    Este proceso anteriormente se ignoraba si la ruta parecía
    referirse a un archivo, es decir, si el último componente de la ruta contenía un punto.
    En ese caso, se devolvía un error 404.
    El comportamiento se ha modificado para buscar un archivo índice en todos los casos.
   </p>
  </div>

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

   <p class="simpara">
    Ahora se tendrá éxito al vaciar las cabeceras sin cuerpo.
    
   </p>

   <p class="simpara">
    La página de estado ahora tiene un nuevo campo para mostrar un pico de memoria.
   </p>

   <p class="simpara">
    
    Se ha eliminado la configuración <var class="filename">/dev/poll</var> de <code class="literal">events.mechanism</code>
    para Solaris/Illumos.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.other-changes.functions">
  <h3 class="title">Funciones cambiadas</h3>

  <div class="sect3" id="migration84.other-changes.functions.core">
   <h4 class="title">Core</h4>

   <p class="simpara">
    <span class="function"><a href="function.trigger-error.php" class="function">trigger_error()</a></span> y <span class="function"><a href="function.user-error.php" class="function">user_error()</a></span>
    ahora tienen un tipo de retorno de <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span> en lugar de <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>
    ahora tiene un tipo de retorno de <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span> en lugar de
    <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
    Solo podía devolver <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> en la práctica.
   </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>
    ahora tiene un tipo de retorno de <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span> en lugar de
    <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
    Solo podía devolver <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> en la práctica.
   </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> y
    <strong><code><a href="class.numberformatter.php#numberformatter.constants.round-away-from-zero">NumberFormatter::ROUND_AWAY_FROM_ZERO</a></code></strong>
    se han añadido como alias para
    <strong><code><a href="class.numberformatter.php#numberformatter.constants.round-down">NumberFormatter::ROUND_DOWN</a></code></strong> y
    <strong><code><a href="class.numberformatter.php#numberformatter.constants.round-up">NumberFormatter::ROUND_UP</a></code></strong>
    para ser coherentes con los nuevos modos
    <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>
    
    ahora tiene un tipo de retorno provisional de <code class="literal">ResourceBundle|array|string|int|null</code>.
   </p>

   <p class="simpara">
    Las funciones <span class="function"><a href="function.idn-to-ascii.php" class="function">idn_to_ascii()</a></span> y <span class="function"><a href="function.idn-to-utf8.php" class="function">idn_to_utf8()</a></span>
    ahora siempre lanzan excepciones <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>
    si el nombre de <code class="parameter">domain</code> está vacío o es demasiado largo.
   </p>

   <p class="simpara">
    Las funciones <span class="function"><a href="function.idn-to-ascii.php" class="function">idn_to_ascii()</a></span> y <span class="function"><a href="function.idn-to-utf8.php" class="function">idn_to_utf8()</a></span>
    ahora siempre lanzan excepciones <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>
    si el parámetro <code class="parameter">variant</code> no es
    <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> ahora lanza inmediatamente una
    <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span> cuando se pasa un recurso no contextual de flujo
    a la función,
    en lugar de lanzar más tarde cuando se usa el contexto de flujo.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.mbstring">
   <h4 class="title">MBString</h4>

   <p class="simpara">
    El comportamiento de <span class="function"><a href="function.mb-strcut.php" class="function">mb_strcut()</a></span> ahora es más coherente
    en cadenas UTF-8 y UTF-16 no válidas.
    No hay cambio de comportamiento para cadenas UTF-8 y UTF-16 válidas.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.odbc">
   <h4 class="title">ODBC</h4>

   <p class="simpara">
    El <code class="parameter">row</code> de
    <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>, de
    <span class="function"><a href="function.odbc-fetch-into.php" class="function">odbc_fetch_into()</a></span> ahora tiene un valor predeterminado de <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>,
    manteniéndose coherente con <span class="function"><a href="function.odbc-fetch-row.php" class="function">odbc_fetch_row()</a></span>.
    Anteriormente, los valores predeterminados eran
    <code class="literal">-1</code>,
    <code class="literal">-1</code>,
    y <code class="literal">0</code>,
    respectivamente.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.openssl">
   <h4 class="title">OpenSSL</h4>

   <p class="simpara">
    El <code class="parameter">extra_attributes</code> en
    <span class="function"><a href="function.openssl-csr-new.php" class="function">openssl_csr_new()</a></span> establece los atributos del
    <abbr title="Certificate Signing Request">CSR</abbr> en lugar del DN del sujeto, lo cual se hacía incorrectamente antes.
   </p>

   <p class="simpara">
    El <code class="parameter">dn</code> en
    <span class="function"><a href="function.openssl-csr-new.php" class="function">openssl_csr_new()</a></span> permite establecer un <span class="type"><a href="language.types.array.php" class="type array">array</a></span>
    de valores para una sola entrada.
   </p>

   <p class="simpara">
    Se ha añadido un nuevo <code class="parameter">serial_hex</code> a
    <span class="function"><a href="function.openssl-csr-sign.php" class="function">openssl_csr_sign()</a></span> para permitir establecer números de serie
    en formato hexadecimal.
   </p>

   <p class="simpara">
    Analizar un ASN.1 UTCTime con <span class="function"><a href="function.openssl-x509-parse.php" class="function">openssl_x509_parse()</a></span>
    falla si se omiten los segundos para versiones de OpenSSL anteriores a 3.2
    (<code class="literal">-1</code> se devuelve para dichos campos).
    Las versiones de OpenSSL superiores a 3.3 ya no cargaban dichos certificados.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.pdo">
   <h4 class="title">PDO</h4>

   <p class="simpara">
    Ahora es posible recuperar el valor del atributo
    <strong><code><a href="pdo.constants.php#pdo.constants.attr-stringify-fetches">PDO::ATTR_STRINGIFY_FETCHES</a></code></strong> con
    <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span>.
   </p>

   <p class="simpara">
    Se ha añadido una nueva constante <strong><code>PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE</code></strong>
    para recuperar el uso de memoria de los resultados de consulta con
    <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span> para los controladores que lo soportan.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.pdo-firebird">
   <h4 class="title">PDO_FIREBIRD</h4>

   <p class="simpara">
    Ahora es posible recuperar el valor de los atributos
    
    <strong><code>FB_ATTR_DATE_FORMAT</code></strong>,
    <strong><code>FB_ATTR_TIME_FORMAT</code></strong>,
    <strong><code>FB_ATTR_TIMESTAMP_FORMAT</code></strong>,
    con
    
    <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span>.
   </p>

   <p class="para">
    Se han añadido nuevos atributos para especificar el nivel de aislamiento de transacción y el modo de acceso.
    Se han añadido cinco constantes relacionadas con esta funcionalidad:

    <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">
    Al usar conexiones persistentes, ahora hay una verificación de liveness en
    el constructor.
   </p>

   <p class="simpara">
    El contenido que se construye cambia según el valor de
    <strong><code>FB_API_VER</code></strong> en
    <var class="filename">ibase.h</var>.
    Un nuevo método estático <span class="methodname"><a href="pdo-firebird.getapiversion.php" class="methodname">Pdo\Firebird::getApiVersion()</a></span>
    puede usarse para obtener esta información.
    Esta información también se referencia ahora en <span class="function"><a href="function.phpinfo.php" class="function">phpinfo()</a></span>.
   </p>

   <p class="para">
    Ahora hay cinco nuevos tipos de datos disponibles:
    <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>
    .
    Estos están disponibles a partir de Firebird 4.0.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.pdo-mysql">
   <h4 class="title">PDO_MYSQL</h4>

   <p class="simpara">
    Ahora es posible recuperar el valor del atributo
    <strong><code><a href="pdo.constants.php#pdo.constants.attr-fetch-table-names">PDO::ATTR_FETCH_TABLE_NAMES</a></code></strong> con
    
    <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">
    Soporte para recuperar el uso de memoria de consultas para
    <strong><code>PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE</code></strong>.
   </p>

   <p class="simpara">
    Si la columna es de tipo <code class="literal">FLOAT4OID</code> o
    <code class="literal">FLOAT8OID</code> el valor ahora se devolverá como
    <span class="type"><a href="language.types.float.php" class="type float">float</a></span> en lugar de una <span class="type"><a href="language.types.string.php" class="type string">string</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.pgsql">
   <h4 class="title">PGSQL</h4>

   <p class="simpara">
    El parámetro <code class="parameter">conditions</code> de
    <span class="function"><a href="function.pg-select.php" class="function">pg_select()</a></span> ahora es opcional y acepta un array vacío.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.phar">
   <h4 class="title">Phar</h4>

   <p class="para">
    Los métodos
    <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>
    ahora pueden tener un tipo de retorno provisional de <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span>
    en lugar de <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.posix">
   <h4 class="title">POSIX</h4>

   <p class="simpara">
    <span class="function"><a href="function.posix-isatty.php" class="function">posix_isatty()</a></span> ahora establece el número de error cuando
    el argumento del descriptor de archivo/flujo es inválido.
   </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>
    ahora puede ser llamado después de que el generador haya terminado de ejecutarse.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.sockets">
   <h4 class="title">Sockets</h4>

   <p class="simpara">
    El parámetro <code class="parameter">backlog</code> de
    <span class="function"><a href="function.socket-create-listen.php" class="function">socket_create_listen()</a></span> ahora tiene un valor predeterminado de
    <strong><code><a href="sockets.constants.php#constant.somaxconn">SOMAXCONN</a></code></strong>.
    Anteriormente, era <code class="literal">128</code>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.sodium">
   <h4 class="title">Sodium</h4>

   <p class="simpara">
    Las funciones <span class="function">sodium_crypto_aead_aes256gcm_<span class="replaceable">*</span></span>
    ahora están disponibles en procesadores aarch64 con extensiones criptográficas ARM.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.functions.spl">
   <h4 class="title">SPL</h4>

   <p class="para">
    Los métodos
    <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>
    ahora pueden tener un tipo de retorno provisional de <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span>
    en lugar de <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
   </p>

   <p class="simpara">
    <span class="classname"><a href="class.splobjectstorage.php" class="classname">SplObjectStorage</a></span> ahora implementa
    <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">Standard</h4>

   <p class="simpara">
     El valor predeterminado del <code class="literal">&#039;cost&#039;</code> para el algoritmo de hashing <strong><code><a href="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong>
     usado por la función <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> se ha incrementado de
     <code class="literal">10</code> a <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> ahora indica si un array está compactado.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.long2ip.php" class="function">long2ip()</a></span> ahora tiene un tipo de retorno de <span class="type"><a href="language.types.string.php" class="type string">string</a></span>
    
    en lugar de <code class="literal">string|false</code>.
   </p>

   <p class="simpara">
    
    <span class="function"><a href="function.highlight-string.php" class="function">highlight_string()</a></span> ahora tiene un tipo de retorno de
    <span class="type">string|true</span> en lugar de <code class="literal">string|bool</code>.
   </p>

   <p class="simpara">
    
    <span class="function"><a href="function.print-r.php" class="function">print_r()</a></span> ahora tiene un tipo de retorno de
    <span class="type">string|true</span> en lugar de <code class="literal">string|bool</code>.
   </p>

   
   <div class="sect4">
    <h5 class="title">Redondeo con <span class="function"><a href="function.round.php" class="function">round()</a></span></h5>

    <p class="simpara">
     El parámetro <code class="parameter">mode</code> de la función <span class="function"><a href="function.round.php" class="function">round()</a></span> se ha ampliado para aceptar
     
     <code class="literal">RoundingMode|int</code>,
     
     aceptando instancias de un nuevo enumerador <span class="classname"><a href="enum.roundingmode.php" class="classname">RoundingMode</a></span>.
     
    </p>

    <p class="para">
    Se han añadido cuatro nuevos modos a la función <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">
     La implementación interna del redondeo a enteros se ha reescrito para ser más fácil de verificar
     para la corrección y más fácil de mantener.
     Se corrigieron algunos errores de redondeo como resultado de la reescritura.
     Por ejemplo, anteriormente, redondear <code class="literal">0.49999999999999994</code> al entero más cercano
     habría dado <code class="literal">1.0</code> en lugar del resultado correcto <code class="literal">0.0</code>.
     Otras entradas también podrían verse afectadas y dar resultados diferentes
     en comparación con versiones anteriores de PHP.
    </p>

    <p class="simpara">
     Se corrigió un error causado por el &quot;preredondeo&quot; de la función <span class="function"><a href="function.round.php" class="function">round()</a></span>.
     Anteriormente, usando &quot;preredondeo&quot; para manejar un valor como <code class="literal">0.285</code>
     (en realidad <code class="literal">0.28499999999999998</code>) como un número decimal y redondearlo a <code class="literal">0.29</code>.
     Sin embargo, el &quot;preredondeo&quot; redondeaba incorrectamente algunos números,
     por lo que esta corrección elimina el &quot;preredondeo&quot; y cambia la forma en que se comparan los números,
     por lo que los valores se redondean correctamente como números decimales.
    </p>

    <p class="simpara">
     El número máximo de dígitos significativos que <span class="function"><a href="function.round.php" class="function">round()</a></span> puede manejar se ha ampliado
     en un dígito.
     Por ejemplo, <code class="code">round(4503599627370495.5)</code> devolvía
     <code class="literal">4503599627370495.5</code>,
     pero ahora devuelve <code class="literal">4503599627370496</code>.
    </p>

   </div>
  </div>

 </div>

 <div class="sect2" id="migration84.other-changes.extensions">
  <h3 class="title">Otros cambios en las extensiones</h3>

  <div class="sect3" id="migration84.other-changes.extensions.curl">
   <h4 class="title">cURL</h4>

   <p class="simpara">
    La versión mínima requerida de libcurl ahora es 7.61.0.
   </p>

   <p class="simpara">
    La opción <strong><code><a href="curl.constants.php#constant.curlopt-dns-use-global-cache">CURLOPT_DNS_USE_GLOBAL_CACHE</a></code></strong> ya no
    tiene ningún efecto y se ignora silenciosamente.
    Esta funcionalidad subyacente se desaprobó en libcurl 7.11.1,
    y se eliminó en libcurl 7.62.0.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.gmp">
   <h4 class="title">GMP</h4>

   
   <p class="simpara">
    Cambiar el tipo de un objeto <span class="classname"><a href="class.gmp.php" class="classname">GMP</a></span> a <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> ahora es
    posible en lugar de generar un <strong><code><a href="errorfunc.constants.php#constant.e-recoverable-error">E_RECOVERABLE_ERROR</a></code></strong>.
    El comportamiento de conversión está sobrecargado de manera que un objeto <span class="classname"><a href="class.gmp.php" class="classname">GMP</a></span>
    que represente el valor <code class="literal">0</code> se convierte en <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">
    La versión mínima requerida de libxml2 ahora es 2.9.4.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.intl">
   <h4 class="title">Intl</h4>

   <p class="simpara">
    El comportamiento de la clase Intl se ha normalizado para siempre lanzar
    excepciones <span class="exceptionname"><a href="class.error.php" class="exceptionname">Error</a></span> al intentar usar
    un objeto no inicializado, o cuando la clonación falla.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.mbstring">
   <h4 class="title">MBString</h4>

   <p class="simpara">
    Las tablas de datos Unicode se han actualizado a Unicode 16.0.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.mysqlnd">
   <h4 class="title">MySQLnd</h4>

   <p class="simpara">
    Se ha añadido soporte para el nuevo tipo de datos VECTOR de MySQL 9.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.openssl">
   <h4 class="title">OpenSSL</h4>

   <p class="simpara">
    La versión mínima requerida de OpenSSL ahora es 1.1.1.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.pdo-pgsql">
   <h4 class="title">PDO_PGSQL</h4>

   <p class="simpara">
    La versión mínima requerida de libpq ahora es 10.0.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.pgsql">
   <h4 class="title">PGSQL</h4>

   <p class="simpara">
    La versión mínima requerida de libpq ahora es 10.0.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.spl">
   <h4 class="title">SPL</h4>

   <p class="simpara">
    Los accesos fuera de límites en <span class="classname"><a href="class.splfixedarray.php" class="classname">SplFixedArray</a></span> ahora lanzan
    excepciones de tipo <span class="exceptionname"><a href="class.outofboundsexception.php" class="exceptionname">OutOfBoundsException</a></span>
    en lugar de <span class="exceptionname"><a href="class.runtimeexception.php" class="exceptionname">RuntimeException</a></span>.
    Como <span class="exceptionname"><a href="class.outofboundsexception.php" class="exceptionname">OutOfBoundsException</a></span> es una clase hija de
    <span class="exceptionname"><a href="class.runtimeexception.php" class="exceptionname">RuntimeException</a></span>, no se observa ningún cambio de comportamiento
    al intentar capturar estas excepciones.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.xsl">
   <h4 class="title">XSL</h4>

   <p class="simpara">
    Las propiedades tipadas <span class="property"><a href="class.xsltprocessor.php#xsltprocessor.props.clonedocument">XSLTProcessor::$cloneDocument</a></span>
    y <span class="property"><a href="class.xsltprocessor.php#xsltprocessor.props.doxinclude">XSLTProcessor::$doXInclude</a></span> ahora están declaradas.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.extensions.zlib">
   <h4 class="title">Zlib</h4>

   <p class="simpara">
    La versión mínima requerida de zlib ahora es 1.2.11.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.other-changes.performance">
  <h3 class="title">Rendimiento</h3>

  <div class="sect3" id="migration84.other-changes.performance.core">
   <h4 class="title">Core</h4>

   <p class="simpara">
    Mejora del rendimiento del análisis y la generación de números de punto flotante
    en construcciones ZTS bajo cargas muy concurrentes.
    Esto afecta a las funciones <span class="function"><a href="function.printf.php" class="function">printf()</a></span> así
    como a las funciones de serialización como <span class="function"><a href="function.json-encode.php" class="function">json_encode()</a></span>
    o <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> usando solo <code class="literal">%s</code> y
    la interpolación de cadena <code class="literal">%d</code> se compilará en la interpolación
    de cadena equivalente, evitando los costos de una llamada a función y
    el análisis repetido de la cadena de formato.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.bcmath">
   <h4 class="title">BCMath</h4>

   <p class="simpara">
    Mejora del rendimiento de las conversiones de números y las operaciones.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.dom">
   <h4 class="title">DOM</h4>

   <p class="simpara">
    El rendimiento de <span class="methodname"><a href="domnode.c14n.php" class="methodname">DOMNode::C14N()</a></span> se mejora enormemente
    para el caso sin consulta xpath.
    Esto puede dar una mejora de tiempo fácilmente de dos órdenes de
    magnitud para documentos con decenas de miles de nodos.
   </p>

   <p class="simpara">
    Mejora del rendimiento y reducción del consumo de memoria de la serialización XML.
   </p>

   <p class="simpara">
    Reducción del consumo de memoria de las clases de nodos.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.ftp">
   <h4 class="title">FTP</h4>

   <p class="simpara">
    Mejora del rendimiento de las subidas FTP hasta un factor de 10x para las
    subidas voluminosas.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.hash">
   <h4 class="title">Hash</h4>

   <p class="simpara">
    Se han añadido las implementaciones SSE2 y SHA-NI de SHA-256.
    Esto mejora el rendimiento en procesadores compatibles de ~1.3x (SSE2),
    y 3x - 5x (SHA-NI).
    Crédito a Colin Percival / Tarsnap por esta optimización.
   </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> ahora es mucho más rápido para cadenas UTF-8
    y UTF-16.
   </p>

   <p class="simpara">
    La búsqueda de nombres de codificación mbstring ahora es mucho más rápida.
   </p>

   <p class="simpara">
    El rendimiento de la conversión de SJIS-win a Unicode se mejora enormemente.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.mysqlnd">
   <h4 class="title">MySQLnd</h4>

   <p class="simpara">
    Mejora del rendimiento de la cotización MySQLnd.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.pcre">
   <h4 class="title">PCRE</h4>

   <p class="simpara">
    Mejora del rendimiento de los grupos de captura nombrados.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.random">
   <h4 class="title">Random</h4>

   <p class="simpara">
    Mejora del rendimiento de <span class="classname"><a href="class.random-randomizer.php" class="classname">Random\Randomizer</a></span>,
    con un enfoque específico en los métodos
    <span class="methodname"><a href="random-randomizer.getbytes.php" class="methodname">Random\Randomizer::getBytes()</a></span>,
    y <span class="methodname"><strong>Random\Randomizer::getBytesFromString()()</strong></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.other-changes.performance.simplexml">
   <h4 class="title">SimpleXML</h4>

   <p class="simpara">
    Mejora del rendimiento y reducción del consumo de memoria de la serialización XML.
   </p>
  </div>

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

   <p class="simpara">
    El rendimiento de <span class="function"><a href="function.strspn.php" class="function">strspn()</a></span> y
    <span class="function"><a href="function.strcspn.php" class="function">strcspn()</a></span> se mejora enormemente.
    Ahora se ejecutan en tiempo lineal en lugar de estar limitados por un tiempo cuadrático.
   </p>

   <p class="simpara">
    Mejora del rendimiento de <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> ahora es mucho más rápido,
    hasta 1.5x - 2.5x para algunos casos de prueba.
   </p>
  </div>
 </div>

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