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

contributors($setup);

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

 <div class="sect2" id="migration70.new-features.scalar-type-declarations">
  <h3 class="title">Declaraciones de tipo escalar</h3>

  <p class="para">
   Las <a href="language.types.declarations.php" class="link">declaraciones de tipo</a>
   escalar vienen en dos modos: coercitivo (por defecto) o estricto. Los tipos de parámetros
   siguientes pueden ser forzados (ya sea coercitivo o estricto): los strings
   (<span class="type"><a href="language.types.string.php" class="type string">string</a></span>), los enteros (<code class="literal">int</code>),
   los decimales (<span class="type"><a href="language.types.float.php" class="type float">float</a></span>) y los valores booleanos (<code class="literal">bool</code>).
   Complementan los otros tipos introducidos en PHP 5: los nombres de clases, las interfaces,
   los arrays (<span class="type"><a href="language.types.array.php" class="type array">array</a></span>) y las funciones invocables (<span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>).
  </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: #FF8000">// Modo coercitivo<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">sumaEnteros</span><span style="color: #007700">(</span><span style="color: #0000BB">int </span><span style="color: #007700">...</span><span style="color: #0000BB">$enteros</span><span style="color: #007700">)<br />{<br />    return </span><span style="color: #0000BB">array_sum</span><span style="color: #007700">(</span><span style="color: #0000BB">$enteros</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sumaEnteros</span><span style="color: #007700">(</span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #DD0000">'3'</span><span style="color: #007700">, </span><span style="color: #0000BB">4.1</span><span style="color: #007700">));</span></span></code></div>
   </div>

   <p class="para">El ejemplo anterior mostrará:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(9)
</pre></div>
   </div>
  </div>

  <p class="para">
   Para activar el modo estricto, una sola directiva <a href="control-structures.declare.php" class="link"><code class="literal">declare</code></a> debe ser colocada
   en la parte superior del archivo. Esto significa que el modo estricto de declaración de tipo
   escalar se configura por archivo. La directiva no solo afecta a la
   declaración de parámetros, sino también al tipo de retorno de la función (ver
   <a href="language.types.declarations.php" class="link">las declaraciones de tipo de retorno</a>
   en las funciones de PHP y las que provienen de extensiones).
  </p>

  <p class="para">
   Una documentación completa y ejemplos de declaraciones de tipo escalar
   pueden encontrarse en la referencia: <a href="language.types.declarations.php" class="link">Declaraciones de tipo</a>.
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.return-type-declarations">
  <h3 class="title">Declaraciones de tipo de retorno</h3>

  <p class="para">
   PHP 7 añade soporte para
   <a href="language.types.declarations.php" class="link">declaraciones de tipo de retorno</a>.
   Similar a las
   <a href="language.types.declarations.php" class="link">declaraciones de tipo de argumento</a>,
   las declaraciones de tipo de retorno especifican el tipo del valor que será devuelto por la función.
   Los mismos
   <a href="language.types.declarations.php" class="link">tipos</a>
   que están disponibles para las declaraciones de tipo de retorno están disponibles para las declaraciones
   de tipo de argumento.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">sumaArrays</span><span style="color: #007700">(array ...</span><span style="color: #0000BB">$arrays</span><span style="color: #007700">): array<br />{<br />    return </span><span style="color: #0000BB">array_map</span><span style="color: #007700">(function(array </span><span style="color: #0000BB">$array</span><span style="color: #007700">): </span><span style="color: #0000BB">int </span><span style="color: #007700">{<br />        return </span><span style="color: #0000BB">array_sum</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br />    }, </span><span style="color: #0000BB">$arrays</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">sumaArrays</span><span style="color: #007700">([</span><span style="color: #0000BB">1</span><span style="color: #007700">,</span><span style="color: #0000BB">2</span><span style="color: #007700">,</span><span style="color: #0000BB">3</span><span style="color: #007700">], [</span><span style="color: #0000BB">4</span><span style="color: #007700">,</span><span style="color: #0000BB">5</span><span style="color: #007700">,</span><span style="color: #0000BB">6</span><span style="color: #007700">], [</span><span style="color: #0000BB">7</span><span style="color: #007700">,</span><span style="color: #0000BB">8</span><span style="color: #007700">,</span><span style="color: #0000BB">9</span><span style="color: #007700">]));</span></span></code></div>
   </div>

   <p class="para">El ejemplo anterior mostrará:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Array
