<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration84.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'migration84.new-features.php',
    1 => 'Nuevas caracter&iacute;sticas',
    2 => 'Nuevas caracter&iacute;sticas',
  ),
  'up' => 
  array (
    0 => 'migration84.php',
    1 => 'Migraci&oacute;n de PHP 8.3.x a PHP 8.4.x',
  ),
  'prev' => 
  array (
    0 => 'migration84.php',
    1 => 'Migraci&oacute;n de PHP 8.3.x a PHP 8.4.x',
  ),
  'next' => 
  array (
    0 => 'migration84.new-classes.php',
    1 => 'Nuevas clases, enumeraciones e interfaces',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'appendices/migration84/new-features.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

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

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

  
  <div class="sect3" id="migration84.new-features.core.property-hooks">
   <h4 class="title">Hooks de propiedad</h4>

   <p class="simpara">
    Las propiedades de los objetos pueden ahora tener lógica adicional asociada con sus
    operaciones <code class="literal">get</code> y <code class="literal">set</code>.
    Dependiendo del uso, esto puede hacer que la propiedad sea virtual, es decir, no tenga ningún valor de respaldo.
   </p>

   <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">Person<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Una propiedad "virtual". No puede ser establecida explícitamente.<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $fullName </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">get </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">firstName </span><span style="color: #007700">. </span><span style="color: #DD0000">' ' </span><span style="color: #007700">. </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">lastName</span><span style="color: #007700">;<br />    }<br /><br />    </span><span style="color: #FF8000">// Todas las operaciones de escritura pasan por este hook, y el resultado es lo que se escribe.<br />    // El acceso de lectura ocurre normalmente.<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $firstName </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">set </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">ucfirst</span><span style="color: #007700">(</span><span style="color: #0000BB">strtolower</span><span style="color: #007700">(</span><span style="color: #0000BB">$value</span><span style="color: #007700">));<br />    }<br /><br />    </span><span style="color: #FF8000">// Todas las operaciones de escritura pasan por este hook, que debe escribir en el valor de respaldo.<br />    // El acceso de lectura ocurre normalmente.<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $lastName </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">set </span><span style="color: #007700">{<br />            if (</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$value</span><span style="color: #007700">) &lt; </span><span style="color: #0000BB">2</span><span style="color: #007700">) {<br />                throw new </span><span style="color: #0000BB">\InvalidArgumentException</span><span style="color: #007700">(</span><span style="color: #DD0000">'Too short'</span><span style="color: #007700">);<br />            }<br />            </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">lastName </span><span style="color: #007700">= </span><span style="color: #0000BB">$value</span><span style="color: #007700">;<br />        }<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$p </span><span style="color: #007700">= new </span><span style="color: #0000BB">Person</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">firstName </span><span style="color: #007700">= </span><span style="color: #DD0000">'peter'</span><span style="color: #007700">;<br />print </span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">firstName</span><span style="color: #007700">; </span><span style="color: #FF8000">// Imprime "Peter"<br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">lastName </span><span style="color: #007700">= </span><span style="color: #DD0000">'Peterson'</span><span style="color: #007700">;<br />print </span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">fullName</span><span style="color: #007700">; </span><span style="color: #FF8000">// Imprime "Peter Peterson"</span></span></code></div>
    </div>

   </div>
  </div>

  
  <div class="sect3" id="migration84.new-features.core.asymmetric-property-visibility">
   <h4 class="title">Visibilidad Asimétrica de Propiedades</h4>

   <p class="simpara">
    Las propiedades de los objetos pueden ahora tener su visibilidad <code class="literal">set</code>
    controlada por separado de la visibilidad <code class="literal">get</code>.
   </p>
   <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">Example<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// El primer modificador de visibilidad controla la visibilidad de get, y el segundo modificador<br />    // controla la visibilidad de set. La visibilidad de get no debe ser más estrecha que la visibilidad de set.<br />    </span><span style="color: #007700">public protected(</span><span style="color: #0000BB">set</span><span style="color: #007700">) </span><span style="color: #0000BB">string $name</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">string $name</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name </span><span style="color: #007700">= </span><span style="color: #0000BB">$name</span><span style="color: #007700">;<br />    }<br />}</span></span></code></div>
    </div>

   </div>
  </div>

  
  <div class="sect3" id="migration84.new-features.core.lazy-objects">
   <h4 class="title">Objetos Lazy</h4>
   <p class="simpara">
    Ahora es posible crear objetos cuya inicialización se difiere hasta
    que sean accedidos. Las bibliotecas y frameworks pueden aprovechar estos objetos lazy
    para diferir la obtención de datos o dependencias requeridas para la inicialización.
   </p>
   <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">Example<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(private </span><span style="color: #0000BB">int $data</span><span style="color: #007700">)<br />    {<br />    }<br /><br />    </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #0000BB">$initializer </span><span style="color: #007700">= static function (</span><span style="color: #0000BB">Example $ghost</span><span style="color: #007700">): </span><span style="color: #0000BB">void </span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Obtener datos o dependencias<br />    </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">getData</span><span style="color: #007700">();<br />    </span><span style="color: #FF8000">// Inicializar<br />    </span><span style="color: #0000BB">$ghost</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">);<br />};<br /><br /></span><span style="color: #0000BB">$reflector </span><span style="color: #007700">= new </span><span style="color: #0000BB">ReflectionClass</span><span style="color: #007700">(</span><span style="color: #0000BB">Example</span><span style="color: #007700">::class);<br /></span><span style="color: #0000BB">$object </span><span style="color: #007700">= </span><span style="color: #0000BB">$reflector</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">newLazyGhost</span><span style="color: #007700">(</span><span style="color: #0000BB">$initializer</span><span style="color: #007700">);</span></span></code></div>
    </div>

   </div>
  </div>

  
  <div class="sect3" id="migration84.new-features.core.deprecated-attribute">
   <h4 class="title">Atributo <code class="code">#[\Deprecated]</code></h4>

   <p class="simpara">
    El nuevo atributo <span class="classname"><a href="class.deprecated.php" class="classname">Deprecated</a></span> puede ser utilizado para marcar funciones, métodos,
    y constantes de clase como obsoletas. El comportamiento de la funcionalidad obsoleta con este
    atributo coincide con el comportamiento del mecanismo de obsolescencia existente para la funcionalidad
    proporcionada por PHP mismo. La única excepción es que el código de error emitido es
    <strong><code><a href="errorfunc.constants.php#constant.e-user-deprecated">E_USER_DEPRECATED</a></code></strong> en lugar de <strong><code><a href="errorfunc.constants.php#constant.e-deprecated">E_DEPRECATED</a></code></strong>.
   </p>

   <p class="simpara">
    Las obsolescencias existentes en la funcionalidad proporcionada por PHP mismo han sido actualizadas para usar
    el atributo, mejorando los mensajes de error emitidos al incluir una breve explicación.
   </p>
  </div>

  
  <div class="sect3" id="migration84.new-features.core.rfc1867">
   <h4 class="title">Analizando solicitudes RFC1867 (multipart) en solicitudes HTTP no-POST</h4>

   
   <p class="simpara">
    Se añadió la función <span class="function"><a href="function.request-parse-body.php" class="function">request_parse_body()</a></span> que permite analizar
    solicitudes RFC1867 (multipart) en solicitudes HTTP no-POST.
   </p>
  </div>

  
  <div class="sect3" id="migration84.new-features.core.new-chaining">
   <h4 class="title">Encadenando expresiones <a href="language.oop5.basic.php#language.oop5.basic.new" class="link"><code class="literal">new</code></a> sin paréntesis</h4>

   
   <p class="simpara">
    Las nuevas expresiones con argumentos de constructor son ahora desreferenciables, lo que significa
    que permiten encadenar llamadas a métodos, accesos a propiedades, etc., sin encerrar
    la expresión entre paréntesis.
   </p>
  </div>

  <div class="sect3" id="migration84.new-features.core.debug-weakref">
   <h4 class="title">Información de Depuración Mejorada para <span class="classname"><a href="class.weakreference.php" class="classname">WeakReference</a></span></h4>

   
   <p class="simpara">
    Obtener la información de depuración para <span class="classname"><a href="class.weakreference.php" class="classname">WeakReference</a></span> ahora
    también mostrará el objeto al que hace referencia, o <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> si la referencia ya no es válida.
   </p>
  </div>

  <div class="sect3" id="migration84.new-features.core.debug-closure">
   <h4 class="title">Información de Depuración Mejorada para <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span></h4>

   
   <p class="simpara">
    La salida de <span class="methodname"><strong>Closure::__debugInfo()</strong></span> ahora incluye
    el nombre, archivo y línea del <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span>.
   </p>
  </div>

  
  <div class="sect3" id="migration84.new-features.core.multiple-namespaces-symbols">
   <h4 class="title">Definiendo Símbolos Idénticos en Diferentes Bloques de Espacios de Nombres</h4>

   
   <p class="simpara">
    Salir de un espacio de nombres ahora limpia los símbolos vistos.
    Esto permite usar un símbolo en un bloque de espacio de nombres, incluso si un bloque de espacio de nombres anterior
    declaró un símbolo con el mismo nombre.
    
   </p>
  </div>

 </div>

 <div class="sect2" id="migration84.new-features.curl">
  <h3 class="title">cURL</h3>

  <p class="simpara">
   <span class="function"><a href="function.curl-version.php" class="function">curl_version()</a></span> devuelve un valor adicional
   <code class="literal">feature_list</code>, que es un array asociativo
   de todas las características conocidas de cURL, y si están soportadas (<strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>)
   o no (<strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>).
  </p>

  <p class="simpara">
   Se añadieron las constantes <strong><code><a href="curl.constants.php#constant.curl-http-version-3">CURL_HTTP_VERSION_3</a></code></strong> y
   <strong><code><a href="curl.constants.php#constant.curl-http-version-3only">CURL_HTTP_VERSION_3ONLY</a></code></strong> (disponibles
   desde libcurl 7.66 y 7.88) como opciones disponibles para
   <strong><code><a href="curl.constants.php#constant.curlopt-http-version">CURLOPT_HTTP_VERSION</a></code></strong>.
  </p>

  <p class="simpara">
   Se añadió <strong><code><a href="curl.constants.php#constant.curlopt-prereqfunction">CURLOPT_PREREQFUNCTION</a></code></strong> como una opción de cURL que
   acepta un <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> para ser llamado después de que se realice la conexión,
   pero antes de que se envíe la solicitud.
   Este callable debe devolver <strong><code><a href="curl.constants.php#constant.curl-prereqfunc-ok">CURL_PREREQFUNC_OK</a></code></strong> o
   <strong><code><a href="curl.constants.php#constant.curl-prereqfunc-abort">CURL_PREREQFUNC_ABORT</a></code></strong> para permitir o abortar la solicitud.
  </p>

  <p class="simpara">
   Se añadió <strong><code><a href="curl.constants.php#constant.curlopt-server-response-timeout">CURLOPT_SERVER_RESPONSE_TIMEOUT</a></code></strong>,
   que anteriormente era conocido como <strong><code><a href="curl.constants.php#constant.curlopt-ftp-response-timeout">CURLOPT_FTP_RESPONSE_TIMEOUT</a></code></strong>.
   Ambas constantes tienen el mismo valor.
  </p>

  <p class="para">
   Se añadió <strong><code><a href="curl.constants.php#constant.curlopt-debugfunction">CURLOPT_DEBUGFUNCTION</a></code></strong> como una opción de cURL que
   acepta un <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> que se llama durante la vida de la solicitud con el
   objeto <span class="classname"><a href="class.curlhandle.php" class="classname">CurlHandle</a></span>,
   un entero que contiene el tipo de mensaje de depuración, y un string que contiene el
   mensaje de depuración.
   El tipo de mensaje de depuración es uno de las siguientes constantes:
   <ul class="simplelist">
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-text">CURLINFO_TEXT</a></code></strong></li>
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-header-in">CURLINFO_HEADER_IN</a></code></strong></li>
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-header-out">CURLINFO_HEADER_OUT</a></code></strong></li>
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-data-in">CURLINFO_DATA_IN</a></code></strong></li>
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-data-out">CURLINFO_DATA_OUT</a></code></strong></li>
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-ssl-data-in">CURLINFO_SSL_DATA_IN</a></code></strong></li>
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-ssl-data-out">CURLINFO_SSL_DATA_OUT</a></code></strong></li>
   </ul>
   Una vez que se establece esta opción, <strong><code><a href="curl.constants.php#constant.curlinfo-header-out">CURLINFO_HEADER_OUT</a></code></strong>
   no debe ser establecido porque usa la misma funcionalidad de libcurl.
  </p>

  <p class="simpara">
   La función <span class="function"><a href="function.curl-getinfo.php" class="function">curl_getinfo()</a></span> ahora devuelve una clave adicional
   <code class="literal">posttransfer_time_us</code>, que contiene el número de
   microsegundos desde el inicio hasta que se envía el último byte.
   Cuando se sigue una redirección, el tiempo de cada solicitud se suma.
   Este valor también puede ser recuperado pasando
   <strong><code><a href="curl.constants.php#constant.curlinfo-posttransfer-time-t">CURLINFO_POSTTRANSFER_TIME_T</a></code></strong> al parámetro <code class="parameter">option</code> de la función
   <span class="function"><a href="function.curl-getinfo.php" class="function">curl_getinfo()</a></span>.
   Esto requiere libcurl 8.10.0 o posterior.
   </p>
 </div>

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

  
  
  <p class="simpara">
   Se añadió el espacio de nombres <span class="package">Dom</span> con nuevas clases como contrapartes
   a las clases DOM existentes (por ejemplo, <span class="classname"><a href="class.dom-node.php" class="classname">Dom\Node</a></span> es el nuevo
   <span class="classname"><a href="class.domnode.php" class="classname">DOMNode</a></span>).
   Estas clases son compatibles con HTML 5 y cumplen con la especificación WHATWG;
   resolviendo errores de larga data en la extensión DOM.
   Las clases DOM antiguas permanecen disponibles para compatibilidad con versiones anteriores.
  </p>

  <p class="para">
   Se añadió el método <span class="methodname"><a href="domnode.comparedocumentposition.php" class="methodname">DOMNode::compareDocumentPosition()</a></span>
   con sus constantes asociadas:
   <ul class="simplelist">
    <li><strong><code><a href="class.domnode.php#domnode.constants.document-position-disconnected">DOMNode::DOCUMENT_POSITION_DISCONNECTED</a></code></strong></li>
    <li><strong><code><a href="class.domnode.php#domnode.constants.document-position-preceding">DOMNode::DOCUMENT_POSITION_PRECEDING</a></code></strong></li>
    <li><strong><code><a href="class.domnode.php#domnode.constants.document-position-following">DOMNode::DOCUMENT_POSITION_FOLLOWING</a></code></strong></li>
    <li><strong><code><a href="class.domnode.php#domnode.constants.document-position-contains">DOMNode::DOCUMENT_POSITION_CONTAINS</a></code></strong></li>
    <li><strong><code><a href="class.domnode.php#domnode.constants.document-position-contained-by">DOMNode::DOCUMENT_POSITION_CONTAINED_BY</a></code></strong></li>
    <li><strong><code><a href="class.domnode.php#domnode.constants.document-position-implementation-specific">DOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC</a></code></strong></li>
   </ul>
  </p>

  
  <p class="simpara">
   Ahora es posible pasar cualquier callable a
   <span class="methodname"><a href="domxpath.registerphpfunctions.php" class="methodname">DOMXPath::registerPhpFunctions()</a></span>.

   Además, con <span class="methodname"><a href="domxpath.registerphpfunctionns.php" class="methodname">DOMXPath::registerPhpFunctionNs()</a></span>,
   ahora se pueden registrar callbacks que usarán la sintaxis de llamada a función nativa
   en lugar de usar <code class="code">php:function(&#039;name&#039;)</code>.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.intl">
  <h3 class="title">Intl</h3>

  <p class="simpara">
   Se añadió la constante <strong><code><a href="class.numberformatter.php#numberformatter.constants.round-halfodd">NumberFormatter::ROUND_HALFODD</a></code></strong> para
   complementar la funcionalidad existente de <strong><code><a href="class.numberformatter.php#numberformatter.constants.round-halfeven">NumberFormatter::ROUND_HALFEVEN</a></code></strong>.
  </p>
 </div>

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

  <p class="simpara">
   Se añadió soporte para claves basadas en Curve25519 + Curve448.
   Específicamente, los campos x25519, ed25519, x448 y ed448 son soportados en
   <span class="function"><a href="function.openssl-pkey-new.php" class="function">openssl_pkey_new()</a></span>,
   <span class="function"><a href="function.openssl-pkey-get-details.php" class="function">openssl_pkey_get_details()</a></span>,
   <span class="function"><a href="function.openssl-sign.php" class="function">openssl_sign()</a></span>, y
   <span class="function"><a href="function.openssl-verify.php" class="function">openssl_verify()</a></span> fueron extendidos para soportar esas claves.
  </p>

  <p class="simpara">
   Implementar el hashing de contraseñas PASSWORD_ARGON2.
   Requiere OpenSSL 3.2 y compilación NTS.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.pcre">
  <h3 class="title">PCRE</h3>

  <p class="simpara">
   La biblioteca pcre2lib incluida ha sido actualizada a la versión 10.44.
   Como consecuencia, se añadió soporte para JIT en LoongArch, ahora se permiten espacios
   entre llaves en elementos compatibles con Perl, y
   se soportan ahora las aserciones de lookbehind de longitud variable.
  </p>

  <p class="simpara">
   Con la versión 10.44 de pcre2lib, la longitud máxima de los grupos de captura nombrados
   ha cambiado de <code class="literal">32</code> a <code class="literal">128</code>.
  </p>

  <p class="simpara">
   Se añadió soporte para el modificador <code class="literal">r</code> (PCRE2_EXTRA_CASELESS_RESTRICT),
   así como el modificador de modo <code class="literal">(?r)</code>.
   Cuando se habilita junto con el modificador insensible a mayúsculas y minúsculas (<code class="literal">i</code>),
   la expresión bloquea la mezcla de caracteres ASCII y no ASCII.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.pdo">
  <h3 class="title">PDO</h3>

  
  <p class="simpara">
   Se añadió soporte para subclases específicas del controlador para soportar mejor
   las funcionalidades específicas de la base de datos.
   Las nuevas clases pueden ser instanciadas llamando al
   método <span class="methodname"><a href="pdo.connect.php" class="methodname">PDO::connect()</a></span> o instanciando una
   de las subclases específicas del controlador directamente.
  </p>

  
  <p class="para">
   Se añadió soporte para analizadores SQL específicos del controlador.
   Cuando un analizador específico del controlador no está disponible, se usa el analizador predeterminado.
   El analizador predeterminado soporta:
   <ul class="simplelist">
    <li>
     literales entre comillas simples y dobles, con duplicación como mecanismo de escape
    </li>
    <li>
     comentarios de dos guiones y comentarios de estilo C no anidados
    </li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.pdo-mysql">
  <h3 class="title">PDO_MYSQL</h3>

  
  <p class="para">
   Se añadió un analizador personalizado que soporta:
   <ul class="simplelist">
    <li>
     literales entre comillas simples y dobles, con duplicación y barra invertida como mecanismo de escape
    </li>
    <li>
     identificadores de literales con comillas invertidas y con duplicación como mecanismo de escape
    </li>
    <li>
     dos guiones seguidos de al menos 1 espacio en blanco, comentarios de estilo C no anidados,
     y comentarios de hash
    </li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.pdo-pgsql">
  <h3 class="title">PDO_PGSQL</h3>

  
  <p class="para">
   Se añadió un analizador personalizado que soporta:
   <ul class="simplelist">
    <li>
     literales entre comillas simples y dobles, con duplicación como mecanismo de escape
    </li>
    <li>
     literales de string de "escape" de estilo C (<code class="literal">E&#039;string&#039;</code>)
    </li>
    <li>
     literales de string entre comillas de dólar
    </li>
    <li>
     dos guiones y comentarios de estilo C (no anidados)
    </li>
    <li>
     soporte para <code class="literal">??</code> como secuencia de escape para el
     operador <code class="literal">?</code>
    </li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.pdo-sqlite">
  <h3 class="title">PDO_SQLITE</h3>

  
  <p class="para">
   Se añadió un analizador personalizado que soporta:
   <ul class="simplelist">
    <li>
     literales entre comillas simples, dobles y comillas invertidas, con duplicación como
     mecanismo de escape
    </li>
    <li>
     comillas de corchetes para identificadores
    </li>
    <li>
     dos guiones y comentarios de estilo C (no anidados)
    </li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.phar">
  <h3 class="title">Phar</h3>

  <p class="simpara">
   Se añadió soporte para la extensión Unix timestamp para archivos Zip.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.readline">
  <h3 class="title">Readline</h3>

  <p class="simpara">
   Se añadió la capacidad de cambiar la ruta <code class="literal">.php_history</code> a través de
   la variable de entorno <var class="envar">PHP_HISTFILE</var>.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.reflection">
  <h3 class="title">Reflection</h3>

  <p class="simpara">
   <span class="classname"><a href="class.reflectionattribute.php" class="classname">ReflectionAttribute</a></span> ahora contiene una
   propiedad <span class="property">name</span> para mejorar la experiencia de depuración.
  </p>

  <p class="simpara">
   <span class="methodname"><a href="reflectionclassconstant.tostring.php" class="methodname">ReflectionClassConstant::__toString()</a></span> y
   <span class="methodname"><a href="reflectionproperty.tostring.php" class="methodname">ReflectionProperty::__toString()</a></span> ahora devuelven los
   comentarios doc adjuntos.
  </p>

  
  <p class="para">
   Se han añadido múltiples nuevos métodos y constantes relacionados con la característica de objetos lazy:

   <ul class="simplelist">
    <li>
     <span class="methodname"><a href="reflectionclass.newlazyghost.php" class="methodname">ReflectionClass::newLazyGhost()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.newlazyproxy.php" class="methodname">ReflectionClass::newLazyProxy()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.resetaslazyghost.php" class="methodname">ReflectionClass::resetAsLazyGhost()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.resetaslazyproxy.php" class="methodname">ReflectionClass::resetAsLazyProxy()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.isuninitializedlazyobject.php" class="methodname">ReflectionClass::isUninitializedLazyObject()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.initializelazyobject.php" class="methodname">ReflectionClass::initializeLazyObject()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.marklazyobjectasinitialized.php" class="methodname">ReflectionClass::markLazyObjectAsInitialized()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.getlazyinitializer.php" class="methodname">ReflectionClass::getLazyInitializer()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionproperty.skiplazyinitialization.php" class="methodname">ReflectionProperty::skipLazyInitialization()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionproperty.setrawvaluewithoutlazyinitialization.php" class="methodname">ReflectionProperty::setRawValueWithoutLazyInitialization()</a></span>
    </li>
    <li>
     <strong><code><a href="class.reflectionclass.php#reflectionclass.constants.skip-initialization-on-serialize">ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE</a></code></strong>
    </li>
    <li>
     <strong><code><a href="class.reflectionclass.php#reflectionclass.constants.skip-destructor">ReflectionClass::SKIP_DESTRUCTOR</a></code></strong>
    </li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.soap">
  <h3 class="title">SOAP</h3>

  <p class="simpara">
   Se añadió soporte para la notación clark para espacios de nombres en el mapa de clases.
   Ahora es posible especificar entradas en un mapa de clases con notación clark
   para resolver un tipo con un espacio de nombres específico a una clase específica.
   Por ejemplo: <code class="code">&#039;{http://example.com}foo&#039; =&gt; &#039;FooClass&#039;</code>.
  </p>

  <p class="simpara">
   Las instancias de <span class="interfacename"><a href="class.datetimeinterface.php" class="interfacename">DateTimeInterface</a></span> que se pasan a <code class="literal">xsd:datetime</code> o elementos similares ahora
   se serializan como tales en lugar de ser serializadas como un string vacío.
  </p>

  <p class="simpara">
   La persistencia de la sesión ahora funciona con un módulo de sesión compartida.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.standard">
  <h3 class="title">Standard</h3>

  
  <p class="simpara">
   
   Se añadió un nuevo enum <span class="classname"><a href="enum.roundingmode.php" class="classname">RoundingMode</a></span> con un nombre más claro
   y una mejor capacidad de descubrimiento en comparación con las constantes
   <strong><code><a href="math.constants.php#constant.php-round-half-up">PHP_ROUND_<span class="replaceable">*</span></a></code></strong>.
   Además, se añadieron cuatro nuevos modos de redondeo que solo están disponibles a través de
   el nuevo enum <span class="classname"><a href="enum.roundingmode.php" class="classname">RoundingMode</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.xsl">
  <h3 class="title">XSL</h3>

  <p class="simpara">
   Ahora es posible usar parámetros que contengan tanto comillas simples como dobles.
  </p>

  
  <p class="simpara">
   Ahora es posible pasar cualquier callable a
   <span class="methodname"><a href="xsltprocessor.registerphpfunctions.php" class="methodname">XSLTProcessor::registerPhpFunctions()</a></span>.
   
  </p>

  <p class="simpara">
   Se añadieron <span class="property"><a href="class.xsltprocessor.php#xsltprocessor.props.maxtemplatedepth">XSLTProcessor::$maxTemplateDepth</a></span> y
   <span class="property"><a href="class.xsltprocessor.php#xsltprocessor.props.maxtemplatevars">XSLTProcessor::$maxTemplateVars</a></span>
   para controlar la profundidad de recursión de la evaluación de plantillas XSL.
  </p>
 </div>

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

  <p class="simpara">
   Se añadió la constante <strong><code><a href="zip.constants.php#ziparchive.constants.er-truncated-zip">ZipArchive::ER_TRUNCATED_ZIP</a></code></strong>,
   que fue añadida en libzip 1.11.
  </p>
 </div>

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