<?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.incompatible.php',
    1 => 'Cambios incompatibles con versiones anteriores',
    2 => 'Cambios incompatibles con versiones anteriores',
  ),
  'up' => 
  array (
    0 => 'migration84.php',
    1 => 'Migraci&oacute;n de PHP 8.3.x a PHP 8.4.x',
  ),
  'prev' => 
  array (
    0 => 'migration84.constants.php',
    1 => 'Nuevas constantes globales',
  ),
  'next' => 
  array (
    0 => 'migration84.deprecated.php',
    1 => 'Funcionalidades obsoletas',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'appendices/migration84/incompatible.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration84.incompatible" class="sect1">
 <h2 class="title">Cambios incompatibles con versiones anteriores</h2>

 <p class="simpara">
  Salvo mención contraria en esta sección,
  cada nueva <a href="migration84.new-functions.php" class="link">función</a>,
  <a href="migration84.new-classes.php" class="link">clase, interfaz, enumeración</a>,
  o <a href="migration84.constants.php" class="link">constante</a>
  puede provocar el lanzamiento de una excepción de redeclaración <span class="exceptionname"><a href="class.error.php" class="exceptionname">Error</a></span>.
 </p>

 <div class="sect2" id="migration84.incompatible.core">
  <h3 class="title">Núcleo de PHP</h3>

  
  <div class="sect3" id="migration84.incompatible.core.exit">
   <h4 class="title">Cambio de comportamiento de <span class="function"><a href="function.exit.php" class="function">exit()</a></span></h4>

   <p class="simpara">
    Las construcciones de lenguaje <span class="function"><a href="function.exit.php" class="function">exit()</a></span> (y <span class="function"><a href="function.die.php" class="function">die()</a></span>)
    ahora se comportan más como una función.
    Esto significa que ahora pueden pasarse como <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>s,
    
    son afectadas por la instrucción <code class="literal">strict_types</code>,
    y ahora realizan las coerciones de tipo habituales en lugar de convertir
    cualquier valor no entero en una cadena.
   </p>

   <p class="simpara">
    En consecuencia, pasar tipos no válidos a <span class="function"><a href="function.exit.php" class="function">exit()</a></span> y
    <span class="function"><a href="function.die.php" class="function">die()</a></span> ahora siempre provoca el lanzamiento de una
    excepción <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.core.recursion-comparison">
   <h4 class="title">Recursión al comparar</h4>

   <p class="simpara">
    Encontrar una recursión al comparar ahora provoca una
    excepción <span class="exceptionname"><a href="class.error.php" class="exceptionname">Error</a></span> en lugar de un error fatal
    <strong><code><a href="errorfunc.constants.php#constant.e-error">E_ERROR</a></code></strong>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.core.readonly-indirect-modification">
   <h4 class="title">Modificación indirecta de propiedades de solo lectura</h4>

   
   <p class="simpara">
    La modificación indirecta de propiedades de solo lectura en <code class="code">__clone()</code>
    ya no está permitida, por ejemplo, <code class="code">$ref = &amp;$this-&gt;readonly</code>.
    Ya estaba prohibido para la inicialización de solo lectura, y era un
    descuido en la implementación de la &quot;reinicialización de solo lectura al clonar&quot;.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.core.constant-type-change">
   <h4 class="title">Cambio de tipo de constantes</h4>

   <p class="simpara">
    Las constantes <strong><code><a href="reserved.constants.php#constant.php-debug">PHP_DEBUG</a></code></strong> y <strong><code><a href="reserved.constants.php#constant.php-zts">PHP_ZTS</a></code></strong>
    ahora son de tipo <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
    Anteriormente, eran de tipo <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.core.tempnam-length">
   <h4 class="title">Longitud del nombre de archivo temporal</h4>

   <p class="simpara">
    El nombre de los archivos volcados y de los archivos creados por la función
    <span class="function"><a href="function.tempnam.php" class="function">tempnam()</a></span> ahora es más largo en 13 bytes.
    La longitud total sigue dependiendo de la plataforma.
   </p>
  </div>

  
  <div class="sect3" id="migration84.incompatible.core.e-strict">
   <h4 class="title">Supresión del nivel de error <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong></h4>

   <p class="simpara">
    El nivel de error <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong> ha sido eliminado,
    porque ya no se utilizaba en el motor PHP.
    La constante <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong> también ha sido desaprobada.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.incompatible.typed-constants">
  <h3 class="title">Constantes de clase de extensión ahora tipificadas</h3>

  <p class="para">
   Las siguientes clases de extensión ahora declaran un tipo en sus
   constantes:
   <ul class="simplelist">
    <li><a href="book.datetime.php" class="link">Date</a></li>
    <li><a href="book.intl.php" class="link">Intl</a></li>
    <li><a href="book.pdo.php" class="link">PDO</a></li>
    <li><a href="book.reflection.php" class="link">Reflection</a></li>
    <li><a href="book.spl.php" class="link">SPL</a></li>
    <li><a href="book.sqlite3.php" class="link">Sqlite</a></li>
    <li><a href="book.xmlreader.php" class="link">XMLReader</a></li>
   </ul>
  </p>
 </div>

 
 <div class="sect2" id="migration84.incompatible.resource2object">
  <h3 class="title">Migración de recursos a objetos</h3>

  <p class="simpara">
   Varios <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s han sido migrados a <span class="type"><a href="language.types.object.php" class="type object">object</a></span>s.
   La verificación del valor de retorno con <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span>
   debe ser reemplazada por verificaciones de <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>, a menos que se indique lo contrario.
  </p>

  <div class="sect3" id="migration84.incompatible.resource2object.dba">
   <h4 class="title">DBA</h4>

   <p class="simpara">
    Las funciones <a href="book.dba.php" class="link">DBA</a> ahora aceptan y devuelven
    <span class="classname"><a href="class.dba-connection.php" class="classname">Dba\Connection</a></span> en lugar de
    <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">dba_connection</code>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.resource2object.odbc">
   <h4 class="title">ODBC</h4>

   <p class="simpara">
    Las funciones <a href="book.uodbc.php" class="link">ODBC</a> ahora aceptan y devuelven
    <span class="classname"><strong class="classname">Odbc\Result</strong></span> en lugar de
    <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">odbc_result</code>.
   </p>

   <p class="simpara">
    Las funciones <a href="book.uodbc.php" class="link">ODBC</a> ahora aceptan y devuelven
    <span class="classname"><strong class="classname">Odbc\Connection</strong></span> en lugar de
    <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">odbc_connection</code>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.resource2object.soap">
   <h4 class="title">SOAP</h4>

   <p class="simpara">
    La propiedad <span class="property"><a href="class.soapclient.php#soapclient.props.httpurl">SoapClient::$httpurl</a></span> ahora es un objeto
    <span class="classname"><strong class="classname">Soap\Url</strong></span> en lugar de una
    <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> <code class="literal">soap_url</code>.
    Las verificaciones con <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> (por ejemplo
    <code class="code">is_resource($client-&gt;httpurl)</code>) deben ser reemplazadas por verificaciones de <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (por ejemplo <code class="code">$client-&gt;httpurl !== null</code>).
   </p>
   <p class="simpara">
    La propiedad <span class="property"><a href="class.soapclient.php#soapclient.props.sdl">SoapClient::$sdl</a></span> ahora es un objeto
    <span class="classname"><strong class="classname">Soap\Sdl</strong></span> en lugar de una
    <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> <code class="literal">soap_sdl</code>.
    Las verificaciones con <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> (por ejemplo
    <code class="code">is_resource($client-&gt;sdl)</code>) deben ser reemplazadas por verificaciones de <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (por ejemplo <code class="code">$client-&gt;sdl !== null</code>).
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.incompatible.new-warnings-exceptions">
  <h3 class="title">Nuevas alertas y excepciones</h3>

  <p class="simpara">
   Se han añadido nuevas alertas y excepciones para señalar errores
   de programación, es decir, valores no válidos proporcionados como argumentos.
  </p>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.curl">
   <h4 class="title">Curl</h4>

   <p class="simpara">
    <span class="function"><a href="function.curl-multi-select.php" class="function">curl_multi_select()</a></span> ahora lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si el parámetro
    <code class="parameter">timeout</code> es inferior a
    <code class="literal">0</code> o superior a <strong><code><a href="reserved.constants.php#constant.php-int-max">PHP_INT_MAX</a></code></strong>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.gd">
   <h4 class="title">Gd</h4>

   <p class="para">
    <span class="simplelist"><span class="function"><a href="function.imagejpeg.php" class="function">imagejpeg()</a></span>, <span class="function"><a href="function.imagewebp.php" class="function">imagewebp()</a></span>, <span class="function"><a href="function.imagepng.php" class="function">imagepng()</a></span>, <span class="function"><a href="function.imageavif.php" class="function">imageavif()</a></span></span>
    ahora lanzan una <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si se pasa una
    <code class="parameter">quality</code> no válida.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.imageavif.php" class="function">imageavif()</a></span> ahora lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si se pasa un parámetro
    <code class="parameter">speed</code> no válido.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.imagescale.php" class="function">imagescale()</a></span> ahora lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si los parámetros
    <code class="parameter">width</code> o <code class="parameter">height</code>
    están fuera de los límites.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.imagescale.php" class="function">imagescale()</a></span> ahora lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si se pasa un valor de
    <code class="parameter">mode</code> no válido.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.imagefilter.php" class="function">imagefilter()</a></span> ahora lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> con el filtro
    <strong><code><a href="image.constants.php#constant.img-filter-scatter">IMG_FILTER_SCATTER</a></code></strong> si los parámetros
    <code class="parameter">sub</code> o <code class="parameter">plus</code>
    están fuera de los límites.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.gettext">
   <h4 class="title">Gettext</h4>

   <p class="para">
    <span class="simplelist"><span class="function"><a href="function.bind-textdomain-codeset.php" class="function">bind_textdomain_codeset()</a></span>, <span class="function"><a href="function.textdomain.php" class="function">textdomain()</a></span>, <span class="function">d<span class="replaceable">*</span>gettext</span></span>
    ahora lanzan una <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si se pasa un
    <code class="parameter">domain</code> no válido.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.intl">
   <h4 class="title">Intl</h4>

   <p class="para">
    <span class="function"><a href="resourcebundle.get.php" class="function">resourcebundle_get()</a></span>,
    <span class="methodname"><a href="resourcebundle.get.php" class="methodname">ResourceBundle::get()</a></span>, y el acceso a índices en un
    <span class="classname"><a href="class.resourcebundle.php" class="classname">ResourceBundle</a></span> ahora lanzan:
    <ul class="simplelist">
     <li>
      <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span> para tipos de offset no válidos
     </li>
     <li>
      <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> para una cadena vacía
     </li>
     <li>
      <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si el índice entero no cabe en un entero con signo de 32 bits
     </li>
    </ul>
   </p>

   <p class="simpara">
    <span class="methodname"><a href="intldateformatter.create.php" class="methodname">IntlDateFormatter::__construct()</a></span> lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si el
    <code class="parameter">locale</code> es no válido.
   </p>

   <p class="simpara">
    <span class="methodname"><a href="numberformatter.create.php" class="methodname">NumberFormatter::__construct()</a></span> lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si el
    <code class="parameter">locale</code> es no válido.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.mbstring">
   <h4 class="title">MBString</h4>

   <p class="simpara">
    <span class="function"><a href="function.mb-encode-numericentity.php" class="function">mb_encode_numericentity()</a></span> y
    <span class="function"><a href="function.mb-decode-numericentity.php" class="function">mb_decode_numericentity()</a></span> ahora verifican que
    <code class="parameter">map</code> está compuesto únicamente por <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>s,
    si no es el caso, se lanza una <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.mb-http-input.php" class="function">mb_http_input()</a></span> ahora lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si el <code class="parameter">type</code>
    es no válido.
   </p>

   <p class="simpara">
    <span class="function"><a href="function.mb-http-output.php" class="function">mb_http_output()</a></span> ahora verifica que
    <code class="parameter">encoding</code> no contiene caracteres nulos,
    si es el caso, se lanza una <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.odbc">
   <h4 class="title">ODBC</h4>

   <p class="simpara">
    <span class="function"><a href="function.odbc-fetch-row.php" class="function">odbc_fetch_row()</a></span> devuelve <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> cuando
    <code class="parameter">row</code> es inferior o igual a <code class="literal">0</code>.
    Ahora se emite una alerta en este caso.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.pcntl">
   <h4 class="title">PCNTL</h4>

   <p class="para">
    Las funciones <span class="function"><a href="function.pcntl-sigprocmask.php" class="function">pcntl_sigprocmask()</a></span>,
    <span class="function"><a href="function.pcntl-sigwaitinfo.php" class="function">pcntl_sigwaitinfo()</a></span>, y
    <span class="function"><a href="function.pcntl-sigtimedwait.php" class="function">pcntl_sigtimedwait()</a></span> ahora lanzan:
    <ul class="simplelist">
     <li>
      Una <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si el array
      <code class="parameter">signals</code> está vacío
      (excepto para <span class="function"><a href="function.pcntl-sigprocmask.php" class="function">pcntl_sigprocmask()</a></span> si el
      <code class="parameter">mode</code> es <strong><code><a href="pcntl.constants.php#constant.sig-setmask">SIG_SETMASK</a></code></strong>)
     </li>
     <li>
      Una <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span> si un valor del array
      <code class="parameter">signals</code> no es un <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>
     </li>
     <li>
      Una <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si el valor de
      <code class="parameter">signals</code> no es un número de señal válido
     </li>
    </ul>
   </p>

   <p class="simpara">
    La función <span class="function"><a href="function.pcntl-sigprocmask.php" class="function">pcntl_sigprocmask()</a></span> ahora lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si el
    <code class="parameter">mode</code> no es uno de los <strong><code><a href="pcntl.constants.php#constant.sig-block">SIG_BLOCK</a></code></strong>,
    <strong><code><a href="pcntl.constants.php#constant.sig-unblock">SIG_UNBLOCK</a></code></strong>, o <strong><code><a href="pcntl.constants.php#constant.sig-setmask">SIG_SETMASK</a></code></strong>.
   </p>

   <p class="para">
    La función <span class="function"><a href="function.pcntl-sigtimedwait.php" class="function">pcntl_sigtimedwait()</a></span> ahora lanza:
    <ul class="simplelist">
     <li>
      Una <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si
      <code class="parameter">seconds</code> es inferior a <code class="literal">0</code>
     </li>
     <li>
      Una <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si
      <code class="parameter">nanoseconds</code> es inferior a <code class="literal">0</code>
      o superior a <code class="literal">1e9</code>
     </li>
     <li>
      Una <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si ambos
      <code class="parameter">seconds</code> y <code class="parameter">nanoseconds</code>
      son <code class="literal">0</code>
     </li>
    </ul>
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.session">
   <h4 class="title">Sesión</h4>

   <p class="simpara">
    Establecer un valor no positivo para <a href="session.configuration.php#ini.session.gc-divisor" class="link">session.gc_divisor</a>
    o un valor negativo para <a href="session.configuration.php#ini.session.gc-probability" class="link">session.gc_probability</a>
    emite ahora una advertencia.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.simplexml">
   <h4 class="title">SimpleXML</h4>

   <p class="simpara">
    Llamar a <span class="function"><a href="function.simplexml-import-dom.php" class="function">simplexml_import_dom()</a></span> con un objeto no-XML
    ahora lanza una <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span> en lugar de una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.standard">
   <h4 class="title">Estándar</h4>

   <p class="simpara">
    La función <span class="function"><a href="function.round.php" class="function">round()</a></span> ahora verifica el valor del
    <code class="parameter">mode</code> y lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> para modos no válidos.
    Anteriormente, los modos no válidos se interpretaban como
    <strong><code><a href="math.constants.php#constant.php-round-half-up">PHP_ROUND_HALF_UP</a></code></strong>.
   </p>

   <p class="simpara">
    La función <span class="function"><a href="function.str-getcsv.php" class="function">str_getcsv()</a></span> ahora lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si los argumentos
    <code class="parameter">separator</code> y <code class="parameter">enclosure</code>
    no tienen un byte de largo, o si el argumento <code class="parameter">escape</code>
    no tiene un byte de largo o es una cadena vacía.
    Esto alinea el comportamiento para que sea idéntico al de
    <span class="function"><a href="function.fputcsv.php" class="function">fputcsv()</a></span> y <span class="function"><a href="function.fgetcsv.php" class="function">fgetcsv()</a></span>.
   </p>

   <p class="simpara">
    La función <span class="function"><a href="function.php-uname.php" class="function">php_uname()</a></span> ahora lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si el
    <code class="parameter">mode</code> es no válido.
   </p>

   <p class="simpara">
    La opción <code class="literal">&quot;allowed_classes&quot;</code> para
    <span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span> ahora lanza
    <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span> y
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> si no es un
    <span class="type"><a href="language.types.array.php" class="type array">array</a></span> de nombres de clase.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.xmlreader">
   <h4 class="title">XMLReader</h4>

   <p class="simpara">
    Pasar un codificado de caracteres no válido a
    <span class="methodname"><a href="xmlreader.open.php" class="methodname">XMLReader::open()</a></span> o
    <span class="methodname"><a href="xmlreader.xml.php" class="methodname">XMLReader::XML()</a></span> ahora lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>

   <p class="simpara">
    Pasar una cadena que contiene bytes nulos anteriormente emitía una alerta
    y ahora lanza una <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.xmlwriter">
   <h4 class="title">XMLWriter</h4>

   <p class="simpara">
    Pasar una cadena que contiene bytes nulos anteriormente emitía una alerta
    y ahora lanza una <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration84.incompatible.new-warnings-exceptions.xsl">
   <h4 class="title">XSL</h4>

   <p class="simpara">
    <span class="methodname"><a href="xsltprocessor.setparameter.php" class="methodname">XSLTProcessor::setParameter()</a></span> ahora lanza una
    <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> cuando sus argumentos contienen
    bytes nulos. Esto nunca funcionó correctamente en primer lugar,
    por lo que ahora se lanza una excepción.
   </p>

   <p class="simpara">
    Llamar a <span class="methodname"><a href="xsltprocessor.importstylesheet.php" class="methodname">XSLTProcessor::importStylesheet()</a></span> con un
    objeto no-XML ahora lanza una <span class="exceptionname"><a href="class.typeerror.php" class="exceptionname">TypeError</a></span>
    en lugar de una <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span>.
   </p>

   
   <p class="simpara">
    El fallo al llamar a una función de devolución de llamada PHP durante la evaluación ahora lanza
    una excepción en lugar de emitir una alerta.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.incompatible.date">
  <h3 class="title">Fecha</h3>

  <p class="para">
   <code class="literal">number</code> símbolos en <a href="datetime.formats.php#datetime.formats.relative" class="link">formatos relativos</a>
   aceptan nuevamente múltiples signos, por ejemplo, <code class="literal">+-2</code>.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.dom">
  <h3 class="title">DOM</h3>

  <p class="simpara">
   Algunos métodos DOM anteriormente devolvían <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> o una
   <span class="exceptionname"><a href="class.domexception.php" class="exceptionname">DOMException</a></span> <strong><code>PHP_ERR</code></strong>
   si no se podía agregar un nuevo nodo.
   Ahora siempre lanzan una <span class="exceptionname"><a href="class.domexception.php" class="exceptionname">DOMException</a></span>
   <strong><code>INVALID_STATE_ERR</code></strong>.
   Esta situación es extremadamente improbable y la probabilidad de verse afectado
   es baja.
   En consecuencia, <span class="methodname"><a href="domimplementation.createdocument.php" class="methodname">DOMImplementation::createDocument()</a></span>
   ahora tiene un tipo de retorno provisional de <span class="classname"><a href="class.domdocument.php" class="classname">DOMDocument</a></span>
   
   en lugar de <code class="code">DOMDocument|false</code>.
  </p>

  <p class="simpara">
   Anteriormente, los objetos <span class="classname"><a href="class.domxpath.php" class="classname">DOMXPath</a></span> podían ser clonados,
   pero resultaban en un objeto inutilizable.
   Esto ya no es posible, y clonar un objeto <span class="classname"><a href="class.domxpath.php" class="classname">DOMXPath</a></span>
   ahora lanza una <span class="exceptionname"><a href="class.error.php" class="exceptionname">Error</a></span>.
  </p>

  
  <p class="simpara">
   El método <span class="methodname"><strong>DOMImplementation::getFeature()</strong></span> ha sido eliminado.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.gmp">
  <h3 class="title">GMP</h3>

  
  <p class="simpara">
   La clase <span class="classname"><a href="class.gmp.php" class="classname">GMP</a></span> ahora es final y ya no puede
   ser extendida.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.mbstring">
  <h3 class="title">MBString</h3>

  <p class="simpara">
   En caso de cadenas no válidas (aquellas con errores de codificación),
   <span class="function"><a href="function.mb-substr.php" class="function">mb_substr()</a></span> ahora interpreta los índices de caracteres
   de la misma manera que la mayoría de las otras funciones mbstring.
   Esto significa que los índices de caracteres devueltos por <span class="function"><a href="function.mb-strpos.php" class="function">mb_strpos()</a></span>
   pueden pasarse a <span class="function"><a href="function.mb-substr.php" class="function">mb_substr()</a></span>.
  </p>

  <p class="simpara">
   Para las cadenas SJIS-Mac (MacJapanese), los índices de caracteres pasados a
   <span class="function"><a href="function.mb-substr.php" class="function">mb_substr()</a></span> ahora se refieren a los índices de
   los puntos de código Unicode que se producen cuando la cadena se convierte a Unicode.
   Esto es significativo porque aproximadamente 40 caracteres SJIS-Mac se convierten en una
   secuencia de múltiples puntos de código Unicode.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.mysqli">
  <h3 class="title">MySQLi</h3>

  <p class="simpara">
   La constante no utilizada y no documentada
   <strong><code>MYSQLI_SET_CHARSET_DIR</code></strong> ha sido eliminada.
  </p>

  <p class="simpara">
   La constante <strong><code><a href="mysqli.constants.php#constant.mysqli-stmt-attr-update-max-length">MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH</a></code></strong> ha sido
   eliminada. Esta funcionalidad no está disponible con mysqlnd.
  </p>

  <p class="simpara">
   Las constantes <strong><code><a href="mysqli.constants.php#constant.mysqli-stmt-attr-cursor-type">MYSQLI_STMT_ATTR_CURSOR_TYPE</a></code></strong> y
   <strong><code><a href="mysqli.constants.php#constant.mysqli-stmt-attr-prefetch-rows">MYSQLI_STMT_ATTR_PREFETCH_ROWS</a></code></strong> han sido eliminadas.
   Estas funcionalidades nunca fueron implementadas,
   ni con mysqlnd ni con libmysql.
  </p>

  <p class="simpara">
   La constante no utilizada <strong><code><a href="mysqli.constants.php#constant.mysqli-type-interval">MYSQLI_TYPE_INTERVAL</a></code></strong>, que actualmente es un stub y un alias para <strong><code><a href="mysqli.constants.php#constant.mysqli-type-enum">MYSQLI_TYPE_ENUM</a></code></strong>,
   ha sido eliminada.
   
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.mysqlnd">
  <h3 class="title">MySQLnd</h3>

  <p class="simpara">
   El código de error reportado para los tiempos de espera del servidor MySQL ha cambiado de
   <code class="literal">2006</code> a <code class="literal">4031</code> para las versiones del servidor
   MySQL 8.0.24 y superiores.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.opcache">
  <h3 class="title">Opcache</h3>

  <p class="simpara">
   El valor máximo de la configuración
   <a href="opcache.configuration.php#ini.opcache.interned-strings-buffer" class="link">opcache.interned_strings_buffer</a>
   en arquitecturas de 64 bits ahora es <code class="literal">32767</code>.
   Anteriormente, era <code class="literal">4095</code>.
  </p>

  <div class="sect3">
   <h4 class="title">JIT</h4>

   <p class="simpara">
    El valor por defecto de la configuración JIT ha cambiado de
    <a href="opcache.configuration.php#ini.opcache.jit" class="link"><code class="literal">opcache.jit=tracing</code></a>
    y <a href="opcache.configuration.php#ini.opcache.jit-buffer-size" class="link"><code class="literal">opcache.jit_buffer_size=0</code></a>
    a <a href="opcache.configuration.php#ini.opcache.jit" class="link"><code class="literal">opcache.jit=disable</code></a>
    y <a href="opcache.configuration.php#ini.opcache.jit-buffer-size" class="link"><code class="literal">opcache.jit_buffer_size=64M</code></a>, respectivamente.
   </p>

   <p class="simpara">
    Esto no afecta el comportamiento observable por defecto,
    porque el JIT sigue estando desactivado por defecto.
    Sin embargo, ahora se desactiva a través de la configuración
    <a href="opcache.configuration.php#ini.opcache.jit" class="link">opcache.jit</a>,
    en lugar de <a href="opcache.configuration.php#ini.opcache.jit-buffer-size" class="link">opcache.jit_buffer_size</a>.
    Esto puede afectar a los usuarios que anteriormente habían activado el JIT a través de
    <a href="opcache.configuration.php#ini.opcache.jit-buffer-size" class="link">opcache.jit_buffer_size</a>
    exclusivamente, sin especificar también un modo JIT usando
    <a href="opcache.configuration.php#ini.opcache.jit" class="link">opcache.jit</a>.
    Para habilitar la compilación JIT, defina el valor de configuración
    <a href="opcache.configuration.php#ini.opcache.jit" class="link">opcache.jit</a> en consecuencia.
   </p>

   <p class="simpara">
    Si la compilación <abbr>JIT</abbr> está habilitada, <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> ahora finalizará con un error fatal
    al iniciar si la inicialización del compilador <abbr>JIT</abbr> falla por cualquier motivo.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration84.incompatible.pcntl">
  <h3 class="title">PCNTL</h3>

  <p class="simpara">
   Las funciones <span class="function"><a href="function.pcntl-sigprocmask.php" class="function">pcntl_sigprocmask()</a></span>,
   <span class="function"><a href="function.pcntl-sigwaitinfo.php" class="function">pcntl_sigwaitinfo()</a></span>, y
   <span class="function"><a href="function.pcntl-sigtimedwait.php" class="function">pcntl_sigtimedwait()</a></span> ahora devuelven sistemáticamente
   <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> en caso de fallo.
   En algunos casos anteriores, podían devolver el valor <code class="literal">-1</code>.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.pcre">
  <h3 class="title">PCRE</h3>

  <p class="simpara">
   La versión de pcre2lib incluida se ha actualizado a la versión 10.44.
   Esto significa que <code class="literal">{,3}</code> ahora se reconoce como un cuantificador en lugar de un texto.
   Además, la significación de algunas clases de caracteres en modo UCP ha cambiado.
   Consulte el <a href="https://github.com/PCRE2Project/pcre2/blob/master/NEWS" class="link external">&raquo;&nbsp;registro de cambios de PCRE2</a>
   para obtener un registro de cambios completo.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.pdo-dblib">
  <h3 class="title">PDO_DBLIB</h3>

  <p class="simpara">
   Los atributos <strong><code><a href="class.pdo-dblib.php#pdo-dblib.constants.attr-stringify-uniqueidentifier">Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER</a></code></strong> y
   <strong><code><a href="class.pdo-dblib.php#pdo-dblib.constants.attr-datetime-convert">Pdo\Dblib::ATTR_DATETIME_CONVERT</a></code></strong> ahora actúan como atributos booleanos en lugar de atributos enteros.
   Por lo tanto, definir el atributo a través de <span class="methodname"><a href="pdo.setattribute.php" class="methodname">PDO::setAttribute()</a></span>
   y recuperarlo a través de <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span> espera y devuelve un <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.pdo-firebird">
  <h3 class="title">PDO_FIREBIRD</h3>

  <p class="simpara">
   El atributo <strong><code><a href="pdo.constants.php#pdo.constants.attr-autocommit">PDO::ATTR_AUTOCOMMIT</a></code></strong> ahora actúa como un
   atributo booleano en lugar de un atributo entero.
   Por lo tanto, definir el atributo a través de <span class="methodname"><a href="pdo.setattribute.php" class="methodname">PDO::setAttribute()</a></span>
   y recuperarlo a través de <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span> espera y devuelve un <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
  </p>

  <p class="simpara">
   La extensión ahora expone ciertas API C++ de Firebird, por lo que la construcción de esta extensión ahora requiere un compilador C++.
   Además, la extensión ahora debe compilarse contra fbclient 3.0 o superior.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.pdo-mysql">
  <h3 class="title">PDO_MYSQL</h3>

  <p class="simpara">
   Los atributos <strong><code><a href="pdo.constants.php#pdo.constants.attr-autocommit">PDO::ATTR_AUTOCOMMIT</a></code></strong>
   <strong><code><a href="pdo.constants.php#pdo.constants.attr-emulate-prepares">PDO::ATTR_EMULATE_PREPARES</a></code></strong>, y
   <strong><code><a href="ref.pdo-mysql.php#pdo.constants.mysql-attr-direct-query">PDO::MYSQL_ATTR_DIRECT_QUERY</a></code></strong> ahora actúan como atributos booleanos en lugar de atributos enteros.
   Por lo tanto, definir el atributo a través de <span class="methodname"><a href="pdo.setattribute.php" class="methodname">PDO::setAttribute()</a></span>
   y recuperarlo a través de <span class="methodname"><a href="pdo.getattribute.php" class="methodname">PDO::getAttribute()</a></span> espera y devuelve un <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.pdo-pgsql">
  <h3 class="title">PDO_PGSQL</h3>

  <p class="simpara">
   La información de conexión DSN, cuando se define, ahora tiene prioridad sobre
   los argumentos del constructor PDO, estando más cerca de lo que indica la documentación.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.simplexml">
  <h3 class="title">SimpleXML</h3>

  <p class="simpara">
   <span class="classname"><a href="class.simplexmlelement.php" class="classname">SimpleXMLElement</a></span> no es solo una representación
   de un elemento XML, sino que también es un <span class="classname"><a href="class.recursiveiterator.php" class="classname">RecursiveIterator</a></span>.
   Antes de PHP 8.4.0, algunos de sus métodos (por ejemplo,
   <span class="methodname"><a href="simplexmlelement.asxml.php" class="methodname">SimpleXMLElement::asXML()</a></span> o
   <span class="methodname"><a href="simplexmlelement.getname.php" class="methodname">SimpleXMLElement::getName()</a></span>) y la conversión de tales
   instancias a <span class="type"><a href="language.types.string.php" class="type string">string</a></span> reinicializaban implícitamente el iterador.
  </p>
  <p class="para">
   Esto podía provocar bucles infinitos no intencionados porque el iterador se reinicializaba.
   Por ejemplo:
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$xmlString </span><span style="color: #007700">= </span><span style="color: #DD0000">"&lt;root&gt;&lt;a&gt;&lt;b&gt;1&lt;/b&gt;&lt;b&gt;2&lt;/b&gt;&lt;b&gt;3&lt;/b&gt;&lt;/a&gt;&lt;/root&gt;"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$xml </span><span style="color: #007700">= </span><span style="color: #0000BB">simplexml_load_string</span><span style="color: #007700">(</span><span style="color: #0000BB">$xmlString</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$nodes </span><span style="color: #007700">= </span><span style="color: #0000BB">$xml</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">b</span><span style="color: #007700">;<br />foreach (</span><span style="color: #0000BB">$nodes </span><span style="color: #007700">as </span><span style="color: #0000BB">$nodeData</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">"nodeData: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$nodeData </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br />    </span><span style="color: #0000BB">$xml </span><span style="color: #007700">= </span><span style="color: #0000BB">$nodes</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">asXml</span><span style="color: #007700">();<br />}</span></span></code></div>
    </div>

    <p class="simpara">
     causaba un bucle infinito.
    </p>
    <div class="example-contents screen">
<div class="cdata"><pre>
nodeData: 1
nodeData: 2
nodeData: 2
nodeData: 2
nodeData: 2
nodeData: 2
nodeData: 2
// ...
</pre></div>
    </div>
    <p class="simpara">
     Sin embargo, este comportamiento ha sido corregido, y un
     <span class="classname"><a href="class.simplexmlelement.php" class="classname">SimpleXMLElement</a></span> ya no reinicializará implícitamente
     el iterador, a menos que se restablezca explícitamente a cero.
     Esto significa que el ejemplo anterior ahora daría:
    </p>
    <div class="example-contents screen">
<div class="cdata"><pre>
nodeData: 1
nodeData: 2
nodeData: 3
</pre></div>
    </div>
   </div>
  </p>
  
 </div>

 <div class="sect2" id="migration84.incompatible.soap">
  <h3 class="title">SOAP</h3>

  <p class="simpara">
   <span class="property"><a href="class.soapclient.php#soapclient.props.typemap">SoapClient::$typemap</a></span> ahora es un <span class="type"><a href="language.types.array.php" class="type array">array</a></span>
   en lugar de una <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
   Las verificaciones con <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> (es decir,
   <code class="code">is_resource($client-&gt;typemap)</code>) deben ser reemplazadas por verificaciones de <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (es decir, <code class="code">$client-&gt;typemap !== null</code>).
  </p>

  <p class="simpara">
   La extensión SOAP ha adquirido una dependencia opcional de la extensión
   <a href="book.session.php" class="link">session</a>.
   Si PHP se compila sin la extensión session y con la opción de configuración
   <strong class="option unknown">--enable-rtld-now</strong> activada, se producirán errores de inicio
   si también se utiliza la extensión <a href="book.soap.php" class="link">SOAP</a>.
   Para resolver este problema, no utilice rtld-now o cargue la extensión session.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.standard">
  <h3 class="title">Estándar</h3>

  <p class="simpara">
   Al usar <span class="function"><a href="function.strcspn.php" class="function">strcspn()</a></span> con
   <code class="parameter">characters</code> siendo una cadena vacía,
   ahora se devuelve la longitud de la cadena en lugar de detenerse
   en el primer byte nulo.
   
  </p>

  <p class="simpara">
   <span class="function"><a href="function.http-build-query.php" class="function">http_build_query()</a></span> ahora maneja correctamente las enumeraciones
  </p>

  
  <p class="simpara">
   <span class="function"><a href="function.stream-bucket-make-writeable.php" class="function">stream_bucket_make_writeable()</a></span> y
   <span class="function"><a href="function.stream-bucket-new.php" class="function">stream_bucket_new()</a></span> ahora devuelven una instancia de
   <span class="classname"><strong class="classname">StreamBucket</strong></span> en lugar de una instancia de
   <span class="classname"><a href="class.stdclass.php" class="classname">stdClass</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.tidy">
  <h3 class="title">Tidy</h3>

  <p class="simpara">
   Los errores en el constructor ahora lanzan excepciones en lugar de
   emitir advertencias y tener un objeto roto.
  </p>
 </div>

 <div class="sect2" id="migration84.incompatible.xml">
  <h3 class="title">XML</h3>

  <p class="simpara">
   Las funciones <span class="function">xml_set_<span class="replaceable">*</span>_handler</span>
   ahora declaran y verifican una firma
   efectiva de <span class="type"><span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>|<span class="type"><a href="language.types.string.php" class="type string">string</a></span>|<span class="type"><a href="language.types.null.php" class="type null">null</a></span></span> para los
   parámetros <code class="parameter">handler</code>.
   Además, los valores de tipo <span class="type"><a href="language.types.string.php" class="type string">string</a></span> que corresponden a nombres de método,
   de objeto definido con <span class="function"><a href="function.xml-set-object.php" class="function">xml_set_object()</a></span> ahora se verifican para
   ver si el método existe en la clase del objeto previamente pasado.
   Esto significa que <span class="function"><a href="function.xml-set-object.php" class="function">xml_set_object()</a></span> ahora siempre debe
   ser llamada antes de definir nombres de método como <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>.
   Pasar una cadena vacía para deshabilitar el manejador sigue estando permitido,
   pero está desaprobado.
  </p>

  <p class="simpara">
   Además, con <span class="function"><a href="function.xml-set-object.php" class="function">xml_set_object()</a></span> y el paso de cadenas
   no-<span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> está desaprobado.
   Se recomienda reemplazar tales instancias con un <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>
   que se refiera directamente al método.
  </p>
 </div>

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