(
    [0] =&gt; 6
    [1] =&gt; 15
    [2] =&gt; 24
)
</pre></div>
   </div>
  </div>

  <p class="para">
   Una documentación completa y ejemplos de declaraciones de tipo de retorno
   pueden encontrarse en la referencia: <a href="language.types.declarations.php" class="link">Declaraciones de tipo de retorno</a>.
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.null-coalesce-op">
  <h3 class="title">El operador de fusión nula</h3>

  <p class="para">
   El operador de fusión nula (<code class="literal">??</code>) se ha añadido como un azúcar
   sintáctico para los casos de uso más comunes de necesitar una tercera conjunción
   con la función <span class="function"><a href="function.isset.php" class="function">isset()</a></span>. Devuelve el primer operando si existe
   y no tiene un valor <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>; y devuelve el segundo operando en caso contrario.
  </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: #FF8000">// Recupera el valor de $_GET['usuario'] y devuelve 'ninguno'<br />// si no existe.<br /></span><span style="color: #0000BB">$identificador </span><span style="color: #007700">= </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'usuario'</span><span style="color: #007700">] ?? </span><span style="color: #DD0000">'ninguno'</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Esto es equivalente a:<br /></span><span style="color: #0000BB">$identificador </span><span style="color: #007700">= isset(</span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'usuario'</span><span style="color: #007700">]) ? </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'usuario'</span><span style="color: #007700">] : </span><span style="color: #DD0000">'ninguno'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// El operador permite encadenar: esto devolverá el primer<br />// valor definido respectivamente en $_GET['usuario'], $_POST['usuario']<br />// y 'ninguno'.<br /></span><span style="color: #0000BB">$identificador </span><span style="color: #007700">= </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'usuario'</span><span style="color: #007700">] ?? </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'usuario'</span><span style="color: #007700">] ?? </span><span style="color: #DD0000">'ninguno'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  
 </div>

 <div class="sect2" id="migration70.new-features.spaceship-op">
  <h3 class="title">El operador nave espacial</h3>
  <p class="para">
   El operador nave espacial se utiliza para comparar dos expresiones.
   Devuelve -1, 0 o 1 cuando <var class="varname">$a</var> es respectivamente menor,
   igual o mayor que <var class="varname">$b</var>. Las comparaciones se realizan
   según
   <a href="types.comparisons.php" class="link">las reglas de comparación de tipos</a>
   habituales de PHP.
  </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: #FF8000">// Enteros<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">2</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">2 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /><br />// Números de coma flotante<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1.5 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1.5</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1.5 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">2.5</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">2.5 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1.5</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /><br />// Strings<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"a" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"a"</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"a" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"b" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"a"</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  
 </div>

 <div class="sect2" id="migration70.new-features.define-array">
  <h3 class="title">Arrays constantes con <span class="function"><a href="function.define.php" class="function">define()</a></span></h3>

  <p class="para">
   Los arrays (<span class="type"><a href="language.types.array.php" class="type Array">Array</a></span>) constantes ahora pueden ser definidos
   con la función <span class="function"><a href="function.define.php" class="function">define()</a></span>. En PHP 5.6, solo podían
   ser definidos con <a href="language.constants.syntax.php" class="link"><code class="literal">const</code></a>.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />define</span><span style="color: #007700">(</span><span style="color: #DD0000">'ANIMALES'</span><span style="color: #007700">, [<br />    </span><span style="color: #DD0000">'perro'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'gato'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'pájaro'<br /></span><span style="color: #007700">]);<br /><br />echo </span><span style="color: #0000BB">ANIMALES</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]; </span><span style="color: #FF8000">// muestra "gato"<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="migration70.new-features.anonymous-classes">
  <h3 class="title">Clases anónimas</h3>

  <p class="para">
   Se ha añadido soporte para clases anónimas a través de la instanciación
   <code class="literal">new class</code>. Esto puede ser utilizado en lugar de definir
   toda una clase para objetos desechables:
  </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">interface </span><span style="color: #0000BB">Logger </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">string $msg</span><span style="color: #007700">);<br />}<br /><br />class </span><span style="color: #0000BB">Application </span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$logger</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">getLogger</span><span style="color: #007700">(): </span><span style="color: #0000BB">Logger </span><span style="color: #007700">{<br />         return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">logger</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">setLogger</span><span style="color: #007700">(</span><span style="color: #0000BB">Logger $logger</span><span style="color: #007700">) {<br />         </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">logger </span><span style="color: #007700">= </span><span style="color: #0000BB">$logger</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$app </span><span style="color: #007700">= new </span><span style="color: #0000BB">Application</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$app</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setLogger</span><span style="color: #007700">(new class implements </span><span style="color: #0000BB">Logger </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">log</span><span style="color: #007700">(</span><span style="color: #0000BB">string $msg</span><span style="color: #007700">) {<br />        echo </span><span style="color: #0000BB">$msg</span><span style="color: #007700">;<br />    }<br />});<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$app</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getLogger</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">El ejemplo anterior mostrará:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
