<?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 se han convertido 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 podrían no invocarse, ya que las excepciones
  se pueden lanzar 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 se
   lanza un objeto <span class="classname"><a href="class.error.php" class="classname">Error</a></span>.
  </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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #FF8000">// Código para PHP 5 que fallará.
</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">}
</span><span style="color: #0000BB">set_exception_handler</span><span style="color: #007700">(</span><span style="color: #DD0000">'handler'</span><span style="color: #007700">);

</span><span style="color: #FF8000">// Compatible con PHP 5 y 7.
</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">}

</span><span style="color: #FF8000">// Solo PHP 7.
</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">}
</span><span style="color: #0000BB">?&gt;</span></code></pre></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> se han reclasificado 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 se deben asignar variables por referencia</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
       </tr>

       <tr>
        <td>Solo se deben pasar variables 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 ficheros 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 conllevado la eliminación de algunos casos especiales por
  razones de consistencia, lo que rompe 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 siguiente tabla 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
   se debe reescribir 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 se puede
   utilizar para emular el comportamiento anterior si es necesario:
  </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">f</span><span style="color: #007700">() {
    </span><span style="color: #FF8000">// Válido solo en PHP 5.
    </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">;

    </span><span style="color: #FF8000">// Válido en PHP 5 y 7.
    </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">};
}
</span><span style="color: #0000BB">?&gt;</span></code></pre></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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</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">];
</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

    <p class="simpara">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="simpara">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> se han eliminado</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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #007700">list() = </span><span style="color: #0000BB">$a</span><span style="color: #007700">;
list(,,) = </span><span style="color: #0000BB">$a</span><span style="color: #007700">;
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">;
</span><span style="color: #0000BB">?&gt;</span></code></pre></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 desempaquetar <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 desempaquetar 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
   se crearon automáticamente al referenciarlos en una asignación por
   referencia. Por ejemplo:
  </p>

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

   <p class="simpara">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="simpara">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 una 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 una función
   podía silenciar las advertencias de estándares estrictos (strict standards) cuando el argumento de la
   función se pasaba por referencia. Ahora se emite siempre la advertencia.
  </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">getArray</span><span style="color: #007700">() {
    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">];
}

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">) {
    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">) {
        </span><span style="color: #0000BB">$v </span><span style="color: #007700">**= </span><span style="color: #0000BB">2</span><span style="color: #007700">;
    }
}

</span><span style="color: #FF8000">// Genera una advertencia en PHP 7.
</span><span style="color: #0000BB">squareArray</span><span style="color: #007700">((</span><span style="color: #0000BB">getArray</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>
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 así, como se muestra
   en el siguiente ejemplo:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
$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">];
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">) {
    </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">));
}
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
   </div>

   <p class="simpara">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="simpara">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">Se ha mejorado el comportamiento de <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> por referencia</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 se iterarán:
  </p>

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

   <p class="simpara">Resultado del ejemplo anterior en PHP 5:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
</pre></div>
   </div>
   <p class="simpara">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 se
   truncaban 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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
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">);
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
   </div>

    <p class="simpara">Resultado del ejemplo anterior en PHP 5:</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
</pre></div>
    </div>
    <p class="simpara">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
   se ha eliminado 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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
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">);
</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">);
</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">);
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
   </div>

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

   <p class="simpara">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="simpara">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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
$str </span><span style="color: #007700">= </span><span style="color: #DD0000">"0xffff"</span><span style="color: #007700">;
</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">);
if (</span><span style="color: #0000BB">false </span><span style="color: #007700">=== </span><span style="color: #0000BB">$int</span><span style="color: #007700">) {
    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">);
}
</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)
</span><span style="color: #0000BB">?&gt;</span></code></pre></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 se deprecaron 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 se pueden 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> se han
   eliminado. <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> se
   ha reemplazado 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> se han reemplazado 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> se han eliminado.
   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> se han
   eliminado. <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> se han
   eliminado y reemplazado 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>, se han eliminado. Se deprecaron
   desde PHP 5.3.0 y no tienen 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> se ha
   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 se puede utilizar 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 se ha eliminado de la extensión GD,
   lo que conlleva 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 se han eliminado porque sus funcionalidades asociadas
   también se han eliminado:
  </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> se ha eliminado. En
   su lugar, se debe
   llamar al método <span class="methodname"><a href="xsltprocessor.setsecurityprefs.php" class="methodname">XsltProcessor::setSecurityPrefs()</a></span> para controlar las preferencias de seguridad de forma individual para
   cada 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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #007700">class </span><span style="color: #0000BB">C </span><span style="color: #007700">{}
