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

contributors($setup);

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

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

  <div class="sect3" id="migration74.incompatible.core.non-array-access">
   <h4 class="title">Acceso de tipo array a no-arrays</h4>

   <p class="para">
    Intentar utilizar valores de tipo <span class="type"><a href="language.types.null.php" class="type null">null</a></span>, <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>, <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>, <span class="type"><a href="language.types.float.php" class="type float">float</a></span> o <span class="type">recurso</span> como un array (como <code class="literal">$null[&quot;clave&quot;]</code>) generará ahora un aviso.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.get-declared-classes">
   <h4 class="title">Función <span class="function"><a href="function.get-declared-classes.php" class="function">get_declared_classes()</a></span></h4>

   <p class="para">
    La función <span class="function"><a href="function.get-declared-classes.php" class="function">get_declared_classes()</a></span> ya no devuelve las clases anónimas que no han sido instanciadas.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.fn">
   <h4 class="title">Palabra clave <code class="literal">fn</code></h4>

   <p class="para">
    <code class="literal">fn</code> es ahora una palabra clave reservada. En particular, ya no puede ser utilizada como una función o un nombre de clase.
    Puede seguir siendo utilizada como una método o un nombre de constante de clase.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.php-tag">
   <h4 class="title"><code class="literal">&lt;?php</code> etiqueta al final del fichero</h4>

   <p class="para">
    <code class="literal">&lt;?php</code> al final del fichero (sin nueva línea) será ahora interpretado como una etiqueta PHP de apertura. Anteriormente, era interpretado como una etiqueta corta de apertura seguida de una <code class="literal">php</code> literal y resultaba en un error de sintaxis
    (con <code class="literal">short_open_tag=1</code>) o era interpretado como una cadena <code class="literal">&lt;?php</code> (con <code class="literal">short_open_tag=0</code>).
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.stream-wrappers">
   <h4 class="title">Filtros de flujo</h4>

   <p class="para">
    Al utilizar include/require en un flujo, <span class="methodname"><a href="streamwrapper.stream-set-option.php" class="methodname">streamWrapper::stream_set_option()</a></span> será invocado con la opción <strong><code><a href="stream.constants.php#constant.stream-option-read-buffer">STREAM_OPTION_READ_BUFFER</a></code></strong>.
    Las implementaciones de filtros de flujo personalizados pueden necesitar implementar el método <span class="methodname"><a href="streamwrapper.stream-set-option.php" class="methodname">streamWrapper::stream_set_option()</a></span> para evitar un aviso (devolver siempre <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> es una implementación suficiente).
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.serialization">
   <h4 class="title">Serialización</h4>

   <p class="para">
    El formato <code class="literal">o</code> de serialización ha sido eliminado. Como nunca es producido por PHP, esto solo puede romper la deserialización de cadenas construidas manualmente.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.password-algorithm-constants">
   <h4 class="title">Constantes de algoritmo de contraseña</h4>

   <p class="para">
    Los identificadores de algoritmo de hash de contraseña son ahora cadenas nullables en lugar de enteros.
   </p>

   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-default">PASSWORD_DEFAULT</a></code></strong> era el entero 1; ahora es la cadena &#039;2y&#039; (en PHP 7.4.0, 7.4.1, y 7.4.2 era <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>)
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong> era el entero 1; ahora es &#039;2y&#039;
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-argon2i">PASSWORD_ARGON2I</a></code></strong> era el entero 2; ahora es &#039;argon2i&#039;
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-argon2id">PASSWORD_ARGON2ID</a></code></strong> era el entero 3; ahora es &#039;argon2id&#039;
     </span>
    </li>
   </ul>

   <p class="para">
    Las aplicaciones que utilizan correctamente las constantes PASSWORD_DEFAULT, PASSWORD_BCRYPT, PASSWORD_ARGON2I, y PASSWORD_ARGON2ID continuarán funcionando correctamente.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.htmlentities">
   <h4 class="title">Función <span class="function"><a href="function.htmlentities.php" class="function">htmlentities()</a></span></h4>

   <p class="para">
    <span class="function"><a href="function.htmlentities.php" class="function">htmlentities()</a></span> generará ahora un aviso (en lugar de un aviso de normas estrictas) si se utiliza con una codificación para la cual solo la sustitución de entidad básica es soportada, en cuyo caso es equivalente a <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span>.
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.fread-fwrite">
   <h4 class="title">Funciones <span class="function"><a href="function.fread.php" class="function">fread()</a></span> y <span class="function"><a href="function.fwrite.php" class="function">fwrite()</a></span></h4>

   <p class="para">
     <span class="function"><a href="function.fread.php" class="function">fread()</a></span> y <span class="function"><a href="function.fwrite.php" class="function">fwrite()</a></span> devolverán ahora <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> si la operación falla. Anteriormente, una cadena vacía o 0 era devuelta. EAGAIN/EWOULDBLOCK no son considerados como fallos.
   </p>
   <p class="para">
    Estas funciones también generan un aviso en caso de fallo, por ejemplo, cuando se intenta escribir en un recurso de fichero de solo lectura.
   </p>
  </div>

 </div>

 <div class="sect2" id="migration74.incompatible.bcmath">
  <h3 class="title">BCMath Arbitrary Precision Mathematics</h3>

  <p class="para">
   Las funciones BCMath advertirán ahora si se adopta un número mal formado, como <code class="literal">&quot;32foo&quot;</code>. El argumento será interpretado como cero, como antes.
  </p>
 </div>

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

  <p class="para">
   Intentar serializar una clase <span class="classname"><a href="class.curlfile.php" class="classname">CURLFile</a></span> generará ahora una excepción. Anteriormente, la excepción solo era lanzada en la deserialización.
  </p>
  <p class="para">
   El uso de <strong><code><a href="curl.constants.php#constant.curlpipe-http1">CURLPIPE-HTTP1</a></code></strong> está deprecado y ya no es soportado a partir de cURL 7.62.0.
  </p>
  <p class="para">
   El parámetro <code class="literal">$version</code> de <span class="function"><strong>curl_version ()</strong></span> está deprecado. Si un valor no es igual al valor por omisión <strong><code><a href="curl.constants.php#constant.curlversion-now">CURLVERSION_NOW</a></code></strong> es pasado, se genera un aviso y el parámetro es ignorado.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.datetime">
  <h3 class="title">Fecha y hora</h3>

  <p class="para">
   Llamar a <span class="function"><a href="function.var-dump.php" class="function">var_dump()</a></span> o similar en una instancia de <span class="classname"><a href="class.datetime.php" class="classname">DateTime</a></span> o <span class="classname"><a href="class.datetimeimmutable.php" class="classname">DateTimeImmutable</a></span> ya no dejará propiedades accesibles en el objeto.
  </p>
  <p class="para">
   La comparación de objetos <span class="classname"><a href="class.dateinterval.php" class="classname">DateInterval</a></span> (utilizando <code class="literal">==</code>, <code class="literal">&lt;</code>, etc.) generará ahora un aviso y siempre devolverá <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>. Anteriormente, todos los objetos <span class="classname"><a href="class.dateinterval.php" class="classname">DateInterval</a></span> eran considerados como iguales, a menos que tuvieran propiedades.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.intl">
  <h3 class="title">Intl</h3>

  <p class="para">
   El valor por omisión del parámetro de <span class="function"><a href="function.idn-to-ascii.php" class="function">idn_to_ascii()</a></span> y <span class="function"><a href="function.idn-to-utf8.php" class="function">idn_to_utf8()</a></span> es ahora <strong><code><a href="intl.constants.php#constant.intl-idna-variant-uts46">INTL_IDNA_VARIANT_UTS46</a></code></strong> en lugar del valor desaconsejado <strong><code><a href="intl.constants.php#constant.intl-idna-variant-2003">INTL_IDNA_VARIANT_2003</a></code></strong>.
  </p>
 </div>

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

  <p class="para">
   La funcionalidad del servidor integrado ha sido eliminada. Ha estado rota desde al menos PHP 7.0.
  </p>
  <p class="para">
   La propiedad no documentada <code class="literal">mysqli::$stat</code> ha sido eliminada en favor de <span class="methodname"><a href="mysqli.stat.php" class="methodname">mysqli::stat()</a></span>.
  </p>
 </div>

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

  <p class="para">
   La función <span class="function"><a href="function.openssl-random-pseudo-bytes.php" class="function">openssl_random_pseudo_bytes()</a></span> lanza una excepción en situaciones de error, similar a <span class="function"><a href="function.random-bytes.php" class="function">random_bytes()</a></span>. En particular, una <span class="classname"><a href="class.error.php" class="classname">Error</a></span> es lanzada si el número de bytes solicitados es inferior o igual a cero, y una <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> es lanzada si no se puede recoger un carácter aleatorio suficiente. El argumento de salida <code class="literal">$crypto_strong</code> está garantizado de ser siempre <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> si la función no lanza una excepción, por lo que no es necesario verificarlo explícitamente.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.pcre">
  <h3 class="title">Expresiones regulares (compatible Perl)</h3>

  <p class="para">
   Cuando se utiliza el modo <strong><code><a href="pcre.constants.php#constant.preg-unmatched-as-null">PREG_UNMATCHED_AS_NULL</a></code></strong>, los grupos de captura no encontrados serán ahora también establecidos a <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> (o <code class="literal">[null, -1]</code> si la captura offset está activada). Esto significa que el tamaño de <code class="literal">$matches</code> será siempre el mismo.
  </p>
 </div>

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

  <p class="para">
   Un intento de serialización de una instancia de <span class="classname"><a href="class.pdo.php" class="classname">PDO</a></span> o <span class="classname"><a href="class.pdostatement.php" class="classname">PDOStatement</a></span> generará ahora una <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> en lugar de una <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span>, compatible con otras clases internas que no soportan la serialización.
  </p>
 </div>

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

  <p class="para">
   Los objetos Reflection generan ahora una excepción si se intenta serializarlos. La serialización de objetos Reflection nunca ha sido soportada y ha dado lugar a objetos Reflection corruptos. Ha sido explícitamente prohibido ahora.
  </p>

  <p class="para">
   El valor de las constantes de clase de <span class="classname"><a href="class.reflectionclassconstant.php" class="classname">ReflectionClassConstant</a></span>, <span class="classname"><a href="class.reflectionmethod.php" class="classname">ReflectionMethod</a></span> y <span class="classname"><a href="class.reflectionproperty.php" class="classname">ReflectionProperty</a></span> han sido cambiados.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.spl">
  <h3 class="title">Biblioteca PHP estándar (SPL)</h3>

  <p class="para">
   La llamada <span class="function"><a href="function.get-object-vars.php" class="function">get_object_vars()</a></span> en una instancia de <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span> devolverá siempre las propiedades del <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span> mismo (o de una subclase). Anteriormente, devolvía los valores del array/objeto a menos que el flag <strong><code><a href="class.arrayobject.php#arrayobject.constants.std-prop-list">ArrayObject::STD_PROP_LIST</a></code></strong> hubiera sido especificado.
  </p>
  <p class="para">
   Las otras operaciones afectadas son las siguientes:
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <span class="methodname"><strong>ReflectionObject::getProperties()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.reset.php" class="function">reset()</a></span>, <span class="function"><a href="function.current.php" class="function">current()</a></span>, etc. Utilizar en su lugar los métodos de <span class="interfacename"><a href="class.iterator.php" class="interfacename">Iterator</a></span>.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Potencialmente otras funciones que trabajan en las propiedades del objeto como una lista, e.g. <span class="function"><a href="function.array-walk.php" class="function">array_walk()</a></span>.
    </span>
   </li>
  </ul>
  <p class="para">
   Las modificaciones de tipo <code class="literal">(array)</code> no están afectadas. Continuarán devolviendo ya sea el array envuelto, ya sea las propiedades <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span>, dependiendo de si el flag <strong><code><a href="class.arrayobject.php#arrayobject.constants.std-prop-list">ArrayObject::STD_PROP_LIST</a></code></strong> es utilizado.
  </p>
  <p class="para">
   <span class="methodname"><a href="splpriorityqueue.setextractflags.php" class="methodname">SplPriorityQueue::setExtractFlags()</a></span> lanzará una excepción si se pasa cero. Anteriormente, esto generaría un error fatal recuperable en la próxima operación de extracción.
  </p>
  <p class="para">
   <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span>, <span class="classname"><a href="class.arrayiterator.php" class="classname">ArrayIterator</a></span>, <span class="classname"><a href="class.spldoublylinkedlist.php" class="classname">SplDoublyLinkedList</a></span> y <span class="classname"><a href="class.splobjectstorage.php" class="classname">SplObjectStorage</a></span> manejan ahora <code class="literal">__serialize()</code> y <code class="literal">__unserialize()</code> además de la interfaz <span class="interfacename"><a href="class.serializable.php" class="interfacename">Serializable</a></span>. Esto significa que las cargas útiles de serialización creadas en versiones antiguas de PHP pueden seguir siendo deserializadas, pero las nuevas cargas útiles creadas por PHP 7.4 no serán compatibles con las versiones antiguas.
  </p>
 </div>

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

  <p class="para">
   <span class="function"><a href="function.token-get-all.php" class="function">token_get_all()</a></span> emitirá ahora un token <strong><code><a href="tokens.php#constant.t-bad-character">T-BAD-CHARACTER</a></code></strong> para caracteres inesperados en lugar de dejar agujeros en el flujo de tokens.
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.cookie-decode">
  <h3 class="title">Cookies entrantes</h3>

  <p class="para">
   Desde PHP 7.4.11, los <em>nombres</em> de las cookies entrantes ya no son url-decodificados por razones de seguridad.
  </p>
 </div>

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