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

contributors($setup);

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

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

  <div class="sect3" id="migration83.incompatible.core.overflowing-call-stack">

   <h4 class="title">Programas que estaban muy cerca de desbordar la pila de llamadas</h4>
   <p class="para">
    Los programas que estaban muy cerca de desbordar la pila de llamadas ahora pueden lanzar
    un <span class="classname"><a href="class.error.php" class="classname">Error</a></span> cuando usan más de
    zend.max_allowed_stack_size-zend.reserved_stack_size bytes de pila
    (fiber.stack_size-zend.reserved_stack_size para fibras).
   </p>
  </div>

  <div class="sect3" id="migration83.incompatible.core.proc-get-status-multiple-times">
   <h4 class="title">Ejecución de proc_get_status() varias veces</h4>
   <p class="para">
    Ejecutar <span class="function"><a href="function.proc-get-status.php" class="function">proc_get_status()</a></span> varias veces ahora siempre
    devolverá el valor correcto en sistemas POSIX. Anteriormente, sólo la primera llamada
    de la función devolvía el valor correcto. Ejecutar
    <span class="function"><a href="function.proc-close.php" class="function">proc_close()</a></span> después de <span class="function"><a href="function.proc-get-status.php" class="function">proc_get_status()</a></span>
    ahora también devolverá el código de salida correcto. Anteriormente esto devolvía
    <code class="literal">-1</code>.
    Internamente, esto funciona almacenando en caché el resultado en sistemas POSIX.
    Si se requiere el comportamiento anterior, es posible verificar la
    clave <code class="literal">&quot;cached&quot;</code> en el array devuelto por
    <span class="function"><a href="function.proc-get-status.php" class="function">proc_get_status()</a></span> para verificar si el resultado fue almacenado en caché.
   </p>
  </div>

  <div class="sect3" id="migration83.incompatible.core.zend-max-execution-timers">
   <h4 class="title">Temporizadores de ejecución máxima de Zend</h4>
   <p class="para">
    Los temporizadores de ejecución máxima de Zend ahora están habilitados por defecto para compilaciones ZTS en
    Linux.
   </p>
  </div>

  <div class="sect3" id="migration83.incompatible.core.traits-with-static-properties">
   <h4 class="title">Uso de traits con propiedades estáticas</h4>
   <p class="para">
    El uso de traits con propiedades estáticas ahora redeclarará las propiedades estáticas
    heredadas de la clase padre. Esto creará un almacenamiento de propiedades estáticas separado
    para la clase actual. Esto es análogo a agregar la propiedad estática a la clase directamente sin traits.
   </p>
  </div>

  <div class="sect3" id="migration83.incompatible.core.negative-index-to-empty-array">
   <h4 class="title">Asignación de un índice negativo a un array vacío</h4>
   <p class="para">
    Asignar un índice negativo <var class="varname">$n</var> a un array vacío ahora garantizará que el
    siguiente índice sea <code class="code">$n+1</code> en lugar de <code class="literal">0</code>.
   </p>
  </div>

  <div class="sect3" id="migration83.incompatible.core.class-constant-visibility-check">
   <h4 class="title">Verificación de varianza de visibilidad de constantes de clase</h4>
   <p class="para">
    La varianza de visibilidad de constantes de clase ahora se verifica correctamente cuando se hereda
    de interfaces.
   </p>
  </div>

  <div class="sect3" id="migration83.incompatible.core.weakmap-entries-maps-to-itself">
   <h4 class="title">Entradas de WeakMap cuya clave se mapea a sí misma</h4>
   <p class="para">
    Las entradas de <span class="classname"><a href="class.weakmap.php" class="classname">WeakMap</a></span> cuya clave se mapea a sí misma (posiblemente
    de forma transitiva) ahora pueden ser eliminadas durante la recolección de ciclos si la clave no
    es alcanzable excepto iterando sobre el WeakMap (la alcanzabilidad mediante iteración se
    considera débil).
    Anteriormente, dichas entradas nunca se eliminaban automáticamente.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration83.incompatible.date">
  <h3 class="title">Date</h3>

  <p class="para">
   La extensión DateTime ha introducido excepciones y errores específicos de la extensión Date
   bajo las jerarquías <span class="classname"><a href="class.dateerror.php" class="classname">DateError</a></span> y
   <span class="classname"><a href="class.dateexception.php" class="classname">DateException</a></span>, en lugar de advertencias y excepciones genéricas.
   Esto mejora el manejo de errores, a expensas de tener que verificar errores y excepciones.
  </p>
 </div>

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

  <p class="para">
   Llamar a <span class="methodname"><a href="domchildnode.after.php" class="methodname">DOMChildNode::after()</a></span>,
   <span class="methodname"><a href="domchildnode.before.php" class="methodname">DOMChildNode::before()</a></span>,
   <span class="methodname"><a href="domchildnode.replacewith.php" class="methodname">DOMChildNode::replaceWith()</a></span>
   en un nodo que no tiene padre ahora es una operación sin efecto en lugar de una excepción de jerarquía,
   que es el comportamiento requerido por la especificación DOM.
  </p>

  <p class="para">
   Usar los métodos de <span class="classname"><a href="class.domparentnode.php" class="classname">DOMParentNode</a></span>
   y <span class="classname"><a href="class.domchildnode.php" class="classname">DOMChildNode</a></span> sin un documento ahora
   funciona en lugar de lanzar un <strong><code><a href="dom.constants.php#constant.dom-hierarchy-request-err">DOM_HIERARCHY_REQUEST_ERR</a></code></strong>
   <span class="classname"><a href="class.domexception.php" class="classname">DOMException</a></span>.
   Esto está en línea con el comportamiento requerido por la especificación DOM.
  </p>

  <p class="para">
   Llamar a <span class="methodname"><a href="domdocument.createattributens.php" class="methodname">DOMDocument::createAttributeNS()</a></span> sin especificar
   un prefijo incorrectamente creaba un espacio de nombres predeterminado, colocando el elemento
   dentro del espacio de nombres en lugar del atributo. Este error ahora está corregido.
  </p>

  <p class="para">
   <span class="methodname"><a href="domdocument.createattributens.php" class="methodname">DOMDocument::createAttributeNS()</a></span> anteriormente
   lanzaba incorrectamente un <strong><code>DOM_NAMESPACE_ERRNAMESPACE_ERR</code></strong>
   <span class="classname"><a href="class.domexception.php" class="classname">DOMException</a></span> cuando el prefijo ya se usaba para una
   URI diferente. Ahora elige correctamente un prefijo diferente cuando hay un
   conflicto de nombre de prefijo.
  </p>

  <p class="para">
   Se añadieron nuevos métodos y propiedades a algunas clases DOM.
   Si una clase de espacio de usuario hereda de estas clases y declara un método o propiedad
   con el mismo nombre, las declaraciones deben ser compatibles. De lo contrario, se lanzará un
   error de compilación típico sobre declaraciones incompatibles.
   Ver la <a href="migration83.new-features.php#migration83.new-features.dom" class="link">lista de nuevas funcionalidades</a>
   y las <a href="migration83.new-functions.php#migration83.new-functions.dom" class="link">nuevas funciones</a> para
   una lista de los métodos y propiedades recién implementados.
  </p>
 </div>

 <div class="sect2" id="migration83.incompatible.ffi">
  <h3 class="title">FFI</h3>

  <p class="para">
   Las funciones C que tienen un tipo de retorno <span class="type"><span class="type"><a href="language.types.void.php" class="type void">void</a></span></span> ahora devuelven <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> en lugar de
   devolver el siguiente objeto <code class="literal">object(FFI\CData:void) { }</code>
  </p>
 </div>

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

  <p class="para">
   La directiva INI <a href="opcache.configuration.php#ini.opcache.consistency-checks" class="link">opcache.consistency_checks</a>
   fue eliminada. Esta funcionalidad estaba rota con el JIT de rastreo,
   así como con la caché de herencia, y ha estado deshabilitada sin forma de
   habilitarla desde PHP 8.1.18 y PHP 8.2.5.
   Tanto el JIT de rastreo como la caché de herencia pueden modificar la shm después de que el script
   haya sido persistido al invalidar su suma de verificación. El intento de corrección omitía
   los punteros modificables pero fue rechazado debido a la complejidad. Por esta
   razón, se decidió eliminar la funcionalidad.
  </p>
 </div>

 <div class="sect2" id="migration83.incompatible.phar">
  <h3 class="title">Phar</h3>

  <p class="para">
   Los tipos de las constantes de la clase <span class="classname"><a href="class.phar.php" class="classname">Phar</a></span> ahora están declarados.
  </p>
 </div>

 <div class="sect2" id="migration83.incompatible.standard">
  <h3 class="title">Standard</h3>

  <p class="para">
   La función <span class="function"><a href="function.range.php" class="function">range()</a></span> ha tenido varios cambios:
   <ul class="simplelist">
    <li>Ahora se lanza un <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> cuando se pasan <span class="type"><a href="language.types.object.php" class="type object">object</a></span>s,
    <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s, o <span class="type"><a href="language.types.array.php" class="type array">array</a></span>s como entradas de límite.</li>
    <li>Se lanza un <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> más descriptivo cuando
    se pasa <code class="literal">0</code> para <code class="parameter">$step</code>.</li>
    <li>Ahora se lanza un <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> cuando se usa un
    <code class="parameter">$step</code> negativo para rangos crecientes.</li>
    <li>Si <code class="parameter">$step</code> es un float que puede interpretarse
    como un int, ahora se hace así.</li>
    <li>Ahora se lanza un <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> si cualquier argumento
    es infinito o NAN.</li>
    <li>Ahora se emite un <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> si
    <code class="parameter">$start</code> o <code class="parameter">$end</code> es la cadena vacía.
    El valor continúa siendo convertido al valor <code class="literal">0</code>.</li>
    <li>Ahora se emite un <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> si
    <code class="parameter">$start</code> o <code class="parameter">$end</code> tiene más de
    un byte, solo si es una cadena no numérica.</li>
    <li>Ahora se emite un <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> si
    <code class="parameter">$start</code> o <code class="parameter">$end</code> se convierte a un
    entero porque la otra entrada de límite es un número.
    (p.ej. <code class="code">range(5, &#039;z&#039;);</code>).</li>
    <li>Ahora se emite un <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> si
    <code class="parameter">$step</code> es un float al intentar generar un rango de
    caracteres, excepto si ambas entradas de límite son cadenas numéricas (p.ej.
    <code class="code">range(&#039;5&#039;, &#039;9&#039;, 0.5);</code> no produce una advertencia).</li>
    <li><span class="function"><a href="function.range.php" class="function">range()</a></span> ahora produce una lista de caracteres si una
    de las entradas de límite es un dígito de cadena en lugar de convertir la otra entrada
    a int (p.ej. <code class="code">range(&#039;9&#039;, &#039;A&#039;);</code>).</li>
   </ul>

   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />range</span><span style="color: #007700">(</span><span style="color: #DD0000">'9'</span><span style="color: #007700">, </span><span style="color: #DD0000">'A'</span><span style="color: #007700">);  </span><span style="color: #FF8000">// ["9", ":", ";", "&lt;", "=", "&gt;", "?", "@", "A"], a partir de PHP 8.3.0<br /></span><span style="color: #0000BB">range</span><span style="color: #007700">(</span><span style="color: #DD0000">'9'</span><span style="color: #007700">, </span><span style="color: #DD0000">'A'</span><span style="color: #007700">);  </span><span style="color: #FF8000">// [9, 8, 7, 6, 5, 4, 3, 2, 1, 0], antes de PHP 8.3.0<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>

  <p class="para">
   <span class="function"><a href="function.number-format.php" class="function">number_format()</a></span> ahora maneja valores negativos de
   <code class="parameter">$decimals</code> redondeando
   <code class="parameter">$num</code> a <code class="code">abs($decimals)</code> dígitos antes del
   punto decimal. Anteriormente, los valores negativos de <code class="parameter">$decimals</code>
   eran ignorados.
  </p>

  <p class="para">
   La verificación de errores de flags de <span class="function"><a href="function.file.php" class="function">file()</a></span> ahora captura todos los flags inválidos.
   Notablemente, <strong><code><a href="filesystem.constants.php#constant.file-append">FILE_APPEND</a></code></strong> era anteriormente aceptado silenciosamente.
  </p>
 </div>

 <div class="sect2" id="migration83.incompatible.SNMP">
  <h3 class="title">SNMP</h3>

  <p class="para">
   Los tipos de las constantes de la clase <span class="classname"><a href="class.snmp.php" class="classname">SNMP</a></span> ahora están declarados.
  </p>
 </div>

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