</span><span style="color: #0000BB">$c </span><span style="color: #007700">=&amp; new </span><span style="color: #0000BB">C</span><span style="color: #007700">;
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
   </div>

   <p class="simpara">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="simpara">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 traits:
  </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 se
   deben considerar 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"><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">{
    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">); }
}

</span><span style="color: #FF8000">// Nota: NO extiende A
</span><span style="color: #007700">class </span><span style="color: #0000BB">B </span><span style="color: #007700">{
    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">(); }
}

(new </span><span style="color: #0000BB">B</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">callNonStaticMethodOfA</span><span style="color: #007700">();
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
   </div>

   <p class="simpara">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="simpara">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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #007700">echo yield -</span><span style="color: #0000BB">1</span><span style="color: #007700">;
</span><span style="color: #FF8000">// Antes se interpretaba como
</span><span style="color: #007700">echo (yield) - </span><span style="color: #0000BB">1</span><span style="color: #007700">;
</span><span style="color: #FF8000">// Y ahora se interpreta como
</span><span style="color: #007700">echo yield (-</span><span style="color: #0000BB">1</span><span style="color: #007700">);

yield </span><span style="color: #0000BB">$foo </span><span style="color: #007700">or die;
</span><span style="color: #FF8000">// Antes se interpretaba como
</span><span style="color: #007700">yield (</span><span style="color: #0000BB">$foo </span><span style="color: #007700">or die);
</span><span style="color: #FF8000">// Y ahora se interpreta como
</span><span style="color: #007700">(yield </span><span style="color: #0000BB">$foo</span><span style="color: #007700">) or die;
</span><span style="color: #0000BB">?&gt;</span></code></pre></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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</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">) {
    </span><span style="color: #FF8000">//
</span><span style="color: #007700">}
</span><span style="color: #0000BB">?&gt;</span></code></pre></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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</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">) {
    </span><span style="color: #0000BB">$x</span><span style="color: #007700">++;
    </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">));
}
</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></code></pre></div>
   </div>

   <p class="simpara">Resultado del ejemplo anterior en PHP 5:</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
1
</pre></div>
   </div>
   <p class="simpara">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"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #007700">switch (</span><span style="color: #0000BB">1</span><span style="color: #007700">) {
    default:
    break;
    default:
    break;
}
</span><span style="color: #0000BB">?&gt;</span></code></pre></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">Se han eliminado los comentarios <code class="literal">#</code> en los ficheros INI</h4>

  <p class="para">
   Se ha eliminado el soporte para los comentarios con el prefijo <code class="literal">#</code> en los ficheros
   INI. En su lugar se debe utilizar <code class="literal">;</code> (punto y coma). Este cambio
   se aplica a los ficheros <var class="filename">php.ini</var>, así como a los ficheros 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 se ha reemplazado por JSOND, lo que conlleva tres incompatibilidades
   menores de retrocompatibilidad. Primero, un número no debe terminar con una coma decimal (es
   decir, <code class="literal">34.</code> se debe cambiar 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> se debe cambiar 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 truncaban silenciosamente los números producidos a
   partir de coerciones de tipo float a integer cuando el número era demasiado grande
   para representarse como un integer. 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); ?>