object(class@anonymous)#2 (0) {
}
</pre></div>
   </div>
  </div>

  <p class="para">
   La documentación completa puede encontrarse en
   <a href="language.oop5.anonymous.php" class="link">la referencia de clases anónimas</a>.
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.unicode-codepoint-escape-syntax">
  <h3 class="title">Sintaxis de escape de punto de código Unicode</h3>

  <p class="para">
   Toma un punto de código Unicode en forma hexadecimal, en una cadena
   entre comillas dobles o una sintaxis heredoc, para convertirlo
   en UTF-8. Cualquier punto de código válido es aceptado,
   siendo opcionales los ceros iniciales.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"\u{aa}"</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"\u{0000aa}"</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #DD0000">"\u{9999}"</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br />echo &lt;&lt;&lt;EOT<br /></span><span style="color: #DD0000">\u{01f418}<br /></span><span style="color: #007700">EOT;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">El ejemplo anterior mostrará:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
ª
ª (misma visualización que la línea anterior pero con ceros iniciales)
香
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect2" id="migration70.new-features.closure-call-method">
  <h3 class="title"><span class="methodname"><a href="closure.call.php" class="methodname">Closure::call()</a></span></h3>

  <p class="para">
   El método <span class="methodname"><a href="closure.call.php" class="methodname">Closure::call()</a></span> se ha vuelto más eficiente.
   Una forma más corta de enlazar temporalmente una clausura al ámbito de un
   objeto e invocarla.
  </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">A </span><span style="color: #007700">{private </span><span style="color: #0000BB">$x </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;}<br /><br /></span><span style="color: #FF8000">// Código antes de PHP 7<br /></span><span style="color: #0000BB">$getX </span><span style="color: #007700">= function() {return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">x</span><span style="color: #007700">;};<br /></span><span style="color: #0000BB">$getXCB </span><span style="color: #007700">= </span><span style="color: #0000BB">$getX</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bindTo</span><span style="color: #007700">(new </span><span style="color: #0000BB">A</span><span style="color: #007700">, </span><span style="color: #DD0000">'A'</span><span style="color: #007700">); </span><span style="color: #FF8000">// clausura intermedia<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$getXCB</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// Código PHP 7+<br /></span><span style="color: #0000BB">$getX </span><span style="color: #007700">= function() {return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">x</span><span style="color: #007700">;};<br />echo </span><span style="color: #0000BB">$getX</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">call</span><span style="color: #007700">(new </span><span style="color: #0000BB">A</span><span style="color: #007700">);</span></span></code></div>
   </div>

   <p class="para">El ejemplo anterior mostrará:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
