<?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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">// Modo coercitivo
</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">)
{
    return </span><span style="color: #0000BB">array_sum</span><span style="color: #007700">(</span><span style="color: #0000BB">$enteros</span><span style="color: #007700">);
}

</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></code></pre></div>
   </div>

   <p class="simpara">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, se debe colocar una sola directiva <a href="control-structures.declare.php" class="link"><code class="literal">declare</code></a> en la parte
   superior del fichero. Esto significa que el modo estricto de declaración de tipo escalar se configura
   por fichero. 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">
   En la referencia se pueden encontrar una documentación completa y ejemplos de declaraciones de
   tipo
   escalar: <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 devuelve
   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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</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
{
    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">{
        return </span><span style="color: #0000BB">array_sum</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);
    }, </span><span style="color: #0000BB">$arrays</span><span style="color: #007700">);
}

</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></code></pre></div>
   </div>

   <p class="simpara">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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">// Recupera el valor de $_GET['usuario'] y devuelve 'ninguno'
// si no existe.
</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">;
</span><span style="color: #FF8000">// Esto es equivalente a:
</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">;

</span><span style="color: #FF8000">// El operador permite encadenar: esto devolverá el primer
// valor definido respectivamente en $_GET['usuario'], $_POST['usuario']
// y 'ninguno'.
</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">;
</span><span style="color: #0000BB">?&gt;</span></code></pre></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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">// Enteros
</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
</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
</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

// Números de coma flotante
</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
</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
</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

// Strings
</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
</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
</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
</span><span style="color: #0000BB">?&gt;</span></code></pre></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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
define</span><span style="color: #007700">(</span><span style="color: #DD0000">'ANIMALES'</span><span style="color: #007700">, [
    </span><span style="color: #DD0000">'perro'</span><span style="color: #007700">,
    </span><span style="color: #DD0000">'gato'</span><span style="color: #007700">,
    </span><span style="color: #DD0000">'pájaro'
</span><span style="color: #007700">]);

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"
</span><span style="color: #0000BB">?&gt;</span></code></pre></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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #007700">interface </span><span style="color: #0000BB">Logger </span><span style="color: #007700">{
    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">);
}

class </span><span style="color: #0000BB">Application </span><span style="color: #007700">{
    private </span><span style="color: #0000BB">$logger</span><span style="color: #007700">;

    public function </span><span style="color: #0000BB">getLogger</span><span style="color: #007700">(): </span><span style="color: #0000BB">Logger </span><span style="color: #007700">{
         return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">logger</span><span style="color: #007700">;
    }

    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">) {
         </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">;
    }
}

</span><span style="color: #0000BB">$app </span><span style="color: #007700">= new </span><span style="color: #0000BB">Application</span><span style="color: #007700">;
</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">{
    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">) {
        echo </span><span style="color: #0000BB">$msg</span><span style="color: #007700">;
    }
});

</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">());
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
   </div>

   <p class="simpara">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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</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">;
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">;

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">;

echo &lt;&lt;&lt;EOT
</span><span style="color: #DD0000">\u{01f418}
</span><span style="color: #007700">EOT;

</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
   </div>

   <p class="simpara">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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</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">;}

</span><span style="color: #FF8000">// Código antes de PHP 7
</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">;};
</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
</span><span style="color: #007700">echo </span><span style="color: #0000BB">$getXCB</span><span style="color: #007700">();

</span><span style="color: #FF8000">// Código PHP 7+
</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">;};
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></code></pre></div>
   </div>

   <p class="simpara">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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</span><span style="color: #FF8000">// Convierte todos los objetos en un objeto __PHP_Incomplete_Class
</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">]);

</span><span style="color: #FF8000">// Convierte todos los objetos en un objeto __PHP_Incomplete_Class excepto aquellos de MyClass y MyClass2
</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">]]);

</span><span style="color: #FF8000">// Comportamiento por defecto (el mismo que cuando se omite el segundo argumento) que acepta todas las clases
</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></code></pre></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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

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">);
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">);
</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></code></pre></div>
   </div>

   <p class="simpara">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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
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">);

class </span><span style="color: #0000BB">CustomError </span><span style="color: #007700">extends </span><span style="color: #0000BB">AssertionError </span><span style="color: #007700">{}

</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">));
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
   </div>

   <p class="simpara">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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">// Código antes de PHP 7
</span><span style="color: #007700">use </span><span style="color: #0000BB">some\namespace\ClassA</span><span style="color: #007700">;
use </span><span style="color: #0000BB">some\namespace\ClassB</span><span style="color: #007700">;
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">;

use function </span><span style="color: #0000BB">some\namespace\fn_a</span><span style="color: #007700">;
use function </span><span style="color: #0000BB">some\namespace\fn_b</span><span style="color: #007700">;
use function </span><span style="color: #0000BB">some\namespace\fn_c</span><span style="color: #007700">;

use const </span><span style="color: #0000BB">some\namespace\ConstA</span><span style="color: #007700">;
use const </span><span style="color: #0000BB">some\namespace\ConstB</span><span style="color: #007700">;
use const </span><span style="color: #0000BB">some\namespace\ConstC</span><span style="color: #007700">;

</span><span style="color: #FF8000">// Código PHP 7+
</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">};
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">};
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">};
</span><span style="color: #0000BB">?&gt;</span></code></pre></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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

$gen </span><span style="color: #007700">= (function() {
    yield </span><span style="color: #0000BB">1</span><span style="color: #007700">;
    yield </span><span style="color: #0000BB">2</span><span style="color: #007700">;

    return </span><span style="color: #0000BB">3</span><span style="color: #007700">;
})();

foreach (</span><span style="color: #0000BB">$gen </span><span style="color: #007700">as </span><span style="color: #0000BB">$val</span><span style="color: #007700">) {
    echo </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
}

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></code></pre></div>
   </div>

   <p class="simpara">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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #007700">function </span><span style="color: #0000BB">gen</span><span style="color: #007700">()
{
    yield </span><span style="color: #0000BB">1</span><span style="color: #007700">;
    yield </span><span style="color: #0000BB">2</span><span style="color: #007700">;
    yield from </span><span style="color: #0000BB">gen2</span><span style="color: #007700">();
}

function </span><span style="color: #0000BB">gen2</span><span style="color: #007700">()
{
    yield </span><span style="color: #0000BB">3</span><span style="color: #007700">;
    yield </span><span style="color: #0000BB">4</span><span style="color: #007700">;
}

foreach (</span><span style="color: #0000BB">gen</span><span style="color: #007700">() as </span><span style="color: #0000BB">$val</span><span style="color: #007700">)
{
    echo </span><span style="color: #0000BB">$val</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;
}
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
   </div>

   <p class="simpara">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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
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">));
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
   </div>

   <p class="simpara">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 fichero 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 ficheros de sesión solo si los
   datos de sesión se han actualizado, y la
   opción <code class="literal">read_and_close</code>, que solo se puede pasar 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 se deben leer 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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
session_start</span><span style="color: #007700">([
    </span><span style="color: #DD0000">'cache_limiter' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'private'</span><span style="color: #007700">,
    </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">,
]);
</span><span style="color: #0000BB">?&gt;</span></code></pre></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, se
   debía ejecutar una función de retrollamada por cada expresión regular, lo que requería
   que dicha función de retrollamada estuviera repleta de bifurcaciones (branching).
  </p>

  <p class="para">
   Ahora, las funciones de retrollamada se pueden registrar para cada expresión regular usando
   un array asociativo, donde la clave es una expresión regular que tiene la función de retrollamada 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
   integers y strings seguros 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); ?>