<?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.new-features.php',
    1 => 'Nuevas caracter&iacute;sticas',
    2 => 'Nuevas caracter&iacute;sticas',
  ),
  'up' => 
  array (
    0 => 'migration80.php',
    1 => 'Migraci&oacute;n de PHP 7.4.x a PHP 8.0.x',
  ),
  'prev' => 
  array (
    0 => 'migration80.php',
    1 => 'Migraci&oacute;n de PHP 7.4.x a PHP 8.0.x',
  ),
  'next' => 
  array (
    0 => 'migration80.new-classes.php',
    1 => 'Nuevas clases e interfaces',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'appendices/migration80/new-features.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration80.new-features" class="sect1">
 <h2 class="title">Nuevas características</h2>

 <div class="sect2" id="migration80.new-features.core">
  <h3 class="title">Núcleo de PHP</h3>

  <div class="sect3" id="migration80.new-features.core.named-arguments">
   <h4 class="title">Argumentos nombrados</h4>

   <p class="para">
    
    Se ha añadido soporte para los<a href="functions.arguments.php#functions.named-arguments" class="link">Argumentos nombrados</a>.
   </p>
  </div>

  <div class="sect3" id="migration80.new-features.core.attributes">
   <h4 class="title">Atributos</h4>

   <p class="para">
    Se ha añadido soporte para los <a href="language.attributes.php" class="link">Atributos</a>.
    
    
    
    
   </p>
  </div>

  <div class="sect3" id="migration80.new-features.core.property-promotion">
   <h4 class="title">Promoción de propiedades en el constructor</h4>

   <p class="para">
    Se ha añadido soporte para la <a href="language.oop5.decon.php#language.oop5.decon.constructor.promotion" class="link">promoción de propiedades en el constructor</a> (declarar propiedades en la firma del constructor).
    
   </p>
  </div>

  <div class="sect3" id="migration80.new-features.core.union-types">
   <h4 class="title">Tipos de unión</h4>

   <p class="para">
    Se ha añadido soporte para los <a href="language.types.declarations.php#language.types.declarations.composite.union" class="link">tipos de unión</a>.
    
   </p>
  </div>

  <div class="sect3" id="migration80.new-features.core.match">
   <h4 class="title">Expresión match</h4>

   <p class="para">
    Se ha añadido soporte para las <a href="control-structures.match.php" class="link">expresiones <code class="literal">match</code></a>.
    
   </p>
  </div>

  <div class="sect3" id="migration80.new-features.core.nullsafe-operator">
   <h4 class="title">Operador nullsafe</h4>

   <p class="para">
    Se ha añadido soporte para el <a href="language.oop5.basic.php#language.oop5.basic.nullsafe" class="link">operador nullsafe</a> (<code class="literal">?-&gt;</code>).
    
   </p>
  </div>

  <div class="sect3" id="migration80.new-features.core.others">
   <h4 class="title">Otras nuevas características</h4>

   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      Se ha añadido la clase <a href="class.weakmap.php" class="link">WeakMap</a>.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Se ha añadido la clase <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Cualquier número de parámetros de función ahora puede ser reemplazado por un argumento variádico, siempre que los
      tipos sean compatibles. Por ejemplo, el siguiente código ahora está permitido:
     </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">A </span><span style="color: #007700">{<br />     public function </span><span style="color: #0000BB">method</span><span style="color: #007700">(</span><span style="color: #0000BB">int $many</span><span style="color: #007700">, </span><span style="color: #0000BB">string $parameters</span><span style="color: #007700">, </span><span style="color: #0000BB">$here</span><span style="color: #007700">) {}<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 />     public function </span><span style="color: #0000BB">method</span><span style="color: #007700">(...</span><span style="color: #0000BB">$everything</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">
      <span class="type">static</span> (como en &quot;enlace estático en tiempo de ejecución&quot;) ahora puede ser usado como tipo de retorno:
     </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">Test </span><span style="color: #007700">{<br />     public function </span><span style="color: #0000BB">create</span><span style="color: #007700">(): static {<br />          return new static();<br />     }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Ahora es posible obtener el nombre de la clase de un objeto usando
      <code class="code">$object::class</code>. El resultado es el mismo que <code class="code">get_class($object)</code>.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <a href="language.oop5.basic.php#language.oop5.basic.new" class="link"><code class="literal">new</code></a> e <a href="language.operators.type.php" class="link"><code class="literal">instanceof</code></a> ahora pueden ser usados con expresiones arbitrarias,
      usando <code class="code">new (expression)(...$args)</code> y <code class="code">$obj instanceof (expression)</code>.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Se han aplicado algunas correcciones de consistencia en la sintaxis de variables, por ejemplo, escribir
      <code class="code">Foo::BAR::$baz</code> ahora está permitido.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Se ha añadido la interfaz <span class="interfacename"><a href="class.stringable.php" class="interfacename">Stringable</a></span>, que se implementa automáticamente si
      una clase define un método <a href="language.oop5.magic.php#object.tostring" class="link">__toString()</a>.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Los traits ahora pueden definir métodos privados abstractos.
      Dichos métodos deben ser implementados por la clase que usa el trait.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <code class="literal">throw</code> ahora puede ser usado como una expresión.
      Esto permite usos como:
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$fn </span><span style="color: #007700">= fn() =&gt; throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">'Exception in arrow function'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$user </span><span style="color: #007700">= </span><span style="color: #0000BB">$session</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">user </span><span style="color: #007700">?? throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">'Must have user'</span><span style="color: #007700">);</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Ahora se permite una coma final opcional en las listas de parámetros.
      <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">functionWithLongSignature</span><span style="color: #007700">(<br />    </span><span style="color: #0000BB">Type1 $parameter1</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">Type2 $parameter2</span><span style="color: #007700">, </span><span style="color: #FF8000">// &lt;-- This comma is now allowed.<br /></span><span style="color: #007700">) {<br />}</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Ahora es posible escribir <code class="code">catch (Exception)</code> para capturar una excepción sin almacenarla
      en una variable.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Se ha añadido soporte para el tipo <span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span>.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Los métodos privados declarados en una clase padre ya no imponen ninguna regla de herencia sobre los métodos
      de una clase hija (con la excepción de los constructores privados finales).
      El siguiente ejemplo ilustra qué restricciones han sido eliminadas:
      <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">ParentClass </span><span style="color: #007700">{<br />    private function </span><span style="color: #0000BB">method1</span><span style="color: #007700">() {}<br />    private function </span><span style="color: #0000BB">method2</span><span style="color: #007700">() {}<br />    private static function </span><span style="color: #0000BB">method3</span><span style="color: #007700">() {}<br />    </span><span style="color: #FF8000">// Throws a warning, as "final" no longer has an effect:<br />    </span><span style="color: #007700">private final function </span><span style="color: #0000BB">method4</span><span style="color: #007700">() {}<br />}<br />class </span><span style="color: #0000BB">ChildClass </span><span style="color: #007700">extends </span><span style="color: #0000BB">ParentClass </span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// All of the following are now allowed, even though the modifiers aren't<br />    // the same as for the private methods in the parent class.<br />    </span><span style="color: #007700">public abstract function </span><span style="color: #0000BB">method1</span><span style="color: #007700">() {}<br />    public static function </span><span style="color: #0000BB">method2</span><span style="color: #007700">() {}<br />    public function </span><span style="color: #0000BB">method3</span><span style="color: #007700">() {}<br />    public function </span><span style="color: #0000BB">method4</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">
      Se ha añadido <span class="function"><a href="function.get-resource-id.php" class="function">get_resource_id()</a></span>, que devuelve el mismo valor que
      <code class="code">(int) $resource</code>. Proporciona la misma funcionalidad con una API más clara.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Se ha añadido <span class="classname"><a href="class.internaliterator.php" class="classname">InternalIterator</a></span>.
     </p>
    </li>
   </ul>
  </div>
 </div>

 <div class="sect2" id="migration80.new-features.date">
  <h3 class="title">Fecha y hora</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Se han añadido <span class="methodname"><a href="datetime.createfrominterface.php" class="methodname">DateTime::createFromInterface()</a></span> y
     <span class="methodname"><a href="datetimeimmutable.createfrominterface.php" class="methodname">DateTimeImmutable::createFromInterface()</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Se ha añadido el especificador de formato DateTime <code class="literal">p</code>, que es igual que
     <code class="literal">P</code> pero devuelve <code class="literal">Z</code> en lugar de <code class="literal">+00:00</code>
     para UTC.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.new-features.dom">
  <h3 class="title">DOM</h3>

  <p class="para">
   Se han añadido <span class="interfacename"><a href="class.domparentnode.php" class="interfacename">DOMParentNode</a></span> y <span class="interfacename"><a href="class.domchildnode.php" class="interfacename">DOMChildNode</a></span> con
   nuevas API de recorrido y manipulación.
   
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.filter">
  <h3 class="title">Filter</h3>

  <p class="para">
   Se ha añadido <strong><code><a href="filter.constants.php#constant.filter-validate-bool">FILTER_VALIDATE_BOOL</a></code></strong> como alias de
   <strong><code><a href="filter.constants.php#constant.filter-validate-boolean">FILTER_VALIDATE_BOOLEAN</a></code></strong>. Se prefiere el nuevo nombre, ya que utiliza el nombre
   de tipo canónico.
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.enchant">
  <h3 class="title">Enchant</h3>

  <p class="para">
   Se han añadido <span class="function"><a href="function.enchant-dict-add.php" class="function">enchant_dict_add()</a></span>, <span class="function"><a href="function.enchant-dict-is-added.php" class="function">enchant_dict_is_added()</a></span> y
   <strong><code><a href="enchant.constants.php#constant.libenchant-version">LIBENCHANT_VERSION</a></code></strong>.
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.fpm">
  <h3 class="title">FPM</h3>

  <p class="para">
   Se ha añadido una nueva opción <code class="literal">pm.status_listen</code> que permite obtener el estado desde
   un endpoint diferente (por ejemplo, un puerto o archivo UDS), lo cual es útil para obtener el estado cuando todos
   los procesos hijos están ocupados sirviendo peticiones de larga duración.
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.hash">
  <h3 class="title">Hash</h3>

  <p class="para">
   Los objetos <span class="classname"><a href="class.hashcontext.php" class="classname">HashContext</a></span> ahora pueden ser serializados.
  </p>
 </div>

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

  <p class="para">
   Se han añadido las constantes <strong><code><a href="class.intldateformatter.php#intldateformatter.constants.relative-full">IntlDateFormatter::RELATIVE_FULL</a></code></strong>,
   <strong><code><a href="class.intldateformatter.php#intldateformatter.constants.relative-long">IntlDateFormatter::RELATIVE_LONG</a></code></strong>,
   <strong><code><a href="class.intldateformatter.php#intldateformatter.constants.relative-medium">IntlDateFormatter::RELATIVE_MEDIUM</a></code></strong> y
   <strong><code><a href="class.intldateformatter.php#intldateformatter.constants.relative-short">IntlDateFormatter::RELATIVE_SHORT</a></code></strong>.
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.ldap">
  <h3 class="title">LDAP</h3>

  <p class="para">
   Se ha añadido <span class="function"><a href="function.ldap-count-references.php" class="function">ldap_count_references()</a></span>, que devuelve el número
   de mensajes de referencia en un resultado de búsqueda.
  </p>
 </div>
 <div class="sect2" id="migration80.new-features.opcache">
  <h3 class="title">OPcache</h3>

  <p class="para">
   Si la directiva ini opcache.record_warnings está
   habilitada, OPcache registrará las advertencias en tiempo de compilación y las reproducirá en el siguiente include, incluso si
   se sirve desde la caché.
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.openssl">
  <h3 class="title">OpenSSL</h3>

  <p class="para">
   Se ha añadido soporte para Cryptographic Message Syntax (CMS) (<a href="https://datatracker.ietf.org/doc/html/rfc5652" class="link external">&raquo;&nbsp;RFC 5652</a>)
   compuesto por funciones para cifrado, descifrado, firma, verificación y lectura. La API
   es similar a la API de las funciones <abbr title="Public Key Cryptography Standards">PKCS</abbr> #7 con la adición de nuevas constantes de codificación:
   <strong><code><a href="openssl.constants.other.php#constant.openssl-encoding-der">OPENSSL_ENCODING_DER</a></code></strong>, <strong><code><a href="openssl.constants.other.php#constant.openssl-encoding-smime">OPENSSL_ENCODING_SMIME</a></code></strong>
   y <strong><code><a href="openssl.constants.other.php#constant.openssl-encoding-pem">OPENSSL_ENCODING_PEM</a></code></strong>:
   <ul class="simplelist">
    <li>
     <span class="function"><a href="function.openssl-cms-encrypt.php" class="function">openssl_cms_encrypt()</a></span> cifra el mensaje en el archivo con los certificados
     y envía el resultado al archivo proporcionado.
    </li>
    <li>
     <span class="function"><a href="function.openssl-cms-decrypt.php" class="function">openssl_cms_decrypt()</a></span> descifra el mensaje S/MIME en el archivo y envía
     los resultados al archivo proporcionado.
    </li>
    <li>
     <span class="function"><a href="function.openssl-cms-read.php" class="function">openssl_cms_read()</a></span> exporta el archivo CMS a un array de certificados <abbr title="Privacy-Enhanced Mail">PEM</abbr>.
    </li>
    <li>
     <span class="function"><a href="function.openssl-cms-sign.php" class="function">openssl_cms_sign()</a></span> firma el mensaje MIME en el archivo con un certificado y una clave
     y envía el resultado al archivo proporcionado.
    </li>
    <li>
     <span class="function"><a href="function.openssl-cms-verify.php" class="function">openssl_cms_verify()</a></span> verifica que el bloque de datos está intacto, que el firmante
     es quien dice ser, y devuelve los certificados de los firmantes.
    </li>
   </ul>
  </p>
 </div>

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

  <p class="para">
   Se ha añadido <span class="function"><a href="function.preg-last-error-msg.php" class="function">preg_last_error_msg()</a></span>, que devuelve un mensaje legible para el último
   error PCRE. Complementa a <span class="function"><a href="function.preg-last-error.php" class="function">preg_last_error()</a></span>, que devuelve un valor entero de enumeración
   en su lugar.
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.reflection">
  <h3 class="title">Reflexión</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Los siguientes métodos ahora pueden devolver información sobre los valores predeterminados de
     los parámetros de las funciones internas:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><span class="methodname"><a href="reflectionparameter.isdefaultvalueavailable.php" class="methodname">ReflectionParameter::isDefaultValueAvailable()</a></span></li>
      <li><span class="methodname"><a href="reflectionparameter.getdefaultvalue.php" class="methodname">ReflectionParameter::getDefaultValue()</a></span></li>
      <li><span class="methodname"><a href="reflectionparameter.isdefaultvalueconstant.php" class="methodname">ReflectionParameter::isDefaultValueConstant()</a></span></li>
      <li><span class="methodname"><a href="reflectionparameter.getdefaultvalueconstantname.php" class="methodname">ReflectionParameter::getDefaultValueConstantName()</a></span></li>
     </ul>
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.new-features.sqlite3">
  <h3 class="title">SQLite3</h3>

  <p class="para">
   Se han añadido <span class="methodname"><a href="sqlite3.setauthorizer.php" class="methodname">SQLite3::setAuthorizer()</a></span> y las constantes de clase correspondientes
   para establecer una función de retorno de llamada de usuario que se utilizará para autorizar o no una acción en la base de datos.
   
  </p>
 </div>

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

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Se han añadido <span class="function"><a href="function.str-contains.php" class="function">str_contains()</a></span>, <span class="function"><a href="function.str-starts-with.php" class="function">str_starts_with()</a></span> y
     <span class="function"><a href="function.str-ends-with.php" class="function">str_ends_with()</a></span>, que comprueban si <code class="parameter">haystack</code> contiene,
     comienza con o termina con <code class="parameter">needle</code>, respectivamente.
     
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Se ha añadido <span class="function"><a href="function.fdiv.php" class="function">fdiv()</a></span>, que realiza una división de punto flotante según la semántica IEEE 754.
     La división por cero se considera bien definida y devolverá uno de <code class="literal">Inf</code>,
     <code class="literal">-Inf</code> o <code class="literal">NaN</code>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Se ha añadido <span class="function"><a href="function.get-debug-type.php" class="function">get_debug_type()</a></span>, que devuelve un tipo útil para mensajes de error. A diferencia de
     <span class="function"><a href="function.gettype.php" class="function">gettype()</a></span>, utiliza nombres de tipo canónicos, devuelve nombres de clase para objetos e
     indica el tipo de recurso para los recursos.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.printf.php" class="function">printf()</a></span> y funciones similares ahora soportan los especificadores de formato <code class="literal">%h</code> y
     <code class="literal">%H</code>. Son iguales que <code class="literal">%g</code> y
     <code class="literal">%G</code>, pero siempre usan <code class="literal">&quot;.&quot;</code> como separador decimal, en lugar
     de determinarlo a través de la configuración regional <strong><code><a href="string.constants.php#constant.lc-numeric">LC_NUMERIC</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.printf.php" class="function">printf()</a></span> y funciones similares ahora soportan el uso de <code class="literal">&quot;*&quot;</code> como ancho o
     precisión, en cuyo caso el ancho/precisión se pasa como argumento a printf. Esto también permite
     usar precisión <code class="literal">-1</code> con <code class="literal">%g</code>, <code class="literal">%G</code>,
     <code class="literal">%h</code> y <code class="literal">%H</code>. Por ejemplo, el siguiente código puede usarse para
     reproducir el formato predeterminado de punto flotante de PHP:
    </p>
    <p class="para">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"%.*H"</span><span style="color: #007700">, (int) </span><span style="color: #0000BB">ini_get</span><span style="color: #007700">(</span><span style="color: #DD0000">"precision"</span><span style="color: #007700">), </span><span style="color: #0000BB">$float</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"%.*H"</span><span style="color: #007700">, (int) </span><span style="color: #0000BB">ini_get</span><span style="color: #007700">(</span><span style="color: #DD0000">"serialize_precision"</span><span style="color: #007700">), </span><span style="color: #0000BB">$float</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">
     <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span> ahora soporta descriptores de pseudo-terminal (PTY). Lo siguiente
     conecta <code class="literal">stdin</code>, <code class="literal">stdout</code> y <code class="literal">stderr</code> al
     mismo PTY:
    </p>
    <p class="para">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$proc </span><span style="color: #007700">= </span><span style="color: #0000BB">proc_open</span><span style="color: #007700">(</span><span style="color: #0000BB">$command</span><span style="color: #007700">, [[</span><span style="color: #DD0000">'pty'</span><span style="color: #007700">], [</span><span style="color: #DD0000">'pty'</span><span style="color: #007700">], [</span><span style="color: #DD0000">'pty'</span><span style="color: #007700">]], </span><span style="color: #0000BB">$pipes</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">
     <span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span> ahora soporta descriptores de pares de sockets. Lo siguiente conecta un
     par de sockets distinto a <code class="literal">stdin</code>, <code class="literal">stdout</code> y
     <code class="literal">stderr</code>:
    </p>
    <p class="para">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$proc </span><span style="color: #007700">= </span><span style="color: #0000BB">proc_open</span><span style="color: #007700">(</span><span style="color: #0000BB">$command</span><span style="color: #007700">, [[</span><span style="color: #DD0000">'socket'</span><span style="color: #007700">], [</span><span style="color: #DD0000">'socket'</span><span style="color: #007700">], [</span><span style="color: #DD0000">'socket'</span><span style="color: #007700">]], </span><span style="color: #0000BB">$pipes</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </p>
    <p class="para">
     A diferencia de las tuberías, los sockets no sufren problemas de E/S bloqueante en Windows. Sin embargo, no todos
     los programas pueden funcionar correctamente con sockets stdio.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las funciones de ordenamiento ahora son estables, lo que significa que los elementos que se comparan como iguales conservarán su
     orden original.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.array-diff.php" class="function">array_diff()</a></span>, <span class="function"><a href="function.array-intersect.php" class="function">array_intersect()</a></span> y sus variaciones ahora pueden
     ser usadas con un solo array como argumento. Esto significa que usos como los siguientes ahora son
     posibles:
    </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">// OK even if $excludes is empty:<br /></span><span style="color: #0000BB">array_diff</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">, ...</span><span style="color: #0000BB">$excludes</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// OK even if $arrays only contains a single array:<br /></span><span style="color: #0000BB">array_intersect</span><span style="color: #007700">(...</span><span style="color: #0000BB">$arrays</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">
     El parámetro <code class="parameter">flag</code> de <span class="function"><a href="function.ob-implicit-flush.php" class="function">ob_implicit_flush()</a></span> fue cambiado
     para aceptar un <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> en lugar de un <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.new-features.tokenizer">
  <h3 class="title">Tokenizer</h3>

  <p class="para">
   <span class="classname"><a href="class.phptoken.php" class="classname">PhpToken</a></span> añade una interfaz basada en objetos al tokenizer. Proporciona una
   representación más uniforme y ergonómica, siendo al mismo tiempo más eficiente en memoria y más rápida.
   
  </p>
 </div>

 <div class="sect2" id="migration80.new-features.zip">
  <h3 class="title">Zip</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     La extensión Zip ha sido actualizada a la versión 1.19.1.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Nuevos <span class="methodname"><a href="ziparchive.setmtimename.php" class="methodname">ZipArchive::setMtimeName()</a></span> y
     <span class="methodname"><a href="ziparchive.setmtimeindex.php" class="methodname">ZipArchive::setMtimeIndex()</a></span> para establecer la hora de modificación de una entrada.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Nuevo <span class="methodname"><a href="ziparchive.registerprogresscallback.php" class="methodname">ZipArchive::registerProgressCallback()</a></span> para proporcionar actualizaciones durante el cierre del archivo.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Nuevo <span class="methodname"><a href="ziparchive.registercancelcallback.php" class="methodname">ZipArchive::registerCancelCallback()</a></span> para permitir la cancelación durante el cierre
     del archivo.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Nuevo <span class="methodname"><a href="ziparchive.replacefile.php" class="methodname">ZipArchive::replaceFile()</a></span> para reemplazar el contenido de una entrada.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Nuevo <span class="methodname"><a href="ziparchive.iscompressionmethoddupported.php" class="methodname">ZipArchive::isCompressionMethodSupported()</a></span> para verificar las características opcionales de
     compresión.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Nuevo <span class="methodname"><a href="ziparchive.isencryptionmethoddupported.php" class="methodname">ZipArchive::isEncryptionMethodSupported()</a></span> para verificar las características opcionales de
     cifrado.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Se ha añadido la propiedad <var class="varname">ZipArchive::lastId</var> para obtener el valor del índice
     de la última entrada añadida.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Ahora se pueden verificar los errores después de que un archivo ha sido cerrado usando las propiedades
     <var class="varname">ZipArchive::status</var> y
     <var class="varname">ZipArchive::statusSys</var>, o el método
     <span class="methodname"><a href="ziparchive.getstatusstring.php" class="methodname">ZipArchive::getStatusString()</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     La opción <code class="literal">&#039;remove_path&#039;</code> de <span class="methodname"><a href="ziparchive.addglob.php" class="methodname">ZipArchive::addGlob()</a></span> y
     <span class="methodname"><a href="ziparchive.addpattern.php" class="methodname">ZipArchive::addPattern()</a></span> ahora se trata como un prefijo de cadena arbitrario (para
     mantener la consistencia con la opción <code class="literal">&#039;add_path&#039;</code>), mientras que anteriormente se trataba como un
     nombre de directorio.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Las características opcionales de compresión / cifrado ahora se listan en phpinfo.
    </p>
   </li>
  </ul>
 </div>

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