<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration80.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'migration80.incompatible.php',
    1 => 'Cambios incompatibles hacia atr&aacute;s',
    2 => 'Cambios incompatibles hacia atr&aacute;s',
  ),
  'up' => 
  array (
    0 => 'migration80.php',
    1 => 'Migraci&oacute;n de PHP 7.4.x a PHP 8.0.x',
  ),
  'prev' => 
  array (
    0 => 'migration80.new-classes.php',
    1 => 'Nuevas clases e interfaces',
  ),
  'next' => 
  array (
    0 => 'migration80.deprecated.php',
    1 => 'Funcionalidades obsoletas',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'appendices/migration80/incompatible.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration80.incompatible" class="sect1">
 <h2 class="title">Cambios incompatibles hacia atrás</h2>

 <div class="sect2" id="migration80.incompatible.core">
  <h3 class="title">PHP Core</h3>

  <div class="sect3" id="migration80.incompatible.core.string-number-comparision">
   <h4 class="title">Comparación de cadenas con números</h4>

   <p class="para">
    Las comparaciones no estrictas entre números y cadenas no numéricas ahora funcionan convirtiendo el
    número a cadena y comparando las cadenas. Las comparaciones entre números y cadenas numéricas
    continúan funcionando como antes. En particular, esto significa que
    <code class="code">0 == &quot;not-a-number&quot;</code> ahora se considera falso.
    <table class="doctable informaltable">
     
      <thead>
       <tr>
        <th>Comparación</th>
        <th>Antes</th>
        <th>Después</th>
       </tr>

      </thead>

      <tbody class="tbody">
       <tr>
        <td><code class="code">0 == &quot;0&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">0 == &quot;0.0&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">0 == &quot;foo&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">0 == &quot;&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">42 == &quot;   42&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">42 == &quot;42foo&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></td>
       </tr>

      </tbody>
     
    </table>

    
   </p>
  </div>

  <div class="sect3" id="migration80.incompatible.core.other">
   <h4 class="title">Otros cambios incompatibles</h4>

   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      <code class="literal">match</code> es ahora una palabra reservada.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <code class="literal">mixed</code> ahora es una palabra reservada, por lo que no puede ser utilizada para nombrar una clase, interfaz o trait, y tampoco está permitida en espacios de nombres.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Los fallos de aserción ahora lanzan una excepción por defecto. Si se desea el comportamiento
      anterior, se puede establecer <code class="code">assert.exception=0</code> en la configuración INI.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Los métodos con el mismo nombre que la clase ya no se interpretan como constructores. Se debe
      usar el método <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> en su lugar.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      La posibilidad de llamar a métodos no estáticos de forma estática ha sido eliminada. Por lo
      tanto, <span class="function"><a href="function.is-callable.php" class="function">is_callable()</a></span> fallará al verificar un método no estático con un nombre
      de clase (se debe verificar con una instancia de objeto).
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Las conversiones <code class="code">(real)</code> y <code class="code">(unset)</code> han sido eliminadas.
     </p>
    </li>
    <li class="listitem">
      <p class="para">
       La directiva ini <a href="errorfunc.configuration.php#ini.track-errors" class="link">track_errors</a> ha sido eliminada. Esto
       significa que <var class="varname">php_errormsg</var> ya no está disponible. Se puede usar la función
       <span class="function"><a href="function.error-get-last.php" class="function">error_get_last()</a></span> en su lugar.
      </p>
    </li>
    <li class="listitem">
     <p class="para">
      La posibilidad de definir constantes insensibles a mayúsculas y minúsculas ha sido eliminada. El
      tercer argumento de <span class="function"><a href="function.define.php" class="function">define()</a></span> ya no puede ser <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      La posibilidad de especificar un autocargador utilizando una función
      <span class="function"><a href="function.autoload.php" class="function">__autoload()</a></span> ha sido eliminada. Se debe usar
      <span class="function"><a href="function.spl-autoload-register.php" class="function">spl_autoload_register()</a></span> en su lugar.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      El argumento <code class="parameter">errcontext</code> ya no se pasará a los manejadores de errores
      personalizados establecidos con <span class="function"><a href="function.set-error-handler.php" class="function">set_error_handler()</a></span>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <span class="function"><a href="function.create-function.php" class="function">create_function()</a></span> ha sido eliminada. Se pueden usar funciones anónimas en su
      lugar.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <span class="function"><a href="function.each.php" class="function">each()</a></span> ha sido eliminada. Se debe usar <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> o
      <span class="classname"><a href="class.arrayiterator.php" class="classname">ArrayIterator</a></span> en su lugar.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      La posibilidad de desvincular <var class="varname">this</var> de closures que fueron creadas a partir de
      un método, utilizando <span class="methodname"><a href="closure.fromcallable.php" class="methodname">Closure::fromCallable()</a></span> o
      <span class="methodname"><a href="reflectionmethod.getclosure.php" class="methodname">ReflectionMethod::getClosure()</a></span>, ha sido eliminada.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      La posibilidad de desvincular <var class="varname">this</var> de closures propias que contienen usos de
      <var class="varname">this</var> también ha sido eliminada.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      La posibilidad de usar <span class="function"><a href="function.array-key-exists.php" class="function">array_key_exists()</a></span> con objetos ha sido eliminada. Se
      puede usar <span class="function"><a href="function.isset.php" class="function">isset()</a></span> o <span class="function"><a href="function.property-exists.php" class="function">property_exists()</a></span> en su lugar.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      El comportamiento de <span class="function"><a href="function.array-key-exists.php" class="function">array_key_exists()</a></span> en relación con el tipo del parámetro
      <code class="parameter">key</code> se ha hecho consistente con <span class="function"><a href="function.isset.php" class="function">isset()</a></span> y el acceso
      normal a arrays. Todos los tipos de clave ahora usan las coerciones habituales y las claves de
      tipo array/object lanzan un <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Cualquier array que tenga un número <span class="replaceable">n</span> como su primera clave numérica
      usará <span class="replaceable">n+1</span> para su siguiente clave implícita, incluso si
      <span class="replaceable">n</span> es negativo.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      El nivel predeterminado de error_reporting es ahora <strong><code><a href="errorfunc.constants.php#constant.e-all">E_ALL</a></code></strong>. Anteriormente
      excluía <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong> y <strong><code><a href="errorfunc.constants.php#constant.e-deprecated">E_DEPRECATED</a></code></strong>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <a href="errorfunc.configuration.php#ini.display-startup-errors" class="link">display_startup_errors</a> está ahora habilitado
      por defecto.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Usar <span class="type">parent</span> dentro de una clase que no tiene padre ahora resultará en un error fatal
      en tiempo de compilación.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      El operador <code class="literal">@</code> ya no silenciará los errores fatales
      (<strong><code><a href="errorfunc.constants.php#constant.e-error">E_ERROR</a></code></strong>, <strong><code><a href="errorfunc.constants.php#constant.e-core-error">E_CORE_ERROR</a></code></strong>,
      <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>, <strong><code><a href="errorfunc.constants.php#constant.e-user-error">E_USER_ERROR</a></code></strong>,
      <strong><code><a href="errorfunc.constants.php#constant.e-recoverable-error">E_RECOVERABLE_ERROR</a></code></strong>, <strong><code><a href="errorfunc.constants.php#constant.e-parse">E_PARSE</a></code></strong>). Los manejadores de
      errores que esperan que error_reporting sea <code class="literal">0</code> cuando se usa
      <code class="literal">@</code>, deben ajustarse para usar una verificación de máscara en su lugar:
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Reemplazar<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">my_error_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$err_no</span><span style="color: #007700">, </span><span style="color: #0000BB">$err_msg</span><span style="color: #007700">, </span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$linenum</span><span style="color: #007700">) {<br />    if (</span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">() == </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br />        return; </span><span style="color: #FF8000">// Silenciado<br />    </span><span style="color: #007700">}<br />    </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">// Por<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">my_error_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$err_no</span><span style="color: #007700">, </span><span style="color: #0000BB">$err_msg</span><span style="color: #007700">, </span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$linenum</span><span style="color: #007700">) {<br />    if (!(</span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">() &amp; </span><span style="color: #0000BB">$err_no</span><span style="color: #007700">)) {<br />        return; </span><span style="color: #FF8000">// Silenciado<br />    </span><span style="color: #007700">}<br />    </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      Además, se debe tener cuidado de que los mensajes de error no se muestren en entornos de
      producción, lo que puede resultar en fugas de información. Es necesario asegurarse de que
      <code class="code">display_errors=Off</code> se use junto con el registro de errores.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <code class="literal">#[</code> ya no se interpreta como el inicio de un comentario, ya que esta sintaxis
      ahora se usa para atributos.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Los errores de herencia debidos a firmas de métodos incompatibles (violaciones de LSP) ahora
      siempre generarán un error fatal. Anteriormente se generaba una advertencia en algunos casos.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      La precedencia del operador de concatenación ha cambiado en relación con los desplazamientos de
      bits y la suma, así como la resta.
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Sum: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// anteriormente se interpretaba como:<br /></span><span style="color: #007700">echo (</span><span style="color: #DD0000">"Sum: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$a</span><span style="color: #007700">) + </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// ahora se interpreta como:<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Sum:" </span><span style="color: #007700">. (</span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Los argumentos con un valor predeterminado que se resuelve a <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> en tiempo de ejecución ya no
      marcarán implícitamente el tipo del argumento como nullable. Se debe usar un tipo nullable
      explícito o un valor predeterminado <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> explícito en su lugar.
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Reemplazar<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">int $arg </span><span style="color: #007700">= </span><span style="color: #0000BB">CONST_RESOLVING_TO_NULL</span><span style="color: #007700">) {}<br /></span><span style="color: #FF8000">// Por<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(?</span><span style="color: #0000BB">int $arg </span><span style="color: #007700">= </span><span style="color: #0000BB">CONST_RESOLVING_TO_NULL</span><span style="color: #007700">) {}<br /></span><span style="color: #FF8000">// O<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">int $arg </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">) {}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Varias advertencias se han convertido en excepciones <span class="classname"><a href="class.error.php" class="classname">Error</a></span>:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li>
        Intentar escribir en una propiedad de un no-objeto. Anteriormente esto creaba implícitamente
        un objeto stdClass para null, false y cadenas vacías.
       </li>
       <li>
        Intentar agregar un elemento a un array cuya clave PHP_INT_MAX ya está en uso.
       </li>
       <li>
        Intentar usar un tipo no válido (array u objeto) como clave de array u offset de cadena.
       </li>
       <li>Intentar escribir en un índice de array de un valor escalar.</li>
       <li>Intentar desempaquetar un valor que no es array/Traversable.</li>
       <li>
        Intentar acceder a constantes no calificadas que no están definidas. Anteriormente, el acceso
        a constantes no calificadas resultaba en una advertencia y se interpretaban como cadenas.
       </li>
       <li>
        Pasar un número incorrecto de argumentos a una función interna no variádica lanzará un <span class="classname"><a href="class.argumentcounterror.php" class="classname">ArgumentCountError</a></span>.
       </li>
       <li>
        Pasar tipos no contables inválidos a <span class="function"><a href="function.count.php" class="function">count()</a></span> lanzará un <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span>.
       </li>
      </ul>
     </p>
     <p class="para">
      Varios avisos se han convertido en advertencias:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li>Intentar leer una variable no definida.</li>
       <li>Intentar leer una propiedad no definida.</li>
       <li>Intentar leer una clave de array no definida.</li>
       <li>Intentar leer una propiedad de un no-objeto.</li>
       <li>Intentar acceder a un índice de array de un no-array.</li>
       <li>Intentar convertir un array a cadena.</li>
       <li>Intentar usar un recurso como clave de array.</li>
       <li>Intentar usar null, un booleano o un flotante como offset de cadena.</li>
       <li>Intentar leer un offset de cadena fuera de los límites.</li>
       <li>Intentar asignar una cadena vacía a un offset de cadena.</li>
      </ul>
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Intentar asignar múltiples bytes a un offset de cadena ahora emitirá una advertencia.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Los caracteres inesperados en los archivos fuente (como bytes NUL fuera de las cadenas) ahora
      resultarán en una excepción <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span> en lugar de una advertencia de
      compilación.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Las excepciones no capturadas ahora pasan por un &quot;cierre limpio&quot;, lo que significa que los
      destructores se llamarán después de una excepción no capturada.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      El error fatal en tiempo de compilación &quot;Only variables can be passed by reference&quot; se ha
      pospuesto hasta el tiempo de ejecución y se ha convertido en una excepción
      <span class="classname"><a href="class.error.php" class="classname">Error</a></span> &quot;Argument cannot be passed by reference&quot;.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Algunos avisos &quot;Only variables should be passed by reference&quot; se han convertido en la excepción
      &quot;Argument cannot be passed by reference&quot;.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      El nombre generado para las clases anónimas ha cambiado. Ahora incluirá el nombre de la primera
      clase padre o interfaz:
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">new class extends </span><span style="color: #0000BB">ParentClass </span><span style="color: #007700">{};<br /></span><span style="color: #FF8000">// -&gt; ParentClass@anonymous<br /></span><span style="color: #007700">new class implements </span><span style="color: #0000BB">FirstInterface</span><span style="color: #007700">, </span><span style="color: #0000BB">SecondInterface </span><span style="color: #007700">{};<br /></span><span style="color: #FF8000">// -&gt; FirstInterface@anonymous<br /></span><span style="color: #007700">new class {};<br /></span><span style="color: #FF8000">// -&gt; class@anonymous<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      El nombre mostrado arriba todavía va seguido de un byte NUL y un sufijo único.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Las referencias a métodos de trait no absolutas en las adaptaciones de alias de trait ahora deben
      ser inequívocas:
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">X </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">T1</span><span style="color: #007700">, </span><span style="color: #0000BB">T2 </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">func </span><span style="color: #007700">as </span><span style="color: #0000BB">otherFunc</span><span style="color: #007700">;<br />    }<br />    function </span><span style="color: #0000BB">func</span><span style="color: #007700">() {}<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      Si tanto <code class="code">T1::func()</code> como <code class="code">T2::func()</code> existen, este código era aceptado
      silenciosamente antes, y se asumía que func se refería a <code class="code">T1::func</code>. Ahora generará un
      error fatal en su lugar, y se debe escribir explícitamente <code class="code">T1::func</code> o
      <code class="code">T2::func</code>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      La firma de los métodos abstractos definidos en traits ahora se verifica contra el método de la
      clase que los implementa:
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">trait </span><span style="color: #0000BB">MyTrait </span><span style="color: #007700">{<br />    abstract private function </span><span style="color: #0000BB">neededByTrait</span><span style="color: #007700">(): </span><span style="color: #0000BB">string</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">MyClass </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">MyTrait</span><span style="color: #007700">;<br /><br />    </span><span style="color: #FF8000">// Error, debido a la incompatibilidad del tipo de retorno.<br />    </span><span style="color: #007700">private function </span><span style="color: #0000BB">neededByTrait</span><span style="color: #007700">(): </span><span style="color: #0000BB">int </span><span style="color: #007700">{ return </span><span style="color: #0000BB">42</span><span style="color: #007700">; }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Las funciones deshabilitadas ahora se tratan exactamente como funciones inexistentes. Llamar a
      una función deshabilitada la reportará como desconocida, y redefinir una función deshabilitada
      ahora es posible.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Los envoltorios de flujo <code class="literal">data://</code> ya no son escribibles, lo que coincide con el
      comportamiento documentado.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Los operadores aritméticos y a nivel de bits <code class="literal">+</code>, <code class="literal">-</code>,
      <code class="literal">*</code>, <code class="literal">/</code>, <code class="literal">**</code>, <code class="literal">%</code>,
      <code class="literal">&lt;&lt;</code>, <code class="literal">&gt;&gt;</code>, <code class="literal">&amp;</code>,
      <code class="literal">|</code>, <code class="literal">^</code>, <code class="literal">~</code>, <code class="literal">++</code>,
      <code class="literal">--</code> ahora lanzarán consistentemente un <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> cuando
      uno de los operandos sea un <span class="type"><a href="language.types.array.php" class="type array">array</a></span>, <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> u <span class="type"><a href="language.types.object.php" class="type object">object</a></span> no sobrecargado. La única excepción a
      esto es la operación de fusión de arrays <code class="literal">+</code>, que sigue siendo soportada.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      La conversión de flotante a cadena ahora siempre se comportará de manera independiente de la
      configuración regional.
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />setlocale</span><span style="color: #007700">(</span><span style="color: #0000BB">LC_ALL</span><span style="color: #007700">, </span><span style="color: #DD0000">"de_DE"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$f </span><span style="color: #007700">= </span><span style="color: #0000BB">3.14</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">$f</span><span style="color: #007700">, </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Anteriormente: 3,14<br />// Ahora:         3.14<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      Véase <span class="function"><a href="function.printf.php" class="function">printf()</a></span>, <span class="function"><a href="function.number-format.php" class="function">number_format()</a></span> y
      <span class="methodname"><strong>NumberFormatter()</strong></span> para formas de personalizar el formato de números.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      El soporte para el acceso a offsets con llaves (obsoleto) ha sido eliminado.
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// En lugar de:<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">{</span><span style="color: #0000BB">0</span><span style="color: #007700">};<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">{</span><span style="color: #DD0000">"key"</span><span style="color: #007700">};<br /></span><span style="color: #FF8000">// Escribir:<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"key"</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Aplicar el modificador final en un método privado ahora producirá una advertencia a menos que ese
      método sea el constructor.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Si el constructor de un objeto llama a <span class="function"><a href="function.exit.php" class="function">exit()</a></span>, el destructor del objeto ya no
      se llamará. Esto coincide con el comportamiento cuando el constructor lanza una excepción.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Los nombres con espacio de nombres ya no pueden contener espacios en blanco: Mientras que
      <code class="code">Foo\Bar</code> se reconocerá como un nombre con espacio de nombres,
      <code class="code">Foo \ Bar</code> no. Por el contrario, las palabras reservadas ahora están permitidas como
      segmentos de espacio de nombres, lo que también puede cambiar la interpretación del código:
      <code class="code">new\x</code> ahora es lo mismo que <code class="code">constant(&#039;new\x&#039;)</code>, no
      <code class="code">new \x()</code>.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Los ternarios anidados ahora requieren paréntesis explícitos.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <span class="function"><a href="function.debug-backtrace.php" class="function">debug_backtrace()</a></span> y <span class="methodname"><a href="exception.gettrace.php" class="methodname">Exception::getTrace()</a></span> ya no
      proporcionarán referencias a los argumentos. No será posible cambiar los argumentos de una
      función a través del backtrace.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      El manejo de cadenas numéricas ha sido modificado para ser más intuitivo y menos propenso a
      errores. Los espacios en blanco finales ahora se permiten en cadenas numéricas por consistencia
      con la forma en que se tratan los espacios en blanco iniciales. Esto afecta principalmente a:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li>La función <span class="function"><a href="function.is-numeric.php" class="function">is_numeric()</a></span></li>
       <li>Comparaciones de cadena a cadena</li>
       <li>Declaraciones de tipo</li>
       <li>Operaciones de incremento y decremento</li>
      </ul>
     </p>
     <p class="para">
      El concepto de &quot;cadena numéricamente inicial&quot; ha sido mayormente eliminado; los casos donde esto
      se mantiene existen para facilitar la migración. Las cadenas que emitían un
      <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong> &quot;A non well-formed numeric value encountered&quot; ahora emitirán un
      <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> &quot;A non-numeric value encountered&quot; y todas las cadenas que emitían
      un <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> &quot;A non-numeric value encountered&quot; ahora lanzarán un
      <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span>. Esto afecta principalmente a:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li>Operaciones aritméticas</li>
       <li>Operaciones a nivel de bits</li>
      </ul>
     </p>
     <p class="para">
      Este cambio de <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> a <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> también afecta
      al <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> &quot;Illegal string offset &#039;string&#039;&quot; para offsets de cadena
      ilegales. El comportamiento de las conversiones explícitas a int/float desde cadenas no ha
      cambiado.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Los métodos mágicos ahora tendrán sus argumentos y tipos de retorno verificados si los tienen
      declarados. Las firmas deben coincidir con la siguiente lista:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li><code class="code">__call(string $name, array $arguments): mixed</code></li>
       <li><code class="code">__callStatic(string $name, array $arguments): mixed</code></li>
       <li><code class="code">__clone(): void</code></li>
       <li><code class="code">__debugInfo(): ?array</code></li>
       <li><code class="code">__get(string $name): mixed</code></li>
       <li><code class="code">__invoke(mixed $arguments): mixed</code></li>
       <li><code class="code">__isset(string $name): bool</code></li>
       <li><code class="code">__serialize(): array</code></li>
       <li><code class="code">__set(string $name, mixed $value): void</code></li>
       <li><code class="code">__set_state(array $properties): object</code></li>
       <li><code class="code">__sleep(): array</code></li>
       <li><code class="code">__unserialize(array $data): void</code></li>
       <li><code class="code">__unset(string $name): void</code></li>
       <li><code class="code">__wakeup(): void</code></li>
      </ul>
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Las claves de array de <span class="function"><a href="function.call-user-func-array.php" class="function">call_user_func_array()</a></span> ahora se interpretarán como
      nombres de parámetros, en lugar de ser silenciosamente ignoradas.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Declarar una función llamada <code class="literal">assert()</code> dentro de un espacio de nombres ya no
      está permitido y emite <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>. La función
      <span class="function"><a href="function.assert.php" class="function">assert()</a></span> está sujeta a un tratamiento especial por parte del motor, lo que
      puede llevar a un comportamiento inconsistente al definir una función con espacio de nombres con
      el mismo nombre.
     </p>
    </li>
   </ul>
  </div>
 </div>

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

  <p class="para">
   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.
   Las comprobaciones de valores de retorno que utilizan <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> deben ser reemplazadas por comprobaciones de <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
  </p>
  <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      <span class="function"><a href="function.curl-init.php" class="function">curl_init()</a></span> ahora devolverá un objeto <span class="classname"><a href="class.curlhandle.php" class="classname">CurlHandle</a></span> en lugar de
      un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>. La función <span class="function"><a href="function.curl-close.php" class="function">curl_close()</a></span> ya no tiene efecto;
      en su lugar, la instancia de <span class="classname"><a href="class.curlhandle.php" class="classname">CurlHandle</a></span> se destruye automáticamente si ya no
      es referenciada.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <span class="function"><a href="function.curl-multi-init.php" class="function">curl_multi_init()</a></span> ahora devolverá un objeto <span class="classname"><a href="class.curlmultihandle.php" class="classname">CurlMultiHandle</a></span>
      en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>. La función <span class="function"><a href="function.curl-multi-close.php" class="function">curl_multi_close()</a></span> ya no
      tiene efecto; en su lugar, la instancia de <span class="classname"><a href="class.curlmultihandle.php" class="classname">CurlMultiHandle</a></span> se destruye
      automáticamente si ya no es referenciada.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <span class="function"><a href="function.curl-share-init.php" class="function">curl_share_init()</a></span> ahora devolverá un objeto <span class="classname"><a href="class.curlsharehandle.php" class="classname">CurlShareHandle</a></span>
      en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>. La función <span class="function"><a href="function.curl-share-close.php" class="function">curl_share_close()</a></span> ya no
      tiene efecto; en su lugar, la instancia de <span class="classname"><a href="class.curlsharehandle.php" class="classname">CurlShareHandle</a></span> se destruye
      automáticamente si ya no es referenciada.
     </p>
    </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.enchant-broker-init.php" class="function">enchant_broker_init()</a></span> ahora devolverá un objeto <span class="classname"><a href="class.enchantbroker.php" class="classname">EnchantBroker</a></span>
     en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.enchant-broker-request-dict.php" class="function">enchant_broker_request_dict()</a></span> y
     <span class="function"><a href="function.enchant-broker-request-pwl-dict.php" class="function">enchant_broker_request_pwl_dict()</a></span> ahora devolverán un objeto
     <span class="classname"><a href="class.enchantdictionary.php" class="classname">EnchantDictionary</a></span> en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     La extensión GD ahora utiliza objetos <span class="classname"><a href="class.gdimage.php" class="classname">GdImage</a></span> como estructura de datos subyacente
     para las imágenes, en lugar de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s.
     La función <span class="function"><a href="function.imagedestroy.php" class="function">imagedestroy()</a></span> ya no tiene efecto; en su lugar, la instancia de
     <span class="classname"><a href="class.gdimage.php" class="classname">GdImage</a></span> se destruye automáticamente si ya no es referenciada.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.openssl-x509-read.php" class="function">openssl_x509_read()</a></span> y <span class="function"><a href="function.openssl-csr-sign.php" class="function">openssl_csr_sign()</a></span> ahora devolverán
     un objeto <span class="classname"><a href="class.opensslcertificate.php" class="classname">OpenSSLCertificate</a></span> en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
     La función <span class="function"><a href="function.openssl-x509-free.php" class="function">openssl_x509_free()</a></span> está obsoleta y ya no tiene efecto;
     en su lugar, la instancia de <span class="classname"><a href="class.opensslcertificate.php" class="classname">OpenSSLCertificate</a></span> se destruye automáticamente si
     ya no es referenciada.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.openssl-csr-new.php" class="function">openssl_csr_new()</a></span> ahora devolverá un objeto
     <span class="classname"><a href="class.opensslcertificatesigningrequest.php" class="classname">OpenSSLCertificateSigningRequest</a></span> en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.openssl-pkey-new.php" class="function">openssl_pkey_new()</a></span> ahora devolverá un objeto
     <span class="classname"><a href="class.opensslasymmetrickey.php" class="classname">OpenSSLAsymmetricKey</a></span> en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
     La función <span class="function"><a href="function.openssl-pkey-free.php" class="function">openssl_pkey_free()</a></span> está obsoleta y ya no tiene efecto;
     en su lugar, la instancia de <span class="classname"><a href="class.opensslasymmetrickey.php" class="classname">OpenSSLAsymmetricKey</a></span> se destruye automáticamente si
     ya no es referenciada.
    </p>
   </li>
   <li class="listitem">
     <p class="para">
      <span class="function"><a href="function.shmop-open.php" class="function">shmop_open()</a></span> ahora devolverá un objeto <span class="classname"><a href="class.shmop.php" class="classname">Shmop</a></span> en lugar de
      un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>. La función <span class="function"><a href="function.shmop-close.php" class="function">shmop_close()</a></span> ya no tiene efecto, y está
      obsoleta; en su lugar, la instancia de <span class="classname"><a href="class.shmop.php" class="classname">Shmop</a></span> se destruye automáticamente si ya no
      es referenciada.
     </p>
    </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.socket-create.php" class="function">socket_create()</a></span>, <span class="function"><a href="function.socket-create-listen.php" class="function">socket_create_listen()</a></span>,
     <span class="function"><a href="function.socket-accept.php" class="function">socket_accept()</a></span>, <span class="function"><a href="function.socket-import-stream.php" class="function">socket_import_stream()</a></span>,
     <span class="function"><a href="function.socket-addrinfo-connect.php" class="function">socket_addrinfo_connect()</a></span>, <span class="function"><a href="function.socket-addrinfo-bind.php" class="function">socket_addrinfo_bind()</a></span> y
     <span class="function"><a href="function.socket-wsaprotocol-info-import.php" class="function">socket_wsaprotocol_info_import()</a></span> ahora devolverán un objeto
     <span class="classname"><a href="class.socket.php" class="classname">Socket</a></span> en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
     <span class="function"><a href="function.socket-addrinfo-lookup.php" class="function">socket_addrinfo_lookup()</a></span> ahora devolverá un array de objetos
     <span class="classname"><a href="class.addressinfo.php" class="classname">AddressInfo</a></span> en lugar de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.msg-get-queue.php" class="function">msg_get_queue()</a></span> ahora devolverá un objeto <span class="classname"><a href="class.sysvmessagequeue.php" class="classname">SysvMessageQueue</a></span>
     en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.sem-get.php" class="function">sem_get()</a></span> ahora devolverá un objeto <span class="classname"><a href="class.sysvsemaphore.php" class="classname">SysvSemaphore</a></span>
     en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.shm-attach.php" class="function">shm_attach()</a></span> ahora devolverá un objeto <span class="classname"><a href="class.sysvsharedmemory.php" class="classname">SysvSharedMemory</a></span>
     en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.xml-parser-create.php" class="function">xml_parser_create()</a></span> y <span class="function"><a href="function.xml-parser-create-ns.php" class="function">xml_parser_create_ns()</a></span> ahora
     devolverán un objeto <span class="classname"><a href="class.xmlparser.php" class="classname">XMLParser</a></span> en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>. La función
     <span class="function"><a href="function.xml-parser-free.php" class="function">xml_parser_free()</a></span> ya no tiene efecto; en su lugar, la instancia de XMLParser
     se destruye automáticamente si ya no es referenciada.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las funciones de <a href="book.xmlwriter.php" class="link">XMLWriter</a> ahora aceptan y devuelven, respectivamente,
     objetos <span class="classname"><a href="class.xmlwriter.php" class="classname">XMLWriter</a></span> en lugar de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.inflate-init.php" class="function">inflate_init()</a></span> ahora devolverá un objeto <span class="classname"><a href="class.inflatecontext.php" class="classname">InflateContext</a></span>
     en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.deflate-init.php" class="function">deflate_init()</a></span> ahora devolverá un objeto <span class="classname"><a href="class.deflatecontext.php" class="classname">DeflateContext</a></span>
     en lugar de un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.com">
  <h3 class="title">COM y .Net (Windows)</h3>

  <p class="para">
   La capacidad de importar constantes que no distinguen entre mayúsculas y minúsculas desde bibliotecas de tipos ha sido eliminada.
   El segundo argumento de <span class="function"><a href="function.com-load-typelib.php" class="function">com_load_typelib()</a></span> ya no puede ser false;
   <a href="com.configuration.php#ini.com.autoregister-casesensitive" class="link">com.autoregister_casesensitive</a>
   ya no puede ser deshabilitado; los marcadores que no distinguen entre mayúsculas y minúsculas en
   <a href="com.configuration.php#ini.com.typelib-file" class="link">com.typelib_file</a> son ignorados.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.curl">
  <h3 class="title">CURL</h3>

  <p class="para">
   <strong><code><a href="curl.constants.php#constant.curlopt-postfields">CURLOPT_POSTFIELDS</a></code></strong> ya no acepta objetos como arrays. Para
   interpretar un objeto como un array, se debe realizar una conversión explícita con <code class="code">(array)</code>. Lo
   mismo aplica para otras opciones que aceptan arrays.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.datetime">
  <h3 class="title">Date y Time</h3>

  <p class="para">
   <span class="function"><a href="function.mktime.php" class="function">mktime()</a></span> y <span class="function"><a href="function.gmmktime.php" class="function">gmmktime()</a></span> ahora requieren al menos un
   argumento. Se puede utilizar <span class="function"><a href="function.time.php" class="function">time()</a></span> para obtener la marca de tiempo actual.
  </p>
 </div>

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

  <p class="para">
   Las clases no implementadas de la extensión DOM que no tenían comportamiento y contenían datos
   de prueba han sido eliminadas. Estas clases también han sido eliminadas en la última versión
   del estándar DOM:
  </p>
  <p class="para">
   <ul class="simplelist">
    <li><span class="classname"><strong class="classname">DOMNameList</strong></span></li>
    <li><span class="classname"><strong class="classname">DomImplementationList</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMConfiguration</strong></span></li>
    <li><span class="classname"><strong class="classname">DomError</strong></span></li>
    <li><span class="classname"><strong class="classname">DomErrorHandler</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMImplementationSource</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMLocator</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMUserDataHandler</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMTypeInfo</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMStringExtend</strong></span></li>
   </ul>
  </p>
  <p class="para">
   Los métodos no implementados de la extensión DOM que no tenían comportamiento han sido eliminados:
  </p>
  <p class="para">
   <ul class="simplelist">
    <li><span class="methodname"><strong>DOMNamedNodeMap::setNamedItem()</strong></span></li>
    <li><span class="methodname"><strong>DOMNamedNodeMap::removeNamedItem()</strong></span></li>
    <li><span class="methodname"><strong>DOMNamedNodeMap::setNamedItemNS()</strong></span></li>
    <li><span class="methodname"><strong>DOMNamedNodeMap::removeNamedItemNS()</strong></span></li>
    <li><span class="methodname"><strong>DOMText::replaceWholeText()</strong></span></li>
    <li><span class="methodname"><a href="domnode.comparedocumentposition.php" class="methodname">DOMNode::compareDocumentPosition()</a></span></li>
    <li><span class="methodname"><a href="domnode.isequalnode.php" class="methodname">DOMNode::isEqualNode()</a></span></li>
    <li><span class="methodname"><strong>DOMNode::getFeature()</strong></span></li>
    <li><span class="methodname"><strong>DOMNode::setUserData()</strong></span></li>
    <li><span class="methodname"><strong>DOMNode::getUserData()</strong></span></li>
    <li><span class="methodname"><strong>DOMDocument::renameNode()</strong></span></li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.enchant">
  <h3 class="title">Enchant</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.enchant-broker-list-dicts.php" class="function">enchant_broker_list_dicts()</a></span>, <span class="function"><a href="function.enchant-broker-describe.php" class="function">enchant_broker_describe()</a></span> y
     <span class="function"><a href="function.enchant-dict-suggest.php" class="function">enchant_dict_suggest()</a></span> ahora devolverán un array vacío en lugar de <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.exif">
  <h3 class="title">Exif</h3>

  <p class="para">
   <span class="function"><a href="function.read-exif-data.php" class="function">read_exif_data()</a></span> ha sido eliminada; debe usarse
   <span class="function"><a href="function.exif-read-data.php" class="function">exif_read_data()</a></span> en su lugar.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.filter">
  <h3 class="title">Filter</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Las flags <strong><code><a href="filter.constants.php#constant.filter-flag-scheme-required">FILTER_FLAG_SCHEME_REQUIRED</a></code></strong> y
     <strong><code><a href="filter.constants.php#constant.filter-flag-host-required">FILTER_FLAG_HOST_REQUIRED</a></code></strong> del filtro
     <strong><code><a href="filter.constants.php#constant.filter-validate-url">FILTER_VALIDATE_URL</a></code></strong> han sido eliminadas. El <code class="literal">scheme</code>
     y el <code class="literal">host</code> son (y han sido) siempre requeridos.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las fuentes <strong><code><a href="filter.constants.php#constant.input-request">INPUT_REQUEST</a></code></strong> e <strong><code><a href="filter.constants.php#constant.input-session">INPUT_SESSION</a></code></strong> para
     <span class="function"><a href="function.filter-input.php" class="function">filter_input()</a></span> etc. han sido eliminadas. Nunca fueron implementadas y su
     uso siempre generaba una advertencia.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.gd">
  <h3 class="title">GD</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     La función obsoleta <span class="function"><a href="function.image2wbmp.php" class="function">image2wbmp()</a></span> ha sido eliminada.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las funciones obsoletas <span class="function"><a href="function.png2wbmp.php" class="function">png2wbmp()</a></span> y <span class="function"><a href="function.jpeg2wbmp.php" class="function">jpeg2wbmp()</a></span> han
     sido eliminadas.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El parámetro <code class="parameter">mode</code> predeterminado de <span class="function"><a href="function.imagecropauto.php" class="function">imagecropauto()</a></span> ya no
     acepta <code class="literal">-1</code>. Debe usarse <strong><code><a href="image.constants.php#constant.img-crop-default">IMG_CROP_DEFAULT</a></code></strong> en su lugar.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     En Windows, <var class="filename">php_gd2.dll</var> ha sido renombrado a <var class="filename">php_gd.dll</var>.
    </p>
   </li>
  </ul>
 </div>

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

  <p class="para">
   <span class="function"><a href="function.gmp-random.php" class="function">gmp_random()</a></span> ha sido eliminada. Debe usarse
   <span class="function"><a href="function.gmp-random-range.php" class="function">gmp_random_range()</a></span> o <span class="function"><a href="function.gmp-random-bits.php" class="function">gmp_random_bits()</a></span> en su lugar.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.iconv">
  <h3 class="title">Iconv</h3>

  <p class="para">
   Las implementaciones de iconv que no establecen correctamente <var class="varname">errno</var> en caso de errores
   ya no son soportadas.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.imap">
  <h3 class="title">IMAP</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     El argumento no utilizado <code class="parameter">default_host</code> de <span class="function"><a href="function.imap-headerinfo.php" class="function">imap_headerinfo()</a></span>
     ha sido eliminado.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     La función <span class="function"><a href="function.imap-header.php" class="function">imap_header()</a></span>, que es un alias de
     <span class="function"><a href="function.imap-headerinfo.php" class="function">imap_headerinfo()</a></span>, ha sido eliminada.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.intl">
  <h3 class="title">Funciones de internacionalización</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     La constante obsoleta <strong><code><a href="intl.constants.php#constant.intl-idna-variant-2003">INTL_IDNA_VARIANT_2003</a></code></strong> ha sido eliminada.
     
    </p>
   </li>
   <li class="listitem">
   <p class="para">
    La constante obsoleta <strong><code>Normalizer::NONE</code></strong> ha sido eliminada.
   </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.ldap">
  <h3 class="title">LDAP</h3>

  <ul class="itemizedlist">
   <li class="listitem">
   <p class="para">
    Las funciones obsoletas <span class="function"><a href="function.ldap-sort.php" class="function">ldap_sort()</a></span>,
    <span class="function"><a href="function.ldap-control-paged-result.php" class="function">ldap_control_paged_result()</a></span> y
    <span class="function"><a href="function.ldap-control-paged-result-response.php" class="function">ldap_control_paged_result_response()</a></span> han sido eliminadas.
   </p>
  </li>
  <li class="listitem">
   <p class="para">
    La interfaz de <span class="function"><a href="function.ldap-set-rebind-proc.php" class="function">ldap_set_rebind_proc()</a></span> ha cambiado; el parámetro
    <code class="parameter">callback</code> ya no acepta cadenas vacías; debe usarse <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>
    en su lugar.
   </p>
   </li>
  </ul>
 </div>

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

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     La directiva <a href="mbstring.configuration.php#ini.mbstring.func-overload" class="link">mbstring.func_overload</a> ha sido
     eliminada. Las constantes relacionadas <strong><code><a href="mbstring.constants.php#constant.mb-overload-mail">MB_OVERLOAD_MAIL</a></code></strong>,
     <strong><code><a href="mbstring.constants.php#constant.mb-overload-string">MB_OVERLOAD_STRING</a></code></strong> y <strong><code><a href="mbstring.constants.php#constant.mb-overload-regex">MB_OVERLOAD_REGEX</a></code></strong>
     también han sido eliminadas. Finalmente, las entradas <code class="literal">&quot;func_overload&quot;</code> y
     <code class="literal">&quot;func_overload_list&quot;</code> en <span class="function"><a href="function.mb-get-info.php" class="function">mb_get_info()</a></span> han sido
     eliminadas.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.mb-parse-str.php" class="function">mb_parse_str()</a></span> ya no puede usarse sin especificar un array de resultados.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Se han eliminado varios alias obsoletos de mbregex. Consulte la siguiente
     lista para saber qué funciones deben usarse en su lugar:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><span class="function"><strong>mbregex_encoding()</strong></span> → <span class="function"><a href="function.mb-regex-encoding.php" class="function">mb_regex_encoding()</a></span></li>
      <li><span class="function"><strong>mbereg()</strong></span> → <span class="function"><a href="function.mb-ereg.php" class="function">mb_ereg()</a></span></li>
      <li><span class="function"><strong>mberegi()</strong></span> → <span class="function"><a href="function.mb-eregi.php" class="function">mb_eregi()</a></span></li>
      <li><span class="function"><strong>mbereg_replace()</strong></span> → <span class="function"><a href="function.mb-ereg-replace.php" class="function">mb_ereg_replace()</a></span></li>
      <li><span class="function"><strong>mberegi_replace()</strong></span> → <span class="function"><a href="function.mb-eregi-replace.php" class="function">mb_eregi_replace()</a></span></li>
      <li><span class="function"><strong>mbsplit()</strong></span> → <span class="function"><a href="function.mb-split.php" class="function">mb_split()</a></span></li>
      <li><span class="function"><strong>mbereg_match()</strong></span> → <span class="function"><a href="function.mb-ereg-match.php" class="function">mb_ereg_match()</a></span></li>
      <li><span class="function"><strong>mbereg_search()</strong></span> → <span class="function"><a href="function.mb-ereg-search.php" class="function">mb_ereg_search()</a></span></li>
      <li><span class="function"><strong>mbereg_search_pos()</strong></span> → <span class="function"><a href="function.mb-ereg-search-pos.php" class="function">mb_ereg_search_pos()</a></span></li>
      <li><span class="function"><strong>mbereg_search_regs()</strong></span> → <span class="function"><a href="function.mb-ereg-search-regs.php" class="function">mb_ereg_search_regs()</a></span></li>
      <li><span class="function"><strong>mbereg_search_init()</strong></span> → <span class="function"><a href="function.mb-ereg-search-init.php" class="function">mb_ereg_search_init()</a></span></li>
      <li><span class="function"><strong>mbereg_search_getregs()</strong></span> → <span class="function"><a href="function.mb-ereg-search-getregs.php" class="function">mb_ereg_search_getregs()</a></span></li>
      <li><span class="function"><strong>mbereg_search_getpos()</strong></span> → <span class="function"><a href="function.mb-ereg-search-getpos.php" class="function">mb_ereg_search_getpos()</a></span></li>
      <li><span class="function"><strong>mbereg_search_setpos()</strong></span> → <span class="function"><a href="function.mb-ereg-search-setpos.php" class="function">mb_ereg_search_setpos()</a></span></li>
     </ul>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El modificador <code class="literal">e</code> para <span class="function"><a href="function.mb-ereg-replace.php" class="function">mb_ereg_replace()</a></span> ha sido eliminado.
     Debe usarse <span class="function"><a href="function.mb-ereg-replace-callback.php" class="function">mb_ereg_replace_callback()</a></span> en su lugar.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Un argumento de patrón que no sea una cadena para <span class="function"><a href="function.mb-ereg-replace.php" class="function">mb_ereg_replace()</a></span> ahora será interpretado como
     una cadena en lugar de un punto de código ASCII. El comportamiento anterior puede restaurarse con una llamada
     explícita a <span class="function"><a href="function.chr.php" class="function">chr()</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El argumento <code class="parameter">needle</code> para <span class="function"><a href="function.mb-strpos.php" class="function">mb_strpos()</a></span>,
     <span class="function"><a href="function.mb-strrpos.php" class="function">mb_strrpos()</a></span>, <span class="function"><a href="function.mb-stripos.php" class="function">mb_stripos()</a></span>,
     <span class="function"><a href="function.mb-strripos.php" class="function">mb_strripos()</a></span>, <span class="function"><a href="function.mb-strstr.php" class="function">mb_strstr()</a></span>,
     <span class="function"><a href="function.mb-stristr.php" class="function">mb_stristr()</a></span>, <span class="function"><a href="function.mb-strrchr.php" class="function">mb_strrchr()</a></span> y
     <span class="function"><a href="function.mb-strrichr.php" class="function">mb_strrichr()</a></span> ahora puede estar vacío.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El parámetro <code class="parameter">is_hex</code>, que no se utilizaba internamente, ha sido eliminado de
     <span class="function"><a href="function.mb-decode-numericentity.php" class="function">mb_decode_numericentity()</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El comportamiento heredado de pasar la codificación como tercer argumento en lugar de un desplazamiento para la
     función <span class="function"><a href="function.mb-strrpos.php" class="function">mb_strrpos()</a></span> ha sido eliminado; en su lugar, debe proporcionarse un desplazamiento
     explícito de <code class="literal">0</code> con la codificación como cuarto argumento.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Los alias de codificación de caracteres <code class="literal">ISO_8859-*</code> han sido reemplazados por
     los alias <code class="literal">ISO8859-*</code> para una mejor interoperabilidad con la extensión iconv. Los
     alias de mbregex ISO 8859 con guiones bajos (<code class="literal">ISO_8859_*</code> y
     <code class="literal">ISO8859_*</code>) también han sido eliminados.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.mb-ereg.php" class="function">mb_ereg()</a></span> y <span class="function"><a href="function.mb-eregi.php" class="function">mb_eregi()</a></span> ahora devolverán <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> booleano en
     una coincidencia exitosa. Anteriormente devolvían el entero <code class="literal">1</code> si no se pasaba
     <code class="parameter">matches</code>, o <code class="code">max(1, strlen($matches[0]))</code> si
     se pasaba <code class="parameter">matches</code>.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.oci8">
  <h3 class="title">OCI8</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     La clase <span class="classname"><strong class="classname">OCI-Lob</strong></span> ahora se llama <span class="classname"><a href="class.ocilob.php" class="classname">OCILob</a></span>, y la
     clase <span class="classname"><strong class="classname">OCI-Collection</strong></span> ahora se llama <span class="classname"><a href="class.ocicollection.php" class="classname">OCICollection</a></span>
     para el cumplimiento de nombres impuesto por las herramientas de anotación de tipos arginfo de PHP 8.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Varias funciones alias han sido marcadas como obsoletas.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.oci-internal-debug.php" class="function">oci_internal_debug()</a></span> y su alias <span class="function"><a href="function.ociinternaldebug.php" class="function">ociinternaldebug()</a></span> han
     sido eliminados.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.odbc">
  <h3 class="title">ODBC</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.odbc-connect.php" class="function">odbc_connect()</a></span> ya no reutiliza las conexiones.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El parámetro no utilizado <code class="parameter">flags</code> de <span class="function"><a href="function.odbc-exec.php" class="function">odbc_exec()</a></span> ha sido
     eliminado.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.openssl">
  <h3 class="title">OpenSSL</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.openssl-seal.php" class="function">openssl_seal()</a></span> y <span class="function"><a href="function.openssl-open.php" class="function">openssl_open()</a></span> ahora requieren
     que se pase el parámetro <code class="parameter">method</code>, ya que el valor predeterminado anterior de
     <code class="literal">&quot;RC4&quot;</code> se considera inseguro.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.pcre">
  <h3 class="title">Expresiones regulares (compatibles con Perl)</h3>

  <p class="para">
   Al pasar secuencias de escape no válidas, estas ya no se interpretan como literales. Este
   comportamiento requería anteriormente el modificador <code class="literal">X</code>, que ahora se ignora.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.pdo">
  <h3 class="title">PHP Data Objects</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     El modo de gestión de errores predeterminado ha sido cambiado de &quot;silent&quot; a &quot;exceptions&quot;. Consulte
     <a href="pdo.error-handling.php" class="link">Errores y gestión de errores</a> para más detalles.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las firmas de algunos métodos de PDO han cambiado:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">PDO::query(string $query, ?int $fetchMode  = null, mixed  ...$fetchModeArgs)</code></li>
      <li><code class="code">PDOStatement::setFetchMode(int $mode, mixed ...$args)</code></li>
     </ul>
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.pdo-odbc">
  <h3 class="title">PDO ODBC</h3>

  <p class="para">
   La directiva <var class="filename">php.ini</var>
   <a href="ref.pdo-odbc.php#ini.pdo-odbc.db2-instance-name" class="link">pdo_odbc.db2_instance_name</a> ha sido
   eliminada.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.pdo-mysql">
  <h3 class="title">PDO MySQL</h3>

  <p class="para">
   <span class="methodname"><a href="pdo.intransaction.php" class="methodname">PDO::inTransaction()</a></span> ahora informa del estado real de la transacción
   de la conexión, en lugar de una aproximación mantenida por PDO. Si se ejecuta una consulta
   sujeta a &quot;implicit commit&quot;, <span class="methodname"><a href="pdo.intransaction.php" class="methodname">PDO::inTransaction()</a></span> devolverá
   posteriormente <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>, ya que la transacción ya no está activa.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.pgsql">
  <h3 class="title">PostgreSQL</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     La sintaxis obsoleta de <span class="function"><a href="function.pg-connect.php" class="function">pg_connect()</a></span> que utiliza múltiples parámetros en lugar
     de una cadena de conexión ya no es compatible.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     La firma obsoleta de <span class="function"><a href="function.pg-lo-import.php" class="function">pg_lo_import()</a></span> y <span class="function"><a href="function.pg-lo-export.php" class="function">pg_lo_export()</a></span>
     que pasa la conexión como último argumento ya no es compatible. La conexión debe
     pasarse como primer argumento.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.pg-fetch-all.php" class="function">pg_fetch_all()</a></span> ahora devuelve un array vacío en lugar de <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> para
     conjuntos de resultados con cero filas.
    </p>
   </li>
  </ul>
 </div>

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

  <p class="para">
   Los metadatos asociados a un phar ya no se deserializan automáticamente, para corregir
   posibles vulnerabilidades de seguridad debidas a la instanciación de objetos, la carga
   automática, etc.
   
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.reflection">
  <h3 class="title">Reflection</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Las firmas de los métodos
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">ReflectionClass::newInstance($args)</code></li>
      <li><code class="code">ReflectionFunction::invoke($args)</code></li>
      <li><code class="code">ReflectionMethod::invoke($object, $args)</code></li>
     </ul>
    </p>
    <p class="para">
     han sido cambiadas a:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">ReflectionClass::newInstance(...$args)</code></li>
      <li><code class="code">ReflectionFunction::invoke(...$args)</code></li>
      <li><code class="code">ReflectionMethod::invoke($object, ...$args)</code></li>
     </ul>
    </p>
    <p class="para">
     El código que debe ser compatible tanto con PHP 7 como con PHP 8 puede utilizar las
     siguientes firmas para ser compatible con ambas versiones:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">ReflectionClass::newInstance($arg = null, ...$args)</code></li>
      <li><code class="code">ReflectionFunction::invoke($arg = null, ...$args)</code></li>
      <li><code class="code">ReflectionMethod::invoke($object, $arg = null, ...$args)</code></li>
     </ul>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El método <span class="methodname"><a href="reflectiontype.tostring.php" class="methodname">ReflectionType::__toString()</a></span> ahora devuelve una representación
     completa de depuración del tipo y ya no está obsoleto. En particular, el resultado incluirá un
     indicador de nulabilidad para los tipos anulables. El formato del valor de retorno no es estable
     y puede cambiar entre versiones de PHP.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Los métodos export() de Reflection han sido eliminados.
     En su lugar, los objetos de reflexión pueden ser convertidos a string.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="reflectionmethod.isconstructor.php" class="methodname">ReflectionMethod::isConstructor()</a></span> y
     <span class="methodname"><a href="reflectionmethod.isdestructor.php" class="methodname">ReflectionMethod::isDestructor()</a></span> ahora también devuelven <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> para
     los métodos <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> y
     <a href="language.oop5.decon.php#object.destruct" class="link">__destruct()</a> de las interfaces.
     Anteriormente, esto solo era cierto para los métodos de clases y traits.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El método <span class="methodname"><strong>ReflectionType::isBuiltin()</strong></span> ha sido movido a
     <span class="classname"><a href="class.reflectionnamedtype.php" class="classname">ReflectionNamedType</a></span>. <span class="classname"><a href="class.reflectionuniontype.php" class="classname">ReflectionUnionType</a></span> no
     lo tiene.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.sockets">
  <h3 class="title">Sockets</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Las constantes obsoletas <strong><code>AI_IDN_ALLOW_UNASSIGNED</code></strong> y
     <strong><code>AI_IDN_USE_STD3_ASCII_RULES</code></strong> del parámetro <code class="parameter">flags</code> de
     <span class="function"><a href="function.socket-addrinfo-lookup.php" class="function">socket_addrinfo_lookup()</a></span> han sido eliminadas.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.spl">
  <h3 class="title">Standard PHP Library (SPL)</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="splfileobject.fgetss.php" class="methodname">SplFileObject::fgetss()</a></span> ha sido eliminado.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="splfileobject.seek.php" class="methodname">SplFileObject::seek()</a></span> ahora siempre se posiciona al inicio de la línea.
     Anteriormente, las posiciones <code class="literal">=1</code> se posicionaban al inicio de la línea siguiente.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="splheap.compare.php" class="methodname">SplHeap::compare()</a></span> ahora especifica una firma de método. Las clases
     herederas que implementen este método deben utilizar una firma de método compatible.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="spldoublylinkedlist.push.php" class="methodname">SplDoublyLinkedList::push()</a></span>,
     <span class="methodname"><a href="spldoublylinkedlist.unshift.php" class="methodname">SplDoublyLinkedList::unshift()</a></span> y
     <span class="methodname"><a href="splqueue.enqueue.php" class="methodname">SplQueue::enqueue()</a></span> ahora devuelven <span class="type"><span class="type"><a href="language.types.void.php" class="type void">void</a></span></span> en lugar de <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.spl-autoload-register.php" class="function">spl_autoload_register()</a></span> ahora siempre lanza un
     <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> con argumentos no válidos, por lo que el segundo argumento
     <code class="parameter">do_throw</code> se ignora y se emitirá un aviso si se establece a <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="classname"><a href="class.splfixedarray.php" class="classname">SplFixedArray</a></span> ahora es un <span class="interfacename"><a href="class.iteratoraggregate.php" class="interfacename">IteratorAggregate</a></span>
     y no un <span class="interfacename"><a href="class.iterator.php" class="interfacename">Iterator</a></span>.
     <span class="methodname"><a href="splfixedarray.rewind.php" class="methodname">SplFixedArray::rewind()</a></span>, <span class="methodname"><a href="splfixedarray.current.php" class="methodname">SplFixedArray::current()</a></span>,
     <span class="methodname"><a href="splfixedarray.key.php" class="methodname">SplFixedArray::key()</a></span>, <span class="methodname"><a href="splfixedarray.next.php" class="methodname">SplFixedArray::next()</a></span> y
     <span class="methodname"><a href="splfixedarray.valid.php" class="methodname">SplFixedArray::valid()</a></span> han sido eliminados. En su lugar,
     se ha añadido <span class="methodname"><a href="splfixedarray.getiterator.php" class="methodname">SplFixedArray::getIterator()</a></span>. Todo código que utilice
     iteración explícita sobre SplFixedArray debe obtener ahora un
     <span class="interfacename"><a href="class.iterator.php" class="interfacename">Iterator</a></span> a través de
     <span class="methodname"><a href="splfixedarray.getiterator.php" class="methodname">SplFixedArray::getIterator()</a></span>. Esto significa que
     <span class="classname"><a href="class.splfixedarray.php" class="classname">SplFixedArray</a></span> ahora es seguro de usar en bucles anidados.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.standard">
  <h3 class="title">Biblioteca estándar</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.assert.php" class="function">assert()</a></span> ya no evaluará argumentos de tipo string, en su lugar se
     tratarán como cualquier otro argumento. Se debe usar <code class="code">assert($a == $b)</code> en lugar de
     <code class="code">assert(&#039;$a == $b&#039;)</code>. La directiva ini <a href="info.configuration.php#ini.assert.quiet-eval" class="link">assert.quiet_eval</a> y la constante
     <strong><code><a href="info.constants.php#constant.assert-quiet-eval">ASSERT_QUIET_EVAL</a></code></strong> también han sido eliminadas, ya que no tendrían
     ningún efecto.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.parse-str.php" class="function">parse_str()</a></span> ya no puede utilizarse sin especificar un array de resultados.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El filtro <a href="filters.string.php#filters.string.strip_tags" class="link">string.strip_tags</a> ha sido eliminado.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El argumento <code class="parameter">needle</code> de <span class="function"><a href="function.strpos.php" class="function">strpos()</a></span>,
     <span class="function"><a href="function.strrpos.php" class="function">strrpos()</a></span>, <span class="function"><a href="function.stripos.php" class="function">stripos()</a></span>, <span class="function"><a href="function.strripos.php" class="function">strripos()</a></span>,
     <span class="function"><a href="function.strstr.php" class="function">strstr()</a></span>, <span class="function"><a href="function.strchr.php" class="function">strchr()</a></span>, <span class="function"><a href="function.strrchr.php" class="function">strrchr()</a></span> y
     <span class="function"><a href="function.stristr.php" class="function">stristr()</a></span> ahora siempre se interpretará como un string. Anteriormente, los
     needle que no eran string se interpretaban como un punto de código ASCII. Se puede usar una
     llamada explícita a <span class="function"><a href="function.chr.php" class="function">chr()</a></span> para restaurar el comportamiento anterior.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El argumento <code class="parameter">needle</code> de <span class="function"><a href="function.strpos.php" class="function">strpos()</a></span>,
     <span class="function"><a href="function.strrpos.php" class="function">strrpos()</a></span>, <span class="function"><a href="function.stripos.php" class="function">stripos()</a></span>, <span class="function"><a href="function.strripos.php" class="function">strripos()</a></span>,
     <span class="function"><a href="function.strstr.php" class="function">strstr()</a></span>, <span class="function"><a href="function.stristr.php" class="function">stristr()</a></span> y <span class="function"><a href="function.strrchr.php" class="function">strrchr()</a></span> ahora
     puede estar vacío.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El argumento <code class="parameter">length</code> de <span class="function"><a href="function.substr.php" class="function">substr()</a></span>,
     <span class="function"><a href="function.substr-count.php" class="function">substr_count()</a></span>, <span class="function"><a href="function.substr-compare.php" class="function">substr_compare()</a></span> y
     <span class="function"><a href="function.iconv-substr.php" class="function">iconv_substr()</a></span> ahora puede ser <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>. Los valores <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> se comportarán
     como si no se hubiera proporcionado el argumento de longitud y, por lo tanto, devolverán el
     resto del string en lugar de un string vacío.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El argumento <code class="parameter">length</code> de <span class="function"><a href="function.array-splice.php" class="function">array_splice()</a></span> ahora puede ser
     <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>. Los valores <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> se comportarán de forma idéntica a omitir el argumento, eliminando
     así todo desde el <code class="parameter">offset</code> hasta el final del array.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El argumento <code class="parameter">args</code> de <span class="function"><a href="function.vsprintf.php" class="function">vsprintf()</a></span>,
     <span class="function"><a href="function.vfprintf.php" class="function">vfprintf()</a></span> y <span class="function"><a href="function.vprintf.php" class="function">vprintf()</a></span> ahora debe ser un array.
     Anteriormente se aceptaba cualquier tipo.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     La opción <code class="literal">&#039;salt&#039;</code> de <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> ya no es
     compatible. Si se usa la opción <code class="literal">&#039;salt&#039;</code>, se genera una advertencia, la sal
     proporcionada se ignora y se usa una sal generada automáticamente.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     La función <span class="function"><a href="function.quotemeta.php" class="function">quotemeta()</a></span> ahora devuelve un string vacío si se le pasa un
     string vacío. Anteriormente se devolvía <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las siguientes funciones han sido eliminadas:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><span class="function"><a href="function.hebrevc.php" class="function">hebrevc()</a></span></li>
      <li><span class="function"><a href="function.convert-cyr-string.php" class="function">convert_cyr_string()</a></span></li>
      <li><span class="function"><a href="function.money-format.php" class="function">money_format()</a></span></li>
      <li><span class="function"><a href="function.ezmlm-hash.php" class="function">ezmlm_hash()</a></span></li>
      <li><span class="function"><a href="function.restore-include-path.php" class="function">restore_include_path()</a></span></li>
      <li><span class="function"><a href="function.get-magic-quotes-gpc.php" class="function">get_magic_quotes_gpc()</a></span></li>
      <li><span class="function"><a href="function.get-magic-quotes-runtime.php" class="function">get_magic_quotes_runtime()</a></span></li>
      <li><span class="function"><a href="function.fgetss.php" class="function">fgetss()</a></span></li>
     </ul>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <strong><code><a href="filter.constants.php#constant.filter-sanitize-magic-quotes">FILTER_SANITIZE_MAGIC_QUOTES</a></code></strong> ha sido eliminada.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Llamar a <span class="function"><a href="function.implode.php" class="function">implode()</a></span> con los parámetros en orden inverso <code class="code">($pieces,
     $glue)</code> ya no es compatible.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.parse-url.php" class="function">parse_url()</a></span> ahora distingue las consultas y fragmentos ausentes de los vacíos:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">http://example.com/foo → query = null, fragment = null</code></li>
      <li><code class="code">http://example.com/foo? → query = &quot;&quot;,   fragment = null</code></li>
      <li><code class="code">http://example.com/foo# → query = null, fragment = &quot;&quot;</code></li>
      <li><code class="code">http://example.com/foo?# → query = &quot;&quot;,   fragment = &quot;&quot;</code></li>
     </ul>
      Anteriormente, en todos los casos, query y fragment eran <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.var-dump.php" class="function">var_dump()</a></span> y <span class="function"><a href="function.debug-zval-dump.php" class="function">debug_zval_dump()</a></span> ahora muestran los
     números de punto flotante utilizando <a href="ini.core.php#ini.serialize-precision" class="link">serialize_precision</a>
     en lugar de <a href="ini.core.php#ini.precision" class="link">precision</a>. En una configuración predeterminada,
     esto significa que los números de punto flotante ahora se muestran con total precisión por estas
     funciones de depuración.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Si el array devuelto por <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a> contiene propiedades
     inexistentes, estas ahora se ignoran silenciosamente. Anteriormente, tales propiedades se habrían
     serializado como si tuvieran el valor <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     La configuración regional predeterminada al inicio ahora es siempre <code class="literal">&quot;C&quot;</code>.
     Ninguna configuración regional se hereda del entorno de forma predeterminada. Anteriormente,
     <strong><code><a href="string.constants.php#constant.lc-all">LC_ALL</a></code></strong> se establecía en <code class="literal">&quot;C&quot;</code>, mientras que
     <strong><code><a href="string.constants.php#constant.lc-ctype">LC_CTYPE</a></code></strong> se heredaba del entorno. Sin embargo, algunas funciones no
     respetaban la configuración regional heredada sin una llamada explícita a
     <span class="function"><a href="function.setlocale.php" class="function">setlocale()</a></span>. Ahora siempre se requiere una llamada explícita a
     <span class="function"><a href="function.setlocale.php" class="function">setlocale()</a></span> si se desea cambiar un componente de la configuración regional
     respecto al valor predeterminado.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El respaldo obsoleto DES en <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> ha sido eliminado. Si se pasa un formato
     de sal desconocido a <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span>, la función fallará con <code class="literal">*0</code>
     en lugar de recurrir a un hash DES débil.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Especificar rondas fuera de rango para SHA256/SHA512 en <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> ahora
     fallará con <code class="literal">*0</code> en lugar de ajustar al límite más cercano. Esto coincide
     con el comportamiento de glibc.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El resultado de las funciones de ordenación puede haber cambiado si el array contiene
     elementos que se comparan como iguales.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Cualquier función que acepte callbacks que no estén especificados explícitamente para aceptar
     parámetros por referencia ahora emitirá una advertencia si se usa un callback con parámetros
     por referencia. Los ejemplos incluyen <span class="function"><a href="function.array-filter.php" class="function">array_filter()</a></span> y
     <span class="function"><a href="function.array-reduce.php" class="function">array_reduce()</a></span>. Este ya era el caso para la mayoría, pero no todas, las
     funciones anteriormente.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     El envolvente de flujo HTTP, tal como lo usan funciones como <span class="function"><a href="function.file-get-contents.php" class="function">file_get_contents()</a></span>,
     ahora anuncia HTTP/1.1 en lugar de HTTP/1.0 de forma predeterminada. Esto no cambia el
     comportamiento del cliente, pero puede hacer que los servidores respondan de manera diferente.
     Para mantener el comportamiento anterior, se debe establecer la opción de contexto de flujo
     <code class="literal">&#039;protocol_version&#039;</code>, p. ej.
    </p>
    <p class="para">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$ctx </span><span style="color: #007700">= </span><span style="color: #0000BB">stream_context_create</span><span style="color: #007700">([</span><span style="color: #DD0000">'http' </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">'protocol_version' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'1.0'</span><span style="color: #007700">]]);<br />echo </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'http://example.org'</span><span style="color: #007700">, </span><span style="color: #0000BB">false</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Llamar a <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> sin una sal explícita ya no es compatible. Para producir
     un hash fuerte con una sal generada automáticamente, se debe usar
     <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> en su lugar.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
    <span class="function"><a href="function.substr.php" class="function">substr()</a></span>, <span class="function"><a href="function.mb-substr.php" class="function">mb_substr()</a></span>, <span class="function"><a href="function.iconv-substr.php" class="function">iconv_substr()</a></span> y
    <span class="function"><a href="function.grapheme-substr.php" class="function">grapheme_substr()</a></span> ahora ajustan de manera consistente los desplazamientos
    fuera de los límites al límite del string. Anteriormente, se devolvía <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> en lugar del
    string vacío en algunos casos.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     En Windows, las funciones de ejecución de programas (<span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span>,
     <span class="function"><a href="function.exec.php" class="function">exec()</a></span>, <span class="function"><a href="function.popen.php" class="function">popen()</a></span>, etc.) que usan el shell, ahora ejecutan
     de manera consistente <strong class="command">%comspec% /s /c &quot;$commandline&quot;</strong>, lo que tiene el mismo
     efecto que ejecutar <strong class="command">$commandline</strong> (sin comillas adicionales).
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.sysvsem">
  <h3 class="title">Sysvsem</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     El parámetro <code class="parameter">auto_release</code> de <span class="function"><a href="function.sem-get.php" class="function">sem_get()</a></span> ha sido
     modificado para aceptar valores bool en lugar de int.
    </p>
   </li>
  </ul>
 </div>

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

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     El parámetro <code class="parameter">use_include_path</code>, que no se usaba internamente, ha sido
     eliminado de <span class="function"><a href="tidy.repairstring.php" class="function">tidy_repair_string()</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="tidy.repairstring.php" class="methodname">tidy::repairString()</a></span> y <span class="methodname"><a href="tidy.repairfile.php" class="methodname">tidy::repairFile()</a></span> se han
     convertido en métodos estáticos.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.tokenizer">
  <h3 class="title">Tokenizer</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Los tokens <strong><code><a href="tokens.php#constant.t-comment">T_COMMENT</a></code></strong> ya no incluirán un salto de línea al final. El salto
     de línea será parte del siguiente token <strong><code><a href="tokens.php#constant.t-whitespace">T_WHITESPACE</a></code></strong>. Cabe señalar que
     <strong><code><a href="tokens.php#constant.t-comment">T_COMMENT</a></code></strong> no siempre va seguido de un espacio en blanco, también puede ir
     seguido de <strong><code><a href="tokens.php#constant.t-close-tag">T_CLOSE_TAG</a></code></strong> o del final del archivo.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Los nombres con espacio de nombres ahora se representan utilizando los tokens
     <strong><code><a href="tokens.php#constant.t-name-qualified">T_NAME_QUALIFIED</a></code></strong> (<code class="code">Foo\Bar</code>),
     <strong><code><a href="tokens.php#constant.t-name-fully-qualified">T_NAME_FULLY_QUALIFIED</a></code></strong> (<code class="code">\Foo\Bar</code>) y
     <strong><code><a href="tokens.php#constant.t-name-relative">T_NAME_RELATIVE</a></code></strong> (<code class="code">namespace\Foo\Bar</code>).
     <strong><code><a href="tokens.php#constant.t-ns-separator">T_NS_SEPARATOR</a></code></strong> solo se usa para separadores de espacio de nombres
     independientes, y solo es sintácticamente válido en conjunto con declaraciones de uso de grupo.
     
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.xmlreader">
  <h3 class="title">XMLReader</h3>

  <p class="para">
   <span class="methodname"><a href="xmlreader.open.php" class="methodname">XMLReader::open()</a></span> y <span class="methodname"><a href="xmlreader.xml.php" class="methodname">XMLReader::xml()</a></span> ahora son
   métodos estáticos. Todavía pueden llamarse como métodos de instancia, pero las clases herederas
   deben declararlos como estáticos si sobrescriben estos métodos.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.xmlrpc">
  <h3 class="title">XML-RPC</h3>

  <p class="para">
   La extensión XML-RPC ha sido movida a PECL y ya no forma parte de la distribución
   de PHP.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.zip">
  <h3 class="title">Zip</h3>

  <p class="para">
   <strong><code>ZipArchive::OPSYS_Z_CPM</code></strong> ha sido eliminada (el nombre era un error
   tipográfico). Se debe usar <strong><code><a href="zip.constants.php#ziparchive.constants.opsys-cpm">ZipArchive::OPSYS_CPM</a></code></strong> en su lugar.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.zlib">
  <h3 class="title">Zlib</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.gzgetss.php" class="function">gzgetss()</a></span> ha sido eliminada.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <a href="zlib.configuration.php#ini.zlib.output-compression" class="link">zlib.output_compression</a> ya no se
     desactiva automáticamente para <code class="literal">Content-Type: image/*</code>.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.php-test-packs">
  <h3 class="title">Paquetes de pruebas de PHP para Windows</h3>

  <p class="para">
   El ejecutor de pruebas ha sido renombrado de <var class="filename">run-test.php</var> a
   <var class="filename">run-tests.php</var>, para coincidir con su nombre en php-src.
  </p>
 </div>
</div><?php manual_footer($setup); ?>