<?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.incompatible.php',
    1 => 'Cambios incompatibles con versiones anteriores',
    2 => 'Cambios incompatibles con versiones anteriores',
  ),
  'up' => 
  array (
    0 => 'migration70.php',
    1 => 'Migraci&oacute;n de PHP 5.6.x a PHP 7.0.x',
  ),
  'prev' => 
  array (
    0 => 'migration70.php',
    1 => 'Migraci&oacute;n de PHP 5.6.x a PHP 7.0.x',
  ),
  'next' => 
  array (
    0 => 'migration70.new-features.php',
    1 => 'Nuevas caracter&iacute;sticas',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'appendices/migration70/incompatible.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

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

 



<div class="sect2" id="migration70.incompatible.error-handling">
 <h3 class="title">Modificaciones aportadas a la gestión de errores y excepciones</h3>

 <p class="para">
  Numerosos errores fatales y recuperables han sido convertidos en excepciones
  en PHP 7. Estas excepciones de error heredan de la clase <span class="classname"><a href="class.error.php" class="classname">Error</a></span>,
  que a su vez implementa la interfaz <span class="classname"><a href="class.throwable.php" class="classname">Throwable</a></span> (la nueva
  interfaz base de la que todas las excepciones heredan).
 </p>

 <p class="para">
  Esto significa que los manejadores de errores personalizados pueden no ser
  invocados ya que las excepciones pueden ser lanzadas en su lugar (provocando
  nuevos errores irrecuperables para las excepciones <span class="classname"><a href="class.error.php" class="classname">Error</a></span>
  no interceptadas).
 </p>

 <p class="para">
  Una descripción más completa de cómo funcionan los errores en PHP 7
  se encuentra <a href="language.errors.php7.php" class="link"> en la página de errores de PHP 7</a>.
  Esta guía de migración simplemente enumerará los cambios que afectan la
  retrocompatibilidad.
 </p>

 <div class="sect3" id="migration70.incompatible.error-handling.set-exception-handler">
  <h4 class="title">
   <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span> ya no está garantizado para recibir objetos <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span>
  </h4>

  <p class="para">
   El código que implementa un manejador de excepciones inscrito con
   <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span> usando una declaración de tipo
   <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> provocará un error fatal cuando un objeto
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> es lanzado.
  </p>

  <p class="para">
   Si el manejador debe funcionar tanto con PHP 5 como con 7, debería
   eliminar la declaración de tipo del manejador, mientras que el código que se migra
   para funcionar exclusivamente en PHP 7 puede simplemente reemplazar la declaración
   de tipo <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> por <span class="classname"><a href="class.throwable.php" class="classname">Throwable</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">// Código para PHP 5 que fallará.<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">handler</span><span style="color: #007700">(</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) { </span><span style="color: #FF8000">/* ... */ </span><span style="color: #007700">}<br /></span><span style="color: #0000BB">set_exception_handler</span><span style="color: #007700">(</span><span style="color: #DD0000">'handler'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Compatible con PHP 5 y 7.<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$e</span><span style="color: #007700">) { </span><span style="color: #FF8000">/* ... */ </span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">// Solo PHP 7.<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">handler</span><span style="color: #007700">(</span><span style="color: #0000BB">Throwable $e</span><span style="color: #007700">) { </span><span style="color: #FF8000">/* ... */ </span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.error-handling.constructors">
  <h4 class="title">Los constructores internos lanzan excepciones en caso de fallo</h4>

  <p class="para">
   Anteriormente, algunas clases internas devolvían <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> o un objeto
   inutilizable cuando el constructor fallaba. Todas las clases internas
   lanzarán ahora una <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> en este caso de la
   misma manera que las clases de usuario.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.error-handling.parse">
  <h4 class="title">Los errores de análisis lanzan una <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span></h4>

  <p class="para">
   Los errores del analizador ahora lanzan un objeto <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span>.
   El manejo de errores para <span class="function"><a href="function.eval.php" class="function">eval()</a></span> ahora debe incluir
   un bloque <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a> que pueda manejar este error.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.error-handling.strict">
  <h4 class="title">Cambios de severidad de los avisos E_STRICT</h4>

  <p class="para">
   Todos los avisos <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong> han sido reclasificados a otros niveles.
   La constante <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong> se conserva, por lo que las llamadas como
   <code class="literal">error_reporting(E_ALL|E_STRICT)</code> no provocarán errores.
  </p>
  <p class="para">
   <table class="doctable table">
    <caption><strong>Cambios de severidad de los avisos <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong></strong></caption>
     
      <thead>
       <tr>
        <th>Situación</th>
        <th>Nuevo nivel/comportamiento</th>
       </tr>

      </thead>

      <tbody class="tbody">
       <tr>
        <td>Indexación por un recurso</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
       </tr>

       <tr>
        <td>Métodos estáticos abstractos</td>
        <td>Aviso eliminado, no dispara ningún error</td>
       </tr>

       <tr>
        <td>&quot;Redefinir&quot; un constructor</td>
        <td>Aviso eliminado, no dispara ningún error</td>
       </tr>

       <tr>
        <td>Incompatibilidad de firma durante la herencia</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong></td>
       </tr>

       <tr>
        <td>Misma propiedad (compatible) en dos rasgos usados</td>
        <td>Aviso eliminado, no dispara ningún error</td>
       </tr>

       <tr>
        <td>Acceso a una propiedad estática de manera no estática</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
       </tr>

       <tr>
        <td>Solo las variables deben ser asignadas por referencia</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
       </tr>

       <tr>
        <td>Solo las variables deben ser pasadas por referencia</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
       </tr>

       <tr>
        <td>Llamada a métodos no estáticos de manera estática</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-deprecated">E_DEPRECATED</a></code></strong></td>
       </tr>

      </tbody>
     
    </table>

   </p>
 </div>
</div>



 




<div class="sect2" id="migration70.incompatible.variable-handling">
 <h3 class="title">Modificaciones en el manejo de variables</h3>

 <p class="para">
  PHP 7 ahora utiliza un árbol de sintaxis abstracta al analizar los archivos fuente.
  Esto ha permitido numerosas mejoras en el lenguaje que anteriormente eran imposibles debido
  a las limitaciones en el analizador utilizado en versiones anteriores de PHP, pero ha llevado
  a la eliminación de algunos casos especiales por razones de consistencia,
  lo que ha roto la retrocompatibilidad. Estos casos se detallan en esta sección.
 </p>

 <div class="sect3" id="migration70.incompatible.variable-handling.indirect">
  <h4 class="title">
   Modificaciones en el manejo de variables, propiedades y métodos indirectos
  </h4>

  <p class="para">
   El acceso indirecto a variables, propiedades y métodos ahora se evaluará estrictamente
   en orden de izquierda a derecha, en contraste con la combinación anterior de casos especiales.
   La tabla a continuación muestra cómo ha cambiado el orden de evaluación.
  </p>

  <p class="para">
   <table class="doctable table">
    <caption><strong>Evaluación antigua y nueva de expresiones indirectas</strong></caption>
    
     <thead>
      <tr>
       <th>Expresión</th>
       <th>Interpretación PHP 5</th>
       <th>Interpretación PHP 7</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
       <td>
        <code class="code">$$foo[&#039;bar&#039;][&#039;baz&#039;]</code>
       </td>
       <td>
        <code class="code">${$foo[&#039;bar&#039;][&#039;baz&#039;]}</code>
       </td>
       <td>
        <code class="code">($$foo)[&#039;bar&#039;][&#039;baz&#039;]</code>
       </td>
      </tr>

      <tr>
       <td>
        <code class="code">$foo-&gt;$bar[&#039;baz&#039;]</code>
       </td>
       <td>
        <code class="code">$foo-&gt;{$bar[&#039;baz&#039;]}</code>
       </td>
       <td>
        <code class="code">($foo-&gt;$bar)[&#039;baz&#039;]</code>
       </td>
      </tr>

      <tr>
       <td>
        <code class="code">$foo-&gt;$bar[&#039;baz&#039;]()</code>
       </td>
       <td>
        <code class="code">$foo-&gt;{$bar[&#039;baz&#039;]}()</code>
       </td>
       <td>
        <code class="code">($foo-&gt;$bar)[&#039;baz&#039;]()</code>
       </td>
      </tr>

      <tr>
       <td>
        <code class="code">Foo::$bar[&#039;baz&#039;]()</code>
       </td>
       <td>
        <code class="code">Foo::{$bar[&#039;baz&#039;]}()</code>
       </td>
       <td>
        <code class="code">(Foo::$bar)[&#039;baz&#039;]()</code>
       </td>
      </tr>

     </tbody>
    
   </table>

  </p>

  <p class="para">
   El código que utilizaba el antiguo orden de evaluación de derecha a izquierda debe ser reescrito
   para usar explícitamente este orden de evaluación con llaves (ver la columna del medio anterior).
   Esto hará que el código sea compatible con PHP 7.x y retrocompatible con PHP 5.x.
  </p>

  <p class="para">
   Esto también afecta a la palabra clave <a href="language.variables.scope.php#language.variables.scope.global" class="link"><code class="literal">global</code></a>. La sintaxis de llaves puede ser utilizada
   para emular el comportamiento anterior si es necesario:
  </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">f</span><span style="color: #007700">() {<br />    </span><span style="color: #FF8000">// Válido solo en PHP 5.<br />    </span><span style="color: #007700">global $</span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">;<br /><br />    </span><span style="color: #FF8000">// Válido en PHP 5 y 7.<br />    </span><span style="color: #007700">global ${</span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">};<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.variable-handling.list">
  <h4 class="title">Modificaciones en el manejo de <span class="function"><a href="function.list.php" class="function">list()</a></span></h4>

  <div class="sect4" id="migration70.incompatible.variable-handling.list.order">
   <h5 class="title">
    La función <span class="function"><a href="function.list.php" class="function">list()</a></span> ya no asigna variables en orden inverso
   </h5>

   <p class="para">
    <span class="function"><a href="function.list.php" class="function">list()</a></span> ahora asignará valores a las variables en el orden en que se definen,
    en lugar de en orden inverso. En general, esto solo afecta al caso en que <span class="function"><a href="function.list.php" class="function">list()</a></span>
    se usa en conjunción con el operador de array <code class="code">[]</code>, como se ilustra a continuació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">list(</span><span style="color: #0000BB">$a</span><span style="color: #007700">[], </span><span style="color: #0000BB">$a</span><span style="color: #007700">[], </span><span style="color: #0000BB">$a</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">];<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <p class="para">Resultado del ejemplo anterior en PHP 5:</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
array(3) {
  [0]=&gt;
  int(3)
  [1]=&gt;
  int(2)
  [2]=&gt;
  int(1)
}
</pre></div>
    </div>
    <p class="para">Resultado del ejemplo anterior en PHP 7:</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
array(3) {
  [0]=&gt;
  int(1)
  [1]=&gt;
  int(2)
  [2]=&gt;
  int(3)
}
</pre></div>
    </div>
   </div>

   <p class="para">
    En general, se recomienda no depender del orden en que ocurren las asignaciones
    de la función <span class="function"><a href="function.list.php" class="function">list()</a></span>, ya que es un detalle de implementación
    que puede cambiar nuevamente en el futuro.
   </p>
  </div>

  <div class="sect4" id="migration70.incompatible.variable-handling.list.empty">
   <h5 class="title">Las asignaciones vacías de <span class="function"><a href="function.list.php" class="function">list()</a></span> han sido eliminadas</h5>

   <p class="para">
    Las construcciones de <span class="function"><a href="function.list.php" class="function">list()</a></span> ya no pueden estar vacías. Los siguientes elementos
    ya no están permitidos:
   </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">list() = </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />list(,,) = </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />list(</span><span style="color: #0000BB">$x</span><span style="color: #007700">, list(), </span><span style="color: #0000BB">$y</span><span style="color: #007700">) = </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>

  <div class="sect4" id="migration70.incompatible.variable-handling.list.string">
   <h5 class="title"><span class="function"><a href="function.list.php" class="function">list()</a></span> no puede descomponer <span class="type"><a href="language.types.string.php" class="type string">string</a></span>s</h5>

   <p class="para">
    <span class="function"><a href="function.list.php" class="function">list()</a></span> ya no puede descomponer variables de <span class="type"><a href="language.types.string.php" class="type string">string</a></span>.
    Debe usarse <span class="function"><a href="function.str-split.php" class="function">str_split()</a></span> en su lugar.
   </p>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.variable-handling.array-order">
  <h4 class="title">
   El orden de los elementos de los arrays ha cambiado cuando los elementos
   se crean automáticamente durante las asignaciones por referencia
  </h4>

  <p class="para">
   El orden de los elementos en un array ha cambiado cuando estos elementos
   fueron creados automáticamente al referenciarlos en una asignación por referencia. Por ejemplo:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$array </span><span style="color: #007700">= [];<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"a"</span><span style="color: #007700">] =&amp; </span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"b"</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"b"</span><span style="color: #007700">] = </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">Resultado del ejemplo anterior en PHP 5:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
array(2) {
  [&quot;b&quot;]=&gt;
  &amp;int(1)
  [&quot;a&quot;]=&gt;
  &amp;int(1)
}
</pre></div>
   </div>
   <p class="para">Resultado del ejemplo anterior en PHP 7:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
array(2) {
  [&quot;a&quot;]=&gt;
  &amp;int(1)
  [&quot;b&quot;]=&gt;
  &amp;int(1)
}
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.variable-handling.parentheses">
  <h4 class="title">
   Los paréntesis alrededor de los argumentos de función ya no afectan el comportamiento
  </h4>

  <p class="para">
   En PHP 5, el uso de paréntesis redundantes alrededor de un argumento de función podía silenciar
   las advertencias de normas estrictas cuando el argumento de función se pasaba por referencia.
   La advertencia ahora siempre se emite.
  </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">getArray</span><span style="color: #007700">() {<br />    return [</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">];<br />}<br /><br />function </span><span style="color: #0000BB">squareArray</span><span style="color: #007700">(array &amp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">) {<br />    foreach (</span><span style="color: #0000BB">$a </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$v</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$v </span><span style="color: #007700">**= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #FF8000">// Genera una advertencia en PHP 7.<br /></span><span style="color: #0000BB">squareArray</span><span style="color: #007700">((</span><span style="color: #0000BB">getArray</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>
Notice: Only variables should be passed by reference in /tmp/test.php on line 13
</pre></div>
   </div>
  </div>
 </div>
</div>



 




<div class="sect2" id="migration70.incompatible.foreach">
 <h3 class="title">Cambios relacionados con <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a></h3>

 <p class="para">
  Se han realizado cambios menores en el comportamiento de la estructura de control
  <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a>, principalmente en la gestión del puntero interno del array y la
  modificación del array mientras se recorre.
 </p>

 <div class="sect3" id="migration70.incompatible.foreach.array-pointer">
  <h4 class="title"><a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> ya no modifica el puntero interno del array</h4>

  <p class="para">
   Antes de PHP 7, el puntero interno del array se modificaba mientras se recorría
   un array con <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a>. Esto ya no es el caso, como se muestra en el siguiente ejemplo:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$array </span><span style="color: #007700">= [</span><span style="color: #0000BB">0</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">];<br />foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$val</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">current</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">));<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">Resultado del ejemplo anterior en PHP 5:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(1)
int(2)
bool(false)
</pre></div>
   </div>
   <p class="para">Resultado del ejemplo anterior en PHP 7:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
int(0)
int(0)
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.foreach.by-value">
  <h4 class="title"><a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> por valor trabaja sobre una copia del array</h4>

  <p class="para">
   Al utilizar el modo predeterminado (por valor), <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> ahora trabaja
   sobre una copia del array en lugar del array original. Esto significa que
   los cambios realizados en el array mientras se recorre no afectarán los
   valores que se están iterando.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.foreach.by-ref">
  <h4 class="title">El comportamiento de <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> por referencia ha sido mejorado</h4>

  <p class="para">
   Al recorrer un array por referencia, <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> ahora identifica mejor
   los cambios realizados en el array durante la iteración. Por ejemplo,
   si se añaden valores a un array mientras se recorre, estos nuevos valores
   también serán iterados:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$array </span><span style="color: #007700">= [</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br />foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$val</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$val</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">] = </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">Resultado del ejemplo anterior en PHP 5:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
</pre></div>
   </div>
   <p class="para">Resultado del ejemplo anterior en PHP 7:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
int(1)
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.foreach.object">
  <h4 class="title">Iteración de objetos no-<span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span></h4>

  <p class="para">
   La iteración de un objeto no-<span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span> ahora es
   idéntica a la iteración de un array por referencia. Como resultado,
   la <a href="migration70.incompatible.php#migration70.incompatible.foreach.by-ref" class="link">mejora en el comportamiento
   cuando se modifica un array durante su iteración</a> también se aplica
   cuando se añaden o eliminan propiedades de un objeto.
  </p>
 </div>
</div>




 




<div class="sect2" id="migration70.incompatible.integers">
 <h3 class="title">Modificaciones en la gestión de <span class="type"><a href="language.types.integer.php" class="type int">int</a></span></h3>

 <div class="sect3" id="migration70.incompatible.integers.invalid-octals">
  <h4 class="title">Literales octales no válidos</h4>

  <p class="para">
   Anteriormente, los literales octales que contenían números no válidos
   eran truncados silenciosamente (<code class="literal">0128</code> se interpretaba como
   <code class="literal">012</code>). Ahora, un literal octal no válido provocará
   un error de análisis.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.integers.negative-bitshift">
  <h4 class="title">Desplazamiento de bits negativo</h4>

  <p class="para">
   Los desplazamientos de bits por números negativos ahora lanzarán una
   <span class="classname"><a href="class.arithmeticerror.php" class="classname">ArithmeticError</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 />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">1 </span><span style="color: #007700">&gt;&gt; -</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

    <p class="para">Resultado del ejemplo anterior en PHP 5:</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
</pre></div>
    </div>
    <p class="para">Resultado del ejemplo anterior en PHP 7:</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
Fatal error: Uncaught ArithmeticError: Bit shift by negative number in /tmp/test.php:2
Stack trace:
#0 {main}
  thrown in /tmp/test.php on line 2
</pre></div>
    </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.integers.out-of-range">
  <h4 class="title">Desplazamiento de bits fuera de rango</h4>

  <p class="para">
   Los desplazamientos de bits (en ambos sentidos) más allá del ancho de bits de un
   <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> siempre devolverán 0. Anteriormente, el comportamiento de estos
   desplazamientos dependía de la arquitectura.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.integers.div-by-zero">
  <h4 class="title">Cambios en la división por cero</h4>

  <p class="para">
   Anteriormente, cuando se utilizaba 0 como divisor en los operadores de
   división (/) o módulo (%), se emitía un E_WARNING y se devolvía <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
   Ahora, el operador de división devuelve un float como +INF, -INF o NAN, según lo
   especificado por IEEE 754. La advertencia E_WARNING del operador de módulo ha sido
   eliminada y ahora lanzará una excepción <span class="classname"><a href="class.divisionbyzeroerror.php" class="classname">DivisionByZeroError</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 />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">3</span><span style="color: #007700">/</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">/</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">%</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">Resultado del ejemplo anterior en PHP 5:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)
</pre></div>
   </div>
   <p class="para">Resultado del ejemplo anterior en PHP 7:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Warning: Division by zero in %s on line %d
float(INF)

Warning: Division by zero in %s on line %d
float(NAN)

PHP Fatal error:  Uncaught DivisionByZeroError: Modulo by zero in %s line %d
</pre></div>
   </div>
  </div>
 </div>
</div>




 




<div class="sect2" id="migration70.incompatible.strings">
 <h3 class="title">Modificaciones en el manejo de <span class="type"><a href="language.types.string.php" class="type string">string</a></span></h3>

 <div class="sect3" id="migration70.incompatible.strings.hex">
  <h4 class="title">Las cadenas hexadecimales ya no se consideran numéricas</h4>

  <p class="para">
   Las <span class="type"><a href="language.types.string.php" class="type string">string</a></span> que contienen números hexadecimales ya no se consideran numéricas. Por ejemplo:
  </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: #DD0000">"0x123" </span><span style="color: #007700">== </span><span style="color: #DD0000">"291"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">is_numeric</span><span style="color: #007700">(</span><span style="color: #DD0000">"0x123"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"0xe" </span><span style="color: #007700">+ </span><span style="color: #DD0000">"0x1"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #DD0000">"foo"</span><span style="color: #007700">, </span><span style="color: #DD0000">"0x1"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">Resultado del ejemplo anterior en PHP 5:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
bool(true)
bool(true)
int(15)
string(2) &quot;oo&quot;
</pre></div>
   </div>
   <p class="para">Resultado del ejemplo anterior en PHP 7:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
bool(false)
bool(false)
int(0)

Notice: A non well formed numeric value encountered in /tmp/test.php on line 5
string(3) &quot;foo&quot;
</pre></div>
   </div>
  </div>

  <p class="para">
   <span class="function"><a href="function.filter-var.php" class="function">filter_var()</a></span> puede ser utilizado para verificar si una <span class="type"><a href="language.types.string.php" class="type string">string</a></span>
   contiene un número hexadecimal, y también para convertir una cadena de este tipo
   en un <span class="type"><a href="language.types.integer.php" class="type int">int</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 />$str </span><span style="color: #007700">= </span><span style="color: #DD0000">"0xffff"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$int </span><span style="color: #007700">= </span><span style="color: #0000BB">filter_var</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">, </span><span style="color: #0000BB">FILTER_VALIDATE_INT</span><span style="color: #007700">, </span><span style="color: #0000BB">FILTER_FLAG_ALLOW_HEX</span><span style="color: #007700">);<br />if (</span><span style="color: #0000BB">false </span><span style="color: #007700">=== </span><span style="color: #0000BB">$int</span><span style="color: #007700">) {<br />    throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">"Invalid integer!"</span><span style="color: #007700">);<br />}<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$int</span><span style="color: #007700">); </span><span style="color: #FF8000">// int(65535)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.strings.unicode-escapes">
  <h4 class="title"><code class="literal">\u{</code> puede causar errores</h4>

  <p class="para">
   Debido a la adición de la nueva
   <a href="migration70.new-features.php#migration70.new-features.unicode-codepoint-escape-syntax" class="link">sintaxis
    de escape de punto de código Unicode</a>, las <span class="type"><a href="language.types.string.php" class="type string">string</a></span> que contienen un literal
   <code class="literal">\u{</code> seguido de una secuencia no válida provocarán un error fatal.
   Para evitar esto, la barra invertida principal debe ser escapada.
  </p>
 </div>
</div>



 




<div class="sect2" id="migration70.incompatible.removed-functions">
 <h3 class="title">Funciones eliminadas</h3>

 <div class="sect3" id="migration70.incompatible.removed-functions.call-user-method">
  <h4 class="title">
   <span class="function"><strong>call_user_method()</strong></span> y
   <span class="function"><strong>call_user_method_array()</strong></span>
  </h4>

  <p class="para">
   Estas funciones fueron desaprobadas en PHP 4.1.0 en favor de
   <span class="function"><a href="function.call-user-func.php" class="function">call_user_func()</a></span> y
   <span class="function"><a href="function.call-user-func-array.php" class="function">call_user_func_array()</a></span>. También puede utilizar las
   <a href="functions.variable-functions.php" class="link">funciones variables</a>
   y/o el operador
   <a href="functions.arguments.php#functions.variable-arg-list" class="link"><code class="literal">...</code></a>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.ereg">
  <h4 class="title">
   Todas las funciones ereg*
  </h4>
  <p class="para">
   Todas las funciones <code class="literal">ereg</code> han sido eliminadas.
   <a href="book.pcre.php" class="link">PCRE</a> es una alternativa recomendada.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.mcrypt">
  <h4 class="title">Alias <a href="book.mcrypt.php" class="link">mcrypt</a></h4>

  <p class="para">
   La función obsoleta <span class="function"><strong>mcrypt_generic_end()</strong></span> ha sido
   reemplazada por <span class="function"><a href="function.mcrypt-generic-deinit.php" class="function">mcrypt_generic_deinit()</a></span>.
  </p>

  <p class="para">
   Además, las funciones obsoletas <span class="function"><strong>mcrypt_ecb()</strong></span>,
   <span class="function"><strong>mcrypt_cbc()</strong></span>, <span class="function"><strong>mcrypt_cfb()</strong></span> y
   <span class="function"><strong>mcrypt_ofb()</strong></span> han sido reemplazadas por el uso de
   <span class="function"><a href="function.mcrypt-decrypt.php" class="function">mcrypt_decrypt()</a></span> con la constante apropiada
   <strong><code>MCRYPT_MODE_<span class="replaceable">*</span></code></strong>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.mysql">
  <h4 class="title">
   Todas las funciones ext/mysql
  </h4>
  <p class="para">
   Todas las funciones <a href="book.mysql.php" class="link">ext/mysql</a> han sido eliminadas.
   Para más información sobre la elección de otra API MySQL, consulte
   <a href="mysqlinfo.api.choosing.php" class="link">elegir una API MySQL</a>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.mssql">
  <h4 class="title">
   Todas las funciones ext/mssql
  </h4>
  <p class="para">
   Todas las funciones <code class="literal">ext/mssql</code> han sido eliminadas.
   <ul class="simplelist">
    <li><a href="ref.pdo-sqlsrv.php" class="link">PDO_SQLSRV</a></li>
    <li><a href="ref.pdo-odbc.php" class="link">PDO_ODBC</a></li>
    <li><a href="book.sqlsrv.php" class="link">SQLSRV</a></li>
    <li><a href="book.uodbc.php" class="link">Unified ODBC API</a></li>
   </ul>
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.intl">
  <h4 class="title"><a href="book.intl.php" class="link">intl</a> alias</h4>

  <p class="para">
   Los alias obsoletos <span class="function"><strong>datefmt_set_timezone_id()</strong></span> y
   <span class="methodname"><strong>IntlDateFormatter::setTimeZoneID()</strong></span> han sido eliminados
   y reemplazados respectivamente por <span class="function"><a href="intldateformatter.settimezone.php" class="function">datefmt_set_timezone()</a></span> y
   <span class="methodname"><a href="intldateformatter.settimezone.php" class="methodname">IntlDateFormatter::setTimeZone()</a></span>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.magic-quotes">
  <h4 class="title"><span class="function"><strong>set_magic_quotes_runtime()</strong></span></h4>

  <p class="para">
   <span class="function"><strong>set_magic_quotes_runtime()</strong></span>, así como su alias
   <span class="function"><strong>magic_quotes_runtime()</strong></span>, han sido eliminadas. Estaban
   obsoletas desde PHP 5.3.0 y sin efecto desde la eliminación de las comillas mágicas en PHP 5.4.0.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.set-socket-blocking">
  <h4 class="title"><span class="function"><strong>set_socket_blocking()</strong></span></h4>

  <p class="para">
   El alias obsoleto <span class="function"><strong>set_socket_blocking()</strong></span> ha sido
   eliminado y reemplazado por <span class="function"><a href="function.stream-set-blocking.php" class="function">stream_set_blocking()</a></span>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.dl">
  <h4 class="title"><span class="function"><a href="function.dl.php" class="function">dl()</a></span> con PHP-FPM</h4>

  <p class="para">
   <span class="function"><a href="function.dl.php" class="function">dl()</a></span> ya no puede ser utilizado con PHP-FPM. Continúa
   funcionando en las SAPIs CLI y Embed.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.gd">
  <h4 class="title">Funciones <a href="book.image.php" class="link">GD</a> Type1</h4>

  <p class="para">
   El soporte para las fuentes PostScript Type1 ha sido eliminado de la extensión GD,
   lo que ha llevado a la eliminación de las siguientes funciones:
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsbbox()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsencodefont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsextendfont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsfreefont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsloadfont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsslantfont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepstext()</strong></span>
    </span>
   </li>
  </ul>

  <p class="para">
   En su lugar, se recomienda utilizar las fuentes TrueType y sus
   funciones asociadas.
  </p>
 </div>
</div>



 




<div class="sect2" id="migration70.incompatible.removed-ini-directives">
 <h3 class="title">Directivas INI eliminadas</h3>

 <div class="sect3" id="migration70.incompatible.removed-ini-directives.features">
  <h4 class="title">Funcionalidades eliminadas</h4>

  <p class="para">
   Las siguientes directivas INI han sido eliminadas porque sus funcionalidades
   asociadas también han sido eliminadas:
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <code class="parameter">always_populate_raw_post_data</code>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="parameter">asp_tags</code>
    </span>
   </li>
  </ul>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-ini-directives.xsl">
  <h4 class="title"><code class="parameter">xsl.security_prefs</code></h4>

  <p class="para">
   La directiva <code class="parameter">xsl.security_prefs</code> ha sido eliminada.
   En su lugar, el método <span class="methodname"><a href="xsltprocessor.setsecurityprefs.php" class="methodname">XsltProcessor::setSecurityPrefs()</a></span>
   debe ser llamado para controlar las preferencias de seguridad en una
   base por procesador.
  </p>
 </div>
</div>



 




<div class="sect2" id="migration70.incompatible.other">
 <h3 class="title">Otras modificaciones compatibles con versiones anteriores</h3>

 <div class="sect3" id="migration70.incompatible.other.new-by-ref">
  <h4 class="title">No se pueden asignar nuevos objetos por referencia</h4>

  <p class="para">
   El resultado de la instrucción <a href="language.oop5.basic.php#language.oop5.basic.new" class="link"><code class="literal">new</code></a> ya no se puede asignar a una variable
   por referencia:
  </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">C </span><span style="color: #007700">{}<br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">=&amp; new </span><span style="color: #0000BB">C</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">Resultado del ejemplo anterior en PHP 5:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3
</pre></div>
   </div>
   <p class="para">Resultado del ejemplo anterior en PHP 7:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Parse error: syntax error, unexpected &#039;new&#039; (T_NEW) in /tmp/test.php on line 3
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.classes">
  <h4 class="title">Nombres de clases, interfaces y traits no válidos</h4>

  <p class="para">
   Los siguientes nombres no pueden utilizarse para nombrar clases,
   interfaces o funciones:
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.float.php" class="type float">float</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.string.php" class="type string">string</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara">null</span>
   </li>
   <li class="listitem">
    <span class="simpara">true</span>
   </li>
   <li class="listitem">
    <span class="simpara">false</span>
   </li>
  </ul>

  <p class="para">
   Además, no deben utilizarse los siguientes nombres. Aunque no
   generan un error en PHP 7.0, están reservados para uso futuro y deben ser
   considerados obsoletos.
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.object.php" class="type object">object</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type">numeric</span></span>
   </li>
  </ul>
 </div>

 <div class="sect3" id="migration70.incompatible.other.php-tags">
  <h4 class="title">Etiquetas ASP y PHP eliminadas</h4>

  <p class="para">
   Se ha eliminado el soporte para el uso de etiquetas ASP y script para delimitar
   código PHP. Las etiquetas afectadas son:
  </p>

  <table class="doctable table">
   <caption><strong>Eliminación de etiquetas ASP y script</strong></caption>
   
    <thead>
     <tr>
      <th>Etiqueta de apertura</th>
      <th>Etiqueta de cierre</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td><code class="code">&lt;%</code></td>
      <td><code class="code">%&gt;</code></td>
     </tr>

     <tr>
      <td><code class="code">&lt;%=</code></td>
      <td><code class="code">%&gt;</code></td>
     </tr>

     <tr>
      <td><code class="code">&lt;script language=&quot;php&quot;&gt;</code></td>
      <td><code class="code">&lt;/script&gt;</code></td>
     </tr>

    </tbody>
   
  </table>

 </div>

 <div class="sect3" id="migration70.incompatible.other.incompatible-this">
  <h4 class="title">Llamadas desde un contexto incompatible eliminadas</h4>

  <p class="para">
   <a href="migration56.deprecated.php#migration56.deprecated.incompatible-context" class="link">Anteriormente no recomendado en PHP 5.6</a>,
   Las llamadas estáticas a un método no estático con un contexto incompatible
   ahora resultarán en que el método llamado tendrá un indefinido
   <code class="literal">$this</code> y se emitirá una advertencia de obsolescencia.
  </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">{<br />    public function </span><span style="color: #0000BB">test</span><span style="color: #007700">() { </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">); }<br />}<br /><br /></span><span style="color: #FF8000">// Nota: NO extiende A<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">B </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">callNonStaticMethodOfA</span><span style="color: #007700">() { </span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">test</span><span style="color: #007700">(); }<br />}<br /><br />(new </span><span style="color: #0000BB">B</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">callNonStaticMethodOfA</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">Resultado del ejemplo anterior en PHP 5.6:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Non-static method A::test() should not be called statically, assuming $this from incompatible context in /tmp/test.php on line 8
object(B)#1 (0) {
}
</pre></div>
   </div>
   <p class="para">Resultado del ejemplo anterior en PHP 7:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8

Notice: Undefined variable: this in /tmp/test.php on line 3
NULL
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.yield">
  <h4 class="title"><a href="language.generators.syntax.php#control-structures.yield" class="link"><code class="literal">yield</code></a> es ahora un operador asociativo derecho</h4>

  <p class="para">
   La construcción <a href="language.generators.syntax.php#control-structures.yield" class="link"><code class="literal">yield</code></a> ya no requiere paréntesis y ha sido sustituida
   por un operador asociativo derecho con prioridad entre <code class="literal">print</code>
   y <code class="literal">=&gt;</code>. Esto puede provocar un cambio en el comportamiento:
  </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">echo yield -</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Antes se interpretaba como<br /></span><span style="color: #007700">echo (yield) - </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Y ahora se interpreta como<br /></span><span style="color: #007700">echo yield (-</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br />yield </span><span style="color: #0000BB">$foo </span><span style="color: #007700">or die;<br /></span><span style="color: #FF8000">// Antes se interpretaba como<br /></span><span style="color: #007700">yield (</span><span style="color: #0000BB">$foo </span><span style="color: #007700">or die);<br /></span><span style="color: #FF8000">// Y ahora se interpreta como<br /></span><span style="color: #007700">(yield </span><span style="color: #0000BB">$foo</span><span style="color: #007700">) or die;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  <p class="para">
   Los paréntesis pueden utilizarse para eliminar la ambigüedad en estos casos.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.func-parameters">
  <h4 class="title">Las funciones no pueden tener varios parámetros con el mismo nombre</h4>

  <p class="para">
   Ya no es posible definir dos o más parámetros de función
   con el mismo nombre. Por ejemplo, la siguiente función desencadenará un
   <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>:
  </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">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">, </span><span style="color: #0000BB">$unused</span><span style="color: #007700">, </span><span style="color: #0000BB">$unused</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">//<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.func-parameter-modified">
  <h4 class="title">Las funciones de inspección de argumentos informan del valor <em>actual</em> del parámetro</h4>

  <p class="para">
   <span class="function"><a href="function.func-get-arg.php" class="function">func_get_arg()</a></span>, <span class="function"><a href="function.func-get-args.php" class="function">func_get_args()</a></span>,
   <span class="function"><a href="function.debug-backtrace.php" class="function">debug_backtrace()</a></span> y las trazas de excepciones ya no
   devuelven el valor original que se pasó a un parámetro, sino que proporcionarán
   el valor actual (que podría haber sido modificado).
  </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">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$x</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$x</span><span style="color: #007700">++;<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">func_get_arg</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">));<br />}<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">);</span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">Resultado del ejemplo anterior en PHP 5:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
1
</pre></div>
   </div>
   <p class="para">Resultado del ejemplo anterior en PHP 7:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
2
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.multiple-default">
  <h4 class="title">Las instrucciones de conmutación no pueden tener varios bloques por defecto</h4>

  <p class="para">
   Ya no es posible definir dos o más bloques por defecto en
   una instrucción de conmutación. Por ejemplo, la siguiente instrucción switch desencadenará
   una <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>:
  </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">switch (</span><span style="color: #0000BB">1</span><span style="color: #007700">) {<br />    default:<br />    break;<br />    default:<br />    break;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.http-raw-post-data">
  <h4 class="title"><var class="varname">$HTTP_RAW_POST_DATA</var> ha sido eliminado</h4>

  <p class="para">
   <var class="varname">$HTTP_RAW_POST_DATA</var> ya no está disponible. El flujo
   <a href="wrappers.php.php#wrappers.php.input" class="link"><code class="literal">php://input</code></a>
   debe ser utilizado en su lugar.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.ini-comments">
  <h4 class="title">Los comentarios <code class="literal">#</code> en los archivos INI han sido eliminados</h4>

  <p class="para">
   Se ha eliminado el soporte para los comentarios con el prefijo <code class="literal">#</code> en
   los archivos INI. <code class="literal">;</code> (punto y coma) debe ser
   utilizado en su lugar. Este cambio se aplica a los archivos <var class="filename">php.ini</var>, así como a los
   archivos gestionados por <span class="function"><a href="function.parse-ini-file.php" class="function">parse_ini_file()</a></span> y
   <span class="function"><a href="function.parse-ini-string.php" class="function">parse_ini_string()</a></span>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.json-to-jsond">
  <h4 class="title">Extensión JSON reemplazada por JSOND</h4>

  <p class="para">
   La extensión JSON ha sido reemplazada por JSOND, provocando tres incompatibilidades
   BC menores. Primero, un número no debe terminar con una coma
   decimal (es decir, <code class="literal">34.</code> debe ser cambiado a <code class="literal">34.0</code>
   o a <code class="literal">34</code>). Segundo, al usar la notación
   científica, el exponente <code class="literal">e</code> no debe seguir inmediatamente a un
   punto decimal (es decir, <code class="literal">3.e3</code> debe ser cambiado a
   <code class="literal">3.0e3</code> o a <code class="literal">3e3</code>). Finalmente, una cadena vacía ya no
   se considera como JSON válido.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.internal-function-failure-overflow">
  <h4 class="title">Fallo de la función interna en caso de desbordamiento</h4>

  <p class="para">
   Anteriormente, las funciones internas debían truncar silenciosamente los números
   producidos a partir de restricciones de tipo float a entero cuando el número era
   demasiado grande para representar un entero. Ahora, se emitirá un E_WARNING y
   se devolverá <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.fixes-custom-session-handler">
  <h4 class="title">Correcciones a los valores de retorno del manejador de sesión personalizado</h4>

  <p class="para">
   Todas las funciones de predicado implementadas por manejadores de sesión
   personalizados que devuelvan <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> o <code class="literal">-1</code> serán errores
   fatales. Si se devuelve un valor de estas funciones distinto de un booleano, <code class="literal">-1</code>
   o <code class="literal">0</code>, fallará y se emitirá un E_WARNING.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.sort-order">
  <h4 class="title">Orden de clasificación de elementos iguales</h4>
  <p class="para">
   El algoritmo de clasificación interno ha sido mejorado, lo que puede resultar en un
   orden de clasificación diferente de los elementos que se comparaban como iguales anteriormente.
  </p>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    No dependa del orden de los elementos que se comparan como iguales; podría
    cambiar en cualquier momento.
   </p>
  </p></blockquote>
 </div>

 <div class="sect3" id="migration70.incompatible.other.break-continue">
  <h4 class="title">Instrucciones de interrupción y continuación mal ubicadas</h4>
  <p class="para">
   Las instrucciones <code class="literal">break</code> y <code class="literal">continue</code> fuera
   de un bucle o una estructura de control <code class="literal">switch</code> ahora se detectan en el momento de la compilación en lugar de la ejecución como
   antes, y desencadenan un <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.break-continue-constant">
  <h4 class="title">Constante prohibida como argumento de break y continue</h4>
  <p class="para">
   Las instrucciones <code class="literal">break</code> y <code class="literal">continue</code> ya no permiten
   que su argumento sea una constante, y desencadenan un
   <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.mhash">
  <h4 class="title">Mhash ya no es una extensión</h4>
  <p class="para">
   La extensión mhash ha sido completamente integrada en la extensión
   <a href="book.hash.php" class="link">Hash</a>. Por lo tanto, ya no es posible
   detectar el soporte mhash con <span class="function"><a href="function.extension-loaded.php" class="function">extension_loaded()</a></span>;
   utilizar <span class="function"><a href="function.function-exists.php" class="function">function_exists()</a></span> en su lugar. Además, mhash ya no
   se reporta por <span class="function"><a href="function.get-loaded-extensions.php" class="function">get_loaded_extensions()</a></span> y las
   funcionalidades relacionadas.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.declare-ticks">
  <h4 class="title">declare(ticks)</h4>
  <p class="para">
   La directiva <a href="control-structures.declare.php#control-structures.declare.ticks" class="link">declare(ticks)
   </a> ya no se filtra en diferentes unidades de compilación.
  </p>
 </div>
</div>



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