1
1
</pre></div>
   </div>
  </div>
 </div>
 <div class="sect2" id="migration70.new-features.filtered-unserialize">
  <h3 class="title"><span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span> filtrado</h3>

  <p class="para">
   Esta funcionalidad tiene como objetivo garantizar una mayor seguridad cuando
   se realiza la deserialización de objetos con datos no confiables.
   Evita posibles inyecciones de código permitiendo al desarrollador
   crear una lista blanca de las clases que pueden ser deserializadas.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// Convierte todos los objetos en un objeto __PHP_Incomplete_Class<br /></span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">unserialize</span><span style="color: #007700">(</span><span style="color: #0000BB">$foo</span><span style="color: #007700">, [</span><span style="color: #DD0000">"allowed_classes" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">false</span><span style="color: #007700">]);<br /><br /></span><span style="color: #FF8000">// Convierte todos los objetos en un objeto __PHP_Incomplete_Class<br />// excepto aquellos de MyClass y MyClass2<br /></span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">unserialize</span><span style="color: #007700">(</span><span style="color: #0000BB">$foo</span><span style="color: #007700">, [</span><span style="color: #DD0000">"allowed_classes" </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">"MyClass"</span><span style="color: #007700">, </span><span style="color: #DD0000">"MyClass2"</span><span style="color: #007700">]]);<br /><br /></span><span style="color: #FF8000">// Comportamiento por defecto (el mismo que cuando se omite el segundo argumento)<br />// que acepta todas las clases<br /></span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">unserialize</span><span style="color: #007700">(</span><span style="color: #0000BB">$foo</span><span style="color: #007700">, [</span><span style="color: #DD0000">"allowed_classes" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">true</span><span style="color: #007700">]);</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="migration70.new-features.intlchar">
  <h3 class="title"><span class="classname"><a href="class.intlchar.php" class="classname">IntlChar</a></span></h3>

  <p class="para">
   La nueva clase <span class="classname"><a href="class.intlchar.php" class="classname">IntlChar</a></span> expone
   la funcionalidad ICU adicional. La clase en sí define un número de métodos
   estáticos y constantes que pueden ser utilizados para manipular los
   caracteres Unicode.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />printf</span><span style="color: #007700">(</span><span style="color: #DD0000">'%x'</span><span style="color: #007700">, </span><span style="color: #0000BB">IntlChar</span><span style="color: #007700">::</span><span style="color: #0000BB">CODEPOINT_MAX</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">IntlChar</span><span style="color: #007700">::</span><span style="color: #0000BB">charName</span><span style="color: #007700">(</span><span style="color: #DD0000">'@'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">IntlChar</span><span style="color: #007700">::</span><span style="color: #0000BB">ispunct</span><span style="color: #007700">(</span><span style="color: #DD0000">'!'</span><span style="color: #007700">));</span></span></code></div>
   </div>

   <p class="para">El ejemplo anterior mostrará:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
10ffff
COMMERCIAL AT
bool(true)
</pre></div>
   </div>
  </div>

  <p class="para">
   Para usar esta clase, debe instalar la extensión
   <a href="book.intl.php" class="link">Intl</a>.
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.expectations">
  <h3 class="title">Expectativas</h3>

  <p class="para">
   Las expectativas son
   una mejora retrocompatible a la antigua función
   <span class="function"><a href="function.assert.php" class="function">assert()</a></span>. Ofrecen aserciones de muy bajo costo en el código de producción y permiten lanzar excepciones
   personalizadas cuando la aserción falla.
  </p>

  <p class="para">
   Aunque la antigua API sigue siendo mantenida por razones de
   compatibilidad, la función <span class="function"><a href="function.assert.php" class="function">assert()</a></span> ahora es
   una construcción del lenguaje, permitiendo que el primer parámetro sea
   una expresión en lugar de un <span class="type"><a href="language.types.string.php" class="type string">string</a></span> a evaluar o un
   <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> a probar.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />ini_set</span><span style="color: #007700">(</span><span style="color: #DD0000">'assert.exception'</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br />class </span><span style="color: #0000BB">CustomError </span><span style="color: #007700">extends </span><span style="color: #0000BB">AssertionError </span><span style="color: #007700">{}<br /><br /></span><span style="color: #0000BB">assert</span><span style="color: #007700">(</span><span style="color: #0000BB">false</span><span style="color: #007700">, new </span><span style="color: #0000BB">CustomError</span><span style="color: #007700">(</span><span style="color: #DD0000">'Un mensaje de error'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">El ejemplo anterior mostrará:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Fatal error: Uncaught CustomError: Un mensaje de error
</pre></div>
   </div>
  </div>

  <p class="para">
   Se pueden encontrar más detalles sobre esta funcionalidad, incluyendo cómo configurarla
   en entornos de desarrollo y producción, en la sección de expectativas
   en la referencia de la función <span class="function"><a href="function.assert.php" class="function">assert()</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.group-use-declarations">
  <h3 class="title">Agrupar las declaraciones <code class="literal">use</code></h3>

  <p class="para">
   Las clases, funciones y constantes importadas desde el mismo <a href="language.namespaces.definition.php" class="link"><code class="literal">namespace</code></a>
   ahora pueden ser agrupadas en una sola instrucción <a href="language.namespaces.importing.php" class="link"><code class="literal">use</code></a>.
  </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: #FF8000">// Código antes de PHP 7<br /></span><span style="color: #007700">use </span><span style="color: #0000BB">some\namespace\ClassA</span><span style="color: #007700">;<br />use </span><span style="color: #0000BB">some\namespace\ClassB</span><span style="color: #007700">;<br />use </span><span style="color: #0000BB">some\namespace\ClassC </span><span style="color: #007700">as </span><span style="color: #0000BB">C</span><span style="color: #007700">;<br /><br />use function </span><span style="color: #0000BB">some\namespace\fn_a</span><span style="color: #007700">;<br />use function </span><span style="color: #0000BB">some\namespace\fn_b</span><span style="color: #007700">;<br />use function </span><span style="color: #0000BB">some\namespace\fn_c</span><span style="color: #007700">;<br /><br />use const </span><span style="color: #0000BB">some\namespace\ConstA</span><span style="color: #007700">;<br />use const </span><span style="color: #0000BB">some\namespace\ConstB</span><span style="color: #007700">;<br />use const </span><span style="color: #0000BB">some\namespace\ConstC</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Código PHP 7+<br /></span><span style="color: #007700">use </span><span style="color: #0000BB">some\namespace</span><span style="color: #007700">\{</span><span style="color: #0000BB">ClassA</span><span style="color: #007700">, </span><span style="color: #0000BB">ClassB</span><span style="color: #007700">, </span><span style="color: #0000BB">ClassC </span><span style="color: #007700">as </span><span style="color: #0000BB">C</span><span style="color: #007700">};<br />use function </span><span style="color: #0000BB">some\namespace</span><span style="color: #007700">\{</span><span style="color: #0000BB">fn_a</span><span style="color: #007700">, </span><span style="color: #0000BB">fn_b</span><span style="color: #007700">, </span><span style="color: #0000BB">fn_c</span><span style="color: #007700">};<br />use const </span><span style="color: #0000BB">some\namespace</span><span style="color: #007700">\{</span><span style="color: #0000BB">ConstA</span><span style="color: #007700">, </span><span style="color: #0000BB">ConstB</span><span style="color: #007700">, </span><span style="color: #0000BB">ConstC</span><span style="color: #007700">};<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="migration70.new-features.generator-return-expressions">
  <h3 class="title">Expresiones de retorno de generador</h3>

  <p class="para">
   Esta funcionalidad se basa en la funcionalidad de generador introducida en PHP 5.5.
   Permite usar una instrucción <code class="literal">return</code> en un generador
   para devolver una expresión final (el retorno por referencia no está permitido).
   Este valor puede ser extraído usando el nuevo método
   <code class="literal">Generator::getReturn()</code>, que solo puede ser usado cuando
   el generador ha terminado de producir valores.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$gen </span><span style="color: #007700">= (function() {<br />    yield </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />    yield </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /><br />    return </span><span style="color: #0000BB">3</span><span style="color: #007700">;<br />})();<br /><br />foreach (</span><span style="color: #0000BB">$gen </span><span style="color: #007700">as </span><span style="color: #0000BB">$val</span><span style="color: #007700">) {<br />    echo </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #0000BB">$gen</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getReturn</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;</span></span></code></div>
   </div>

   <p class="para">El ejemplo anterior mostrará:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
1
2
3
</pre></div>
   </div>
  </div>

  <p class="para">
   Es muy práctico poder devolver explícitamente un valor final
   de un generador. Esto permite que un valor final, susceptible de ser manejado
   especialmente por el código cliente que ejecuta el generador, sea devuelto por el generador
   (posiblemente a partir de alguna forma de cálculo de corrutina). Esto es mucho más simple
   que forzar al código cliente a verificar primero si el valor final ha sido producido,
   y luego manejar específicamente el valor cuando sea el caso.
  </p>
 </div>
 <div class="sect2" id="migration70.new-features.generator-delegation">
  <h3 class="title">Delegación de generador</h3>

  <p class="para">
   Los generadores ahora pueden ser delegados automáticamente a otro generador,
   un objeto <span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span> o un <span class="type"><a href="language.types.array.php" class="type array">array</a></span>,
   usando <a href="language.generators.syntax.php#control-structures.yield.from" class="link"><code class="literal">yield from</code></a>, sin necesidad de recurrir a un código repetitivo.
  </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">function </span><span style="color: #0000BB">gen</span><span style="color: #007700">()<br />{<br />    yield </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />    yield </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />    yield from </span><span style="color: #0000BB">gen2</span><span style="color: #007700">();<br />}<br /><br />function </span><span style="color: #0000BB">gen2</span><span style="color: #007700">()<br />{<br />    yield </span><span style="color: #0000BB">3</span><span style="color: #007700">;<br />    yield </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br />}<br /><br />foreach (</span><span style="color: #0000BB">gen</span><span style="color: #007700">() as </span><span style="color: #0000BB">$val</span><span style="color: #007700">)<br />{<br />    echo </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">El ejemplo anterior mostrará:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
1
2
3
4
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect2" id="migration70.new-features.intdiv">
  <h3 class="title">División de enteros con <span class="function"><a href="function.intdiv.php" class="function">intdiv()</a></span></h3>

  <p class="para">
   La nueva función <span class="function"><a href="function.intdiv.php" class="function">intdiv()</a></span> devuelve el resultado de la división
   de enteros realizada sobre sus operandos.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">intdiv</span><span style="color: #007700">(</span><span style="color: #0000BB">10</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">El ejemplo anterior mostrará:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(3)
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect2" id="migration70.new-features.session-options">
  <h3 class="title">Opciones de sesión</h3>

  <p class="para">
   La función <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span> ahora acepta un <span class="type"><a href="language.types.array.php" class="type array">array</a></span>
   de opciones que anulan
   <a href="session.configuration.php" class="link">las directivas de configuración de sesión</a>
   configuradas manualmente en el archivo php.ini.
  </p>

  <p class="para">
   Estas opciones también han extendido el soporte para la opción
   <a href="session.configuration.php#ini.session.lazy-write" class="link">session.lazy_write</a>,
   que está habilitada por defecto y hace que PHP sobrescriba los archivos de sesión
   solo si los datos de sesión han sido actualizados, y la opción
   <code class="literal">read_and_close</code>, que solo puede ser pasada a la función
   <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span> para indicar si los datos de sesión
   deben ser leídos antes de que la sesión se cierre sin cambios.
  </p>

  <p class="para">
   Por ejemplo, para establecer <a href="session.configuration.php#ini.session.cache-limiter" class="link">session.cache_limiter</a>
   a <code class="literal">private</code> y cerrar inmediatamente la sesión después de leerla:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />session_start</span><span style="color: #007700">([<br />    </span><span style="color: #DD0000">'cache_limiter' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'private'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'read_and_close' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">true</span><span style="color: #007700">,<br />]);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="migration70.new-features.preg-repace-callback-array-function">
  <h3 class="title"><span class="function"><a href="function.preg-replace-callback-array.php" class="function">preg_replace_callback_array()</a></span></h3>

  <p class="para">
   La nueva función <span class="function"><a href="function.preg-replace-callback-array.php" class="function">preg_replace_callback_array()</a></span>
   permite que el código se escriba de manera más limpia usando la función
   <span class="function"><a href="function.preg-replace-callback.php" class="function">preg_replace_callback()</a></span>. Antes de PHP 7, las funciones de devolución de llamada (callback)
   debían ser ejecutadas por expresión regular, lo que requería que la función de devolución de llamada
   estuviera salpicada con muchas ramificaciones.
  </p>

  <p class="para">
   Ahora, las funciones de devolución de llamada pueden ser registradas para cada expresión
   regular usando un array asociativo, donde la clave es una expresión regular
   que tiene la función de devolución de llamada como valor.
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.csprng-functions">
  <h3 class="title">Funciones CSPRNG</h3>

  <p class="para">
   Se han añadido dos nuevas funciones para generar criptográficamente enteros
   y strings seguras de manera multiplataforma:
   <span class="function"><a href="function.random-bytes.php" class="function">random_bytes()</a></span> y <span class="function"><a href="function.random-int.php" class="function">random_int()</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.list-arrayaccess">
  <h3 class="title">
   La función <span class="function"><a href="function.list.php" class="function">list()</a></span> ahora puede desempaquetar objetos que implementan
   <span class="classname"><a href="class.arrayaccess.php" class="classname">ArrayAccess</a></span>
  </h3>

  <p class="para">
   Anteriormente, la función <span class="function"><a href="function.list.php" class="function">list()</a></span> no podía operar al 100% sobre objetos
   que implementaban <span class="classname"><a href="class.arrayaccess.php" class="classname">ArrayAccess</a></span>. Ahora, esto ha sido corregido.
  </p>
 </div>

 <div class="sect2" id="migration70.new-features.others">
  <h3 class="title">Otras funcionalidades</h3>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     Se ha añadido acceso a los miembros de la clase (atributos y métodos) durante la clonación.
     Ejemplo, <code class="literal">(clone $foo)-&gt;bar()</code>.
    </span>
   </li>
  </ul>
 </div>
</div><?php manual_footer($setup); ?>