<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration81.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'migration81.incompatible.php',
    1 => 'Cambios incompatibles con versiones anteriores',
    2 => 'Cambios incompatibles con versiones anteriores',
  ),
  'up' => 
  array (
    0 => 'migration81.php',
    1 => 'Migraci&oacute;n de PHP 8.0.x a PHP 8.1.x',
  ),
  'prev' => 
  array (
    0 => 'migration81.constants.php',
    1 => 'Nuevas Constantes Globales',
  ),
  'next' => 
  array (
    0 => 'migration81.deprecated.php',
    1 => 'Funcionalidades obsoletas',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'appendices/migration81/incompatible.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

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

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

  <div class="sect3" id="migration81.incompatible.core.globals-access">
   <h4 class="title">Restricciones de acceso a $GLOBALS</h4>

   <p class="para">
    El acceso al array <var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var> está ahora sujeto a
    un cierto número de restricciones.
    El acceso en lectura y en escritura a los elementos individuales del array como
    <code class="code">$GLOBALS[&#039;var&#039;]</code> continúa funcionando como tal.
    El acceso en lectura al array completo <var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var> continúa
    también siendo soportado.
    Sin embargo, el acceso en escritura al array completo <var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var>
    ya no es soportado. Por ejemplo, <code class="code">array_pop($GLOBALS)</code>
    generará un error.
   </p>
  </div>

  <div class="sect3" id="migration81.incompatible.core.static-variable-inheritance">
   <h4 class="title">
    Uso de variables <span class="modifier">static</span> en los métodos heredados.
   </h4>

   <p class="para">
    Cuando un método que utiliza variables static es heredado
    (pero no sobrescrito), el método heredado compartirá ahora las variables.
    <div class="informalexample">
     <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">A </span><span style="color: #007700">{<br />    public static function </span><span style="color: #0000BB">counter</span><span style="color: #007700">() {<br />        static </span><span style="color: #0000BB">$counter </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$counter</span><span style="color: #007700">++;<br />        return </span><span style="color: #0000BB">$counter</span><span style="color: #007700">;<br />    }<br />}<br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A </span><span style="color: #007700">{}<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">counter</span><span style="color: #007700">()); </span><span style="color: #FF8000">// int(1)<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">counter</span><span style="color: #007700">()); </span><span style="color: #FF8000">// int(2)<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">counter</span><span style="color: #007700">()); </span><span style="color: #FF8000">// int(3), anteriormente int(1)<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">counter</span><span style="color: #007700">()); </span><span style="color: #FF8000">// int(4), anteriormente int(2)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    Esto significa que las variables estáticas en los métodos se comportan ahora
    de la misma manera que las propiedades estáticas.
   </p>
  </div>

  <div class="sect3" id="migration81.incompatible.core.optional-before-required">
   <h4 class="title">Parámetros opcionales especificados antes de los parámetros requeridos</h4>

   <p class="para">
    Un <a href="functions.arguments.php#functions.arguments.default" class="link">parámetro opcional</a>
    especificado antes de los parámetros requeridos es ahora siempre tratado como requerido,
    incluso cuando se llama utilizando
    <a href="functions.arguments.php#functions.named-arguments" class="link">los argumentos nombrados</a>.
    A partir de PHP 8.0.0, pero antes de PHP 8.1.0, el código a continuación emite una nota de deprecación
    en la definición, pero se ejecuta con éxito cuando se llama. A partir de PHP 8.1.0, se lanza un error
    de la clase <span class="classname"><a href="class.argumentcounterror.php" class="classname">ArgumentCountError</a></span>, como sería el caso cuando
    se llama con argumentos posicionales.

    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">makeyogurt</span><span style="color: #007700">(</span><span style="color: #0000BB">$container </span><span style="color: #007700">= </span><span style="color: #DD0000">"bowl"</span><span style="color: #007700">, </span><span style="color: #0000BB">$flavour</span><span style="color: #007700">)<br />{<br />    return </span><span style="color: #DD0000">"Making a </span><span style="color: #0000BB">$container</span><span style="color: #DD0000"> of </span><span style="color: #0000BB">$flavour</span><span style="color: #DD0000"> yogurt.\n"</span><span style="color: #007700">;<br />}<br />try<br />{<br />    echo </span><span style="color: #0000BB">makeyogurt</span><span style="color: #007700">(</span><span style="color: #0000BB">flavour</span><span style="color: #007700">: </span><span style="color: #DD0000">"raspberry"</span><span style="color: #007700">);<br />}<br />catch (</span><span style="color: #0000BB">Error $e</span><span style="color: #007700">)<br />{<br />    echo </span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$e</span><span style="color: #007700">), </span><span style="color: #DD0000">' - '</span><span style="color: #007700">, </span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">(), </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <p class="para">Resultado del ejemplo anterior en PHP 8.0:</p>
     <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Required parameter $flavour follows optional parameter $container
 in example.php on line 3
Making a bowl of raspberry yogurt.
</pre></div>
     </div>
     <p class="para">Resultado del ejemplo anterior en PHP 8.1:</p>
     <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Optional parameter $container declared before required parameter
 $flavour is implicitly treated as a required parameter in example.php on line 3
ArgumentCountError - makeyogurt(): Argument #1 ($container) not passed
</pre></div>
     </div>
    </div>
   </p>
   <p class="para">
    Tenga en cuenta que un valor por defecto de <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> puede ser utilizado antes de los parámetros requeridos para
    especificar un <a href="language.types.declarations.php#language.types.declarations.nullable" class="link">tipo nullable</a>,
    pero el parámetro será siempre requerido.
   </p>
  </div>

  <div class="sect3" id="migration81.incompatible.core.type-compatibility-internal">
   <h4 class="title">Compatibilidad de tipos de retorno con clases internas</h4>

   <p class="para">
    La mayoría de los métodos internos no finales requieren ahora que los métodos de sobrecarga declaren
    un tipo de retorno compatible, de lo contrario se emite una nota de deprecación al validar la herencia.
    En el caso en que el tipo de retorno no pueda ser declarado para un método de sobrecarga debido a
    preocupaciones de compatibilidad inter-versión de PHP,
    un atributo <span class="classname"><a href="class.returntypewillchange.php" class="classname">ReturnTypeWillChange</a></span> puede ser añadido para suprimir la nota de deprecación.
   </p>
  </div>

  <div class="sect3" id="migration81.incompatible.core.new-keywords">
   <h4 class="title">Nuevas palabras clave</h4>
   <p class="para">
    <code class="literal">readonly</code> es ahora una palabra clave. Sin embargo, aún puede ser utilizada
    como nombre de función.
   </p>
   <p class="para">
    <code class="literal">never</code> es ahora una palabra reservada, por lo que no puede ser utilizada para nombrar una clase,
    una interfaz o un trait, y también está prohibido su uso en los namespaces.
   </p>
  </div>
 </div>

 <div class="sect2" id="migration81.incompatible.resource2object">
  <h3 class="title">Migración de recurso a objeto</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 verificaciones de valor de retorno utilizando <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> deben ser reemplazadas por verificaciones de <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Las funciones <a href="book.fileinfo.php" class="link">FileInfo</a> aceptan y devuelven ahora
     objetos <span class="classname"><a href="class.finfo.php" class="classname">finfo</a></span> en lugar
     de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">fileinfo</code>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las funciones <a href="book.ftp.php" class="link">FTP</a> aceptan y devuelven ahora
     objetos <span class="classname"><a href="class.ftp-connection.php" class="classname">FTP\Connection</a></span> en lugar
     de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">ftp</code>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las funciones <a href="book.imap.php" class="link">IMAP</a> aceptan y devuelven ahora
     objetos <span class="classname"><a href="class.imap-connection.php" class="classname">IMAP\Connection</a></span> en lugar
     de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">imap</code>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las funciones <a href="book.ldap.php" class="link">LDAP</a> aceptan y devuelven ahora
     objetos <span class="classname"><a href="class.ldap-connection.php" class="classname">LDAP\Connection</a></span> en lugar
     de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">ldap</code>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las funciones <a href="book.ldap.php" class="link">LDAP</a> aceptan y devuelven ahora
     objetos <span class="classname"><a href="class.ldap-result.php" class="classname">LDAP\Result</a></span> en lugar
     de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">ldap result</code>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las funciones <a href="book.ldap.php" class="link">LDAP</a> aceptan y devuelven ahora
     objetos <span class="classname"><a href="class.ldap-result-entry.php" class="classname">LDAP\ResultEntry</a></span> en lugar
     de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">ldap result entry</code>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las funciones <a href="book.pgsql.php" class="link">PgSQL</a> aceptan y devuelven ahora
     objetos <span class="classname"><a href="class.pgsql-connection.php" class="classname">PgSql\Connection</a></span> en lugar
     de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">pgsql link</code>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las funciones <a href="book.pgsql.php" class="link">PgSQL</a> aceptan y devuelven ahora
     objetos <span class="classname"><a href="class.pgsql-result.php" class="classname">PgSql\Result</a></span> en lugar
     de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">pgsql result</code>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las funciones <a href="book.pgsql.php" class="link">PgSQL</a> aceptan y devuelven ahora
     objetos <span class="classname"><a href="class.pgsql-lob.php" class="classname">PgSql\Lob</a></span> en lugar
     de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">pgsql large object</code>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las funciones <a href="book.pspell.php" class="link">PSpell</a> aceptan y devuelven ahora
     objetos <span class="classname"><a href="class.pspell-dictionary.php" class="classname">PSpell\Dictionary</a></span> en lugar
     de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">pspell</code>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las funciones <a href="book.pspell.php" class="link">PSpell</a> aceptan y devuelven ahora
     objetos <span class="classname"><a href="class.pspell-config.php" class="classname">PSpell\Config</a></span> en lugar
     de <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>s <code class="literal">pspell config</code>.
    </p>
   </li>
  </ul>
 </div>

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

  <p class="para">
   <span class="function"><a href="mysqli-result.fetch-fields.php" class="function">mysqli_fetch_fields()</a></span>, y
   <span class="function"><a href="mysqli-result.fetch-field-direct.php" class="function">mysqli_fetch_field_direct()</a></span> devolverán ahora
   <code class="literal">0</code> para la <span class="property">max_length</span>.
   Esta información puede ser calculada iterando sobre el conjunto de resultados,
   y tomando la longitud máxima. Esto es lo que PHP hacía
   anteriormente de manera interna.
  </p>

  <p class="para">
   La opción <strong><code><a href="mysqli.constants.php#constant.mysqli-stmt-attr-update-max-length">MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH</a></code></strong>
   ya no tiene ningún efecto.
  </p>

  <p class="para">
   La opción <strong><code><a href="mysqli.constants.php#constant.mysqli-store-result-copy-data">MYSQLI_STORE_RESULT_COPY_DATA</a></code></strong>
   ya no tiene ningún efecto. Pasar un valor al
   parámetro <code class="parameter">mode</code> de
   <span class="methodname"><a href="mysqli.store-result.php" class="methodname">mysqli::store_result()</a></span> ya no tiene ningún efecto.
  </p>

  <p class="para">
   <span class="methodname"><a href="mysqli.construct.php" class="methodname">mysqli::connect()</a></span> devuelve ahora <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> en lugar de <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> en caso de éxito.
  </p>

  <p class="para">
   El modo de manejo de errores por defecto ha sido cambiado de &quot;silencioso&quot; a &quot;excepciones&quot;.
   Ver la página <a href="mysqli-driver.report-mode.php" class="link">Modo de reporte MySQLi</a>
   para más detalles sobre lo que esto implica,
   y cómo definir explícitamente este atributo.
   Para restaurar el comportamiento anterior, utilice :
   <code class="code">mysqli_report(MYSQLI_REPORT_OFF);</code>
  </p>

  <p class="para">
   Las clases que extienden <span class="methodname"><a href="mysqli-stmt.execute.php" class="methodname">mysqli_stmt::execute()</a></span>
   deben ahora especificar el parámetro opcional adicional.
  </p>
 </div>

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

  <p class="para">
   La directiva INIT <a href="mysqlnd.config.php#ini.mysqlnd.fetch_data_copy" class="link">mysqlnd.fetch_data_copy</a>
   ha sido eliminada.
   Esto no debería resultar en cambios de comportamiento visibles para el usuario.
  </p>
 </div>

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

  <p class="para">
   Las claves privadas EC serán ahora exportadas en formato <abbr title="Public Key Cryptography Standards">PKCS</abbr>#8 en lugar
   del formato tradicional, al igual que todas las demás claves.
  </p>
  <p class="para">
   <span class="function"><a href="function.openssl-pkcs7-encrypt.php" class="function">openssl_pkcs7_encrypt()</a></span> y
   <span class="function"><a href="function.openssl-cms-encrypt.php" class="function">openssl_cms_encrypt()</a></span> utilizarán ahora por defecto
   AES-128-CBC en lugar de RC2-40. El cifrado RC2-40 es considerado
   como no seguro y no está habilitado por defecto por OpenSSL 3.
  </p>
 </div>

 <div class="sect2" id="migration81.incompatible.pdo">
  <h3 class="title">Objetos de datos PHP</h3>

  <p class="para">
   <strong><code><a href="pdo.constants.php#pdo.constants.attr-stringify-fetches">PDO::ATTR_STRINGIFY_FETCHES</a></code></strong> transforma ahora los valores
   de tipo <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> en <code class="literal">&quot;0&quot;</code> o
   <code class="literal">&quot;1&quot;</code>. Anteriormente, los <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> no eran transformados en cadenas.
  </p>
  <p class="para">
   Llamar a <span class="methodname"><a href="pdostatement.bindcolumn.php" class="methodname">PDOStatement::bindColumn()</a></span> con
   <strong><code><a href="pdo.constants.php#pdo.constants.param-lob">PDO::PARAM_LOB</a></code></strong> enlazará ahora constantemente un stream
   de resultado cuando <strong><code><a href="pdo.constants.php#pdo.constants.attr-stringify-fetches">PDO::ATTR_STRINGIFY_FETCHES</a></code></strong> no esté activado.
   Anteriormente, el resultado era o bien un stream o bien una cadena dependiendo del
   controlador de base de datos utilizado y del momento en que se realizaba el enlace.
  </p>

  <div class="sect3" id="migration81.incompatible.pdo.mysql">
   <h4 class="title">Controlador MySQL</h4>

   <p class="para">
    Los enteros y los flotantes en los conjuntos de resultados serán ahora devueltos utilizando
    los tipos nativos PHP en lugar de <span class="type"><a href="language.types.string.php" class="type string">string</a></span>s al utilizar las declaraciones preparadas emuladas.
    Esto corresponde al comportamiento de las declaraciones preparadas nativas.
    El comportamiento anterior puede ser restaurado activando la opción
    <strong><code><a href="pdo.constants.php#pdo.constants.attr-stringify-fetches">PDO::ATTR_STRINGIFY_FETCHES</a></code></strong>.
   </p>
  </div>

  <div class="sect3" id="migration81.incompatible.pdo.sqlite">
   <h4 class="title">Controlador SQLite</h4>

   <p class="para">
    Los enteros y los flotantes en los conjuntos de resultados serán ahora devueltos utilizando
    los tipos PHP.
    El comportamiento anterior puede ser restaurado activando la opción
    <strong><code><a href="pdo.constants.php#pdo.constants.attr-stringify-fetches">PDO::ATTR_STRINGIFY_FETCHES</a></code></strong>.
   </p>
  </div>
 </div>

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

  <p class="para">
   Para cumplir con la interfaz <span class="interfacename"><a href="class.arrayaccess.php" class="interfacename">ArrayAccess</a></span>,
   <span class="methodname"><a href="phar.offsetunset.php" class="methodname">Phar::offsetUnset()</a></span> y
   <span class="methodname"><a href="phardata.offsetunset.php" class="methodname">PharData::offsetUnset()</a></span> ya no devuelven un <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
  </p>
 </div>

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

  <p class="para">
   <span class="function"><a href="function.version-compare.php" class="function">version_compare()</a></span> ya no acepta las abreviaciones de operadores no documentadas.
  </p>

  <p class="para">
   <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span>,
   <span class="function"><a href="function.htmlentities.php" class="function">htmlentities()</a></span>,
   <span class="function"><a href="function.htmlspecialchars-decode.php" class="function">htmlspecialchars_decode()</a></span>,
   <span class="function"><a href="function.html-entity-decode.php" class="function">html_entity_decode()</a></span>,
   y <span class="function"><a href="function.get-html-translation-table.php" class="function">get_html_translation_table()</a></span>
   utilizan ahora <code class="literal">ENT_QUOTES | ENT_SUBSTITUTE</code> en lugar de
   <strong><code><a href="string.constants.php#constant.ent-compat">ENT_COMPAT</a></code></strong> por defecto.
   Esto significa que <code class="literal">&#039;</code> es escapado en
   <code class="literal">&amp;#039;</code> mientras que anteriormente no se hacía nada.
   Además, el UTF-8 mal formado será reemplazado por un carácter de sustitución Unicode,
   en lugar de resultar en una cadena vacía.
  </p>

  <p class="para">
   <span class="function"><a href="function.debug-zval-dump.php" class="function">debug_zval_dump()</a></span> muestra ahora el refcount de las referencias
   con su refcount, en lugar de simplemente anteponer
   <code class="literal">&amp;</code> al valor.
   Esto modela más precisamente la representación de referencia desde PHP 7.0.
  </p>

  <p class="para">
   <span class="function"><a href="function.debug-zval-dump.php" class="function">debug_zval_dump()</a></span> muestra ahora <code class="literal">interned</code>
   en lugar de un refcount ficticio para las cadenas internadas y los arrays inmutables.
  </p>
 </div>

 <div class="sect2" id="migration81.incompatible.spl">
  <h3 class="title">Biblioteca Estándar de PHP (Standard PHP Library o SPL)</h3>

  <p class="para">
   <span class="classname"><a href="class.splfixedarray.php" class="classname">SplFixedArray</a></span>, será ahora codificado en JSON como un <span class="type"><a href="language.types.array.php" class="type array">array</a></span>.
  </p>
 </div>

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