<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.types.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'language.types.declarations.php',
    1 => 'Declaraciones de tipo',
    2 => 'Declaraciones de tipo',
  ),
  'up' => 
  array (
    0 => 'language.types.php',
    1 => 'Los tipos',
  ),
  'prev' => 
  array (
    0 => 'language.types.iterable.php',
    1 => 'It&eacute;rables',
  ),
  'next' => 
  array (
    0 => 'language.types.type-juggling.php',
    1 => 'Manipulaci&oacute;n de tipos',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'language/types/declarations.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.types.declarations" class="sect1">
 <h2 class="title">Declaraciones de tipo</h2>

 <p class="para">
  Las declaraciones de tipos pueden ser añadidas a los argumentos de las funciones,
  valores de retorno, a partir de PHP 7.4.0, las propiedades de clase,
  y a partir de PHP 8.3.0, las constantes de clase.
  Aseguran que el valor es del tipo especificado en el momento de la llamada,
  de lo contrario se lanza un <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span>.
 </p>

 <p class="para">
  Cada tipo soportado por PHP, con la excepción del tipo
  <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>, puede ser utilizado en una declaración de tipo
  por el usuario.
  Esta página contiene un registro de cambios de la disponibilidad de
  los diferentes tipos y la documentación sobre su uso en las
  declaraciones de tipo.
 </p>

 <blockquote class="note"><p><strong class="note">Nota</strong>: 
  <p class="para">
   Cuando una clase implementa un método de interfaz o reimplementa un método
   que ya ha sido definido por una clase padre, debe ser compatible con la
   definición mencionada.
   Un método es compatible si sigue las reglas de
   <a href="language.oop5.variance.php" class="link">variance</a>.
  </p>
 </p></blockquote>

 <div class="sect2">
  <h3 class="title">Historial de cambios</h3>
  <table class="doctable informaltable">
   
    <thead>
     <tr>
      <th>Versión</th>
      <th>Descripción</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>8.3.0</td>
      <td>
       Añadido soporte para las constantes tipadas de clase, interfaz, trait y enum.
      </td>
     </tr>

     <tr>
      <td>8.2.0</td>
      <td>
       Añadido soporte de tipo <abbr title="Disjunctive Normal Form">DNF</abbr> (Forma Normal Disyuntiva).
      </td>
     </tr>

     <tr>
      <td>8.2.0</td>
      <td>
       Añadido soporte del tipo <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span>.
      </td>
     </tr>

     <tr>
      <td>8.2.0</td>
      <td>
       Los tipos <span class="type"><a href="language.types.null.php" class="type null">null</a></span> y <span class="type"><a href="language.types.singleton.php" class="type false">false</a></span> pueden ahora ser utilizados de manera autónoma.
      </td>
     </tr>

     <tr>
      <td>8.1.0</td>
      <td>
       Se ha añadido soporte para los tipos de intersección.
      </td>
     </tr>

     <tr>
      <td>8.1.0</td>
      <td>
       El retorno por referencia desde una función <span class="type"><span class="type"><a href="language.types.void.php" class="type void">void</a></span></span> ahora está desaconsejado.
      </td>
     </tr>

     <tr>
      <td>8.1.0</td>
      <td>
       Se ha añadido soporte para el tipo de retorno únicamente <span class="type"><a href="language.types.never.php" class="type never">never</a></span>.
      </td>
     </tr>

     <tr>
      <td>8.0.0</td>
      <td>
       Añadido soporte de <span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span>
      </td>
     </tr>

     <tr>
      <td>8.0.0</td>
      <td>
       Se ha añadido soporte para el tipo de retorno únicamente <span class="type">static</span>.
      </td>
     </tr>

     <tr>
      <td>8.0.0</td>
      <td>
       Se ha añadido soporte para los tipos de unión.
      </td>
     </tr>

     <tr>
      <td>7.4.0</td>
      <td>
       Añadido soporte para el tipado de propiedades de clase.
      </td>
     </tr>

     <tr>
      <td>7.2.0</td>
      <td>
       Añadido soporte para <span class="type"><a href="language.types.object.php" class="type object">object</a></span>.
      </td>
     </tr>

     <tr>
      <td>7.1.0</td>
      <td>
       Añadido soporte para <span class="type"><a href="language.types.iterable.php" class="type iterable">iterable</a></span>.
      </td>
     </tr>

     <tr>
      <td>7.1.0</td>
      <td>
       Añadido soporte para <span class="type"><span class="type"><a href="language.types.void.php" class="type void">void</a></span></span>.
      </td>
     </tr>

     <tr>
      <td>7.1.0</td>
      <td>
       Se ha añadido soporte para los tipos nullable.
      </td>
     </tr>

    </tbody>
   
  </table>

 </div>

 <div class="sect2" id="language.types.declarations.base">
  <h3 class="title">Notas de uso de los tipos atómicos</h3>

  <p class="simpara">
   Los tipos atómicos tienen un comportamiento directo con algunas advertencias
   menores que se describen en esta sección.
  </p>

  <div class="sect3" id="language.types.declarations.base.scalar">
  <h4 class="title">Tipos escalares</h4>
  <div class="warning"><strong class="warning">Advertencia</strong>
   <p class="para">
    Los alias para los tipos escalares (<span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>, <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>,
    <span class="type"><a href="language.types.float.php" class="type float">float</a></span>, <span class="type"><a href="language.types.string.php" class="type string">string</a></span>) no son soportados.
    En su lugar, son tratados como nombres de clase o interfaz.
    Por ejemplo, utilizar <code class="literal">boolean</code> como una declaración de
    tipo requiere que el valor sea una <a href="language.operators.type.php" class="link"><code class="literal">instanceof</code></a> de la clase o
    interfaz <code class="literal">boolean</code>, en lugar de tipo
    <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>:
   </p>
    <div class="informalexample">
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />    </span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">boolean $param</span><span style="color: #007700">) {}<br />    </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">true</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 8:</p>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Warning: &quot;boolean&quot; will be interpreted as a class name. Did you mean &quot;bool&quot;? Write &quot;\boolean&quot; to suppress this warning in /in/9YrUX on line 2

Fatal error: Uncaught TypeError: test(): Argument #1 ($param) must be of type boolean, bool given, called in - on line 3 and defined in -:2
Stack trace:
#0 -(3): test(true)
#1 {main}
  thrown in - on line 2
</pre></div>
     </div>
    </div>
   </div>
  </div>

  <div class="sect3" id="language.types.declarations.void">
   <h4 class="title">void</h4>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     El retorno por referencia desde una función <span class="type"><span class="type"><a href="language.types.void.php" class="type void">void</a></span></span> está obsoleto a partir
     de PHP 8.1.0, ya que tal función es contradictoria.
     Anteriormente, ya emitía los siguientes <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong> cuando se llamaba:
     <span class="computeroutput">Only variable references should be returned by reference</span>.

     <div class="informalexample">
      <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function &amp;</span><span style="color: #0000BB">test</span><span style="color: #007700">(): </span><span style="color: #0000BB">void </span><span style="color: #007700">{}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

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

  <div class="sect3" id="language.types.declarations.base.function">
   <h4 class="title">Tipos Callable</h4>
   <p class="para">
    Este tipo no puede ser utilizado como declaración de tipo de propiedad de
    clase.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     No es posible especificar la firma de la función.
    </span>
   </p></blockquote>
  </div>

  <div class="sect3" id="language.types.declarations.references">
   <h4 class="title">Declaraciones de tipo sobre los parámetros de referencia</h4>

   <p class="simpara">
    Si un parámetro pasado por referencia a una declaración de tipo, el tipo
    de la variable <em>solo se verifica</em> a la entrada de
    la función, al inicio de la llamada, pero no cuando la función es llamada
    nuevamente.
    Esto significa que una función puede modificar el tipo de la variable pasada
    por referencia.
   </p>
   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 Parámetro tipado pasado por referencia</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">array_baz</span><span style="color: #007700">(array &amp;</span><span style="color: #0000BB">$param</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #0000BB">$param </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">$var </span><span style="color: #007700">= [];<br /></span><span style="color: #0000BB">array_baz</span><span style="color: #007700">(</span><span style="color: #0000BB">$var</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$var</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">array_baz</span><span style="color: #007700">(</span><span style="color: #0000BB">$var</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Resultado del ejemplo anterior es similar a:</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
int(1)

Fatal error: Uncaught TypeError: array_baz(): Argument #1 ($param) must be of type array, int given, called in - on line 9 and defined in -:2
Stack trace:
#0 -(9): array_baz(1)
#1 {main}
  thrown in - on line 2
</pre></div>
    </div>
   </div>
  </div>
 </div>

 <div class="sect2" id="language.types.declarations.composite">
  <h3 class="title">Notas de uso de los tipos compuestos</h3>
  <p class="para">
   Las declaraciones de tipo compuesto están sujetas a algunas restricciones y
   realizarán un control de redundancia en el momento de la compilación para
   evitar errores simples.
  </p>

  <div class="caution"><strong class="caution">Precaución</strong>
   <p class="simpara">
    Anterior a PHP 8.2.0 y la introducción de los tipos <abbr title="Disjunctive Normal Form">DNF</abbr>, no
    era posible combinar las intersecciones de tipo con las uniones de tipo.
   </p>
  </div>

  <div class="sect3" id="language.types.declarations.composite.union">
   <h4 class="title">Tipos de uniones</h4>
   <div class="warning"><strong class="warning">Advertencia</strong>
    <p class="simpara">
     No es posible combinar los dos tipos de singleton
     <span class="type"><a href="language.types.singleton.php" class="type false">false</a></span> y <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span> juntos en una
     unión de tipo.
     Utilice en su lugar <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
    </p>
   </div>

   <div class="caution"><strong class="caution">Precaución</strong>
    <p class="simpara">
     Anterior a PHP 8.2.0, como <span class="type"><a href="language.types.singleton.php" class="type false">false</a></span> y <span class="type"><a href="language.types.null.php" class="type null">null</a></span> no
     podían ser utilizados como tipos autónomos, una unión de tipo
     compuesta únicamente de estos tipos no estaba permitida. Esto incluye los
     tipos siguientes: <span class="type"><a href="language.types.singleton.php" class="type false">false</a></span>, <code class="literal">false|null</code>
     y <code class="literal">?false</code>.
    </p>
   </div>

   <div class="sect4" id="language.types.declarations.nullable">
    <h5 class="title">Azúcar sintáctico de tipo nullable</h5>

    <p class="para">
     Una declaración de tipo de base única puede ser marcada como valor NULL
     anteponiendo el tipo de un signo de interrogación (<code class="literal">?</code>).
     Así <code class="literal">?T</code> y <code class="literal">T|null</code> son idénticos.
    </p>

    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <span class="simpara">
      Esta sintaxis es soportada a partir de PHP 7.1.0, y es anterior
      a la soporte generalizado de los tipos de unión.
     </span>
    </p></blockquote>

    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      También es posible obtener argumentos nullable haciendo de
      <code class="literal">null</code> el valor por defecto.
      Esto no es recomendado, ya que si el valor por defecto es modificado en
      una clase hija, se desencadenará una violación de compatibilidad de tipo ya que el tipo <span class="type"><a href="language.types.null.php" class="type null">null</a></span> deberá ser añadido a la declaración de tipo.
      Este comportamiento también está obsoleto a partir de PHP 8.4.
     </p>
     <div class="example" id="example-2">
      <p><strong>Ejemplo #2 Forma antigua de hacer los argumentos nullable</strong></p>
      <div class="example-contents">
<div class="annotation-interactive 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 /><br />function </span><span style="color: #0000BB">f</span><span style="color: #007700">(</span><span style="color: #0000BB">C $c </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$c</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(new </span><span style="color: #0000BB">C</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(</span><span style="color: #0000BB">null</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      <div class="example-contents"><p>El ejemplo anterior mostrará:</p></div>
      <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
object(C)#1 (0) {
}
NULL
</pre></div>
      </div>
     </div>
    </p></blockquote>
   </div>
  </div>

  <div class="sect3" id="language.types.declarations.composite.redundant">
   <h4 class="title">Tipos duplicados y redundantes</h4>
   <p class="para">
    Para detectar errores simples en las declaraciones de tipo compuesto,
    los tipos redundantes que pueden ser detectados sin realizar una carga de clase resultarán en un error de compilación. Esto incluye:

    <ul class="itemizedlist">
     <li class="listitem">
      <span class="simpara">
       Cada tipo resuelto por nombre solo puede ocurrir una vez.
       Los tipos como <code class="literal">int|string|INT</code> o
       <code class="literal">Countable&amp;Traversable&amp;COUNTABLE</code>
       generan un error.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       El uso de <span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span> o <span class="type"><a href="language.types.never.php" class="type never">never</a></span> resulta en un error.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">Para los tipos de uniones:</span>
      <ul class="itemizedlist">
       <li class="listitem">
        <span class="simpara">
         Si <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> es utilizado, <span class="type"><a href="language.types.singleton.php" class="type false">false</a></span> o
         <span class="type"><a href="language.types.singleton.php" class="type true">true</a></span> no puede ser utilizado adicionalmente.
        </span>
       </li>
       <li class="listitem">
        <span class="simpara">
         Si <span class="type"><a href="language.types.object.php" class="type object">object</a></span> es utilizado, los tipos de clase no pueden
         ser utilizados adicionalmente.
        </span>
       </li>
       <li class="listitem">
        <span class="simpara">
         Si <span class="type"><a href="language.types.iterable.php" class="type iterable">iterable</a></span> es utilizado, <span class="type"><a href="language.types.array.php" class="type array">array</a></span>
         y <span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span> no pueden ser utilizados
         adicionalmente.
        </span>
       </li>
      </ul>
     </li>
     <li class="listitem">
      <span class="simpara">Para los tipos de intersecciones:</span>
      <ul class="itemizedlist">
       <li class="listitem">
        <span class="simpara">
         El uso de un tipo que no es un tipo de clase genera un error.
        </span>
       </li>
       <li class="listitem">
        <span class="simpara">
         El uso de <span class="type">self</span>, <span class="type">parent</span> o
         <span class="type">static</span> resulta en un error.
        </span>
       </li>
      </ul>
     </li>
     <li class="listitem">
      <span class="simpara">Para los tipos <abbr title="Disjunctive Normal Form">DNF</abbr>:</span>
      <ul class="itemizedlist">
       <li class="listitem">
        <span class="simpara">
         Si un tipo más genérico es utilizado, el más restrictivo es redundante.
        </span>
       </li>
       <li class="listitem">
        <span class="simpara">
         Uso de dos tipos de intersección idénticos.
        </span>
       </li>
      </ul>
     </li>
    </ul>
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     Esto no garantiza que el tipo sea « mínimo », ya que esto requeriría
     cargar todos los tipos de clase utilizados.
    </span>
   </p></blockquote>

   <p class="para">
    Por ejemplo, si <code class="literal">A</code> y <code class="literal">B</code> son
    alias de clase, entonces <code class="literal">A|B</code> sigue siendo una unión de tipo
    legal, aunque sea posible reducir a <code class="literal">A</code> o
    <code class="literal">B</code>.
    Asimismo, si la clase <code class="code">B extends A {}</code>, entonces
    <code class="literal">A|B</code> también es una unión de tipo legal, aunque podría ser
    reducida al tipo <code class="literal">A</code> únicamente.
    <div class="informalexample">
     <div class="example-contents">
<div class="annotation-interactive 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">int</span><span style="color: #007700">|</span><span style="color: #0000BB">INT </span><span style="color: #007700">{} </span><span style="color: #FF8000">// No autorizado<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(): </span><span style="color: #0000BB">bool</span><span style="color: #007700">|</span><span style="color: #0000BB">false </span><span style="color: #007700">{} </span><span style="color: #FF8000">// No autorizado<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(): </span><span style="color: #0000BB">int</span><span style="color: #007700">&amp;</span><span style="color: #0000BB">Traversable </span><span style="color: #007700">{} </span><span style="color: #FF8000">// No autorizado<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(): </span><span style="color: #0000BB">self</span><span style="color: #007700">&amp;</span><span style="color: #0000BB">Traversable </span><span style="color: #007700">{} </span><span style="color: #FF8000">// No autorizado<br /><br /></span><span style="color: #007700">use </span><span style="color: #0000BB">A </span><span style="color: #007700">as </span><span style="color: #0000BB">B</span><span style="color: #007700">;<br />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: #FF8000">// No autorizado ("use" forma parte de la resolución de nombres)<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">&amp;</span><span style="color: #0000BB">B </span><span style="color: #007700">{} </span><span style="color: #FF8000">// No autorizado ("use" forma parte de la resolución de nombres)<br /><br /></span><span style="color: #0000BB">class_alias</span><span style="color: #007700">(</span><span style="color: #DD0000">'X'</span><span style="color: #007700">, </span><span style="color: #DD0000">'Y'</span><span style="color: #007700">);<br />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">Y </span><span style="color: #007700">{} </span><span style="color: #FF8000">// Autorizado (la redundancia solo se conoce en tiempo de ejecución)<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">&amp;</span><span style="color: #0000BB">Y </span><span style="color: #007700">{} </span><span style="color: #FF8000">// Autorizado (la redundancia solo se conoce en tiempo de ejecución)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

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

 <div class="sect2" id="language.types.declarations.examples">
  <h3 class="title">Ejemplos</h3>
  <div class="example" id="example-3">
   <p><strong>Ejemplo #3 Declaración de tipo de clase de base</strong></p>
   <div class="example-contents">
<div class="annotation-interactive 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 />class </span><span style="color: #0000BB">D </span><span style="color: #007700">extends </span><span style="color: #0000BB">C </span><span style="color: #007700">{}<br /><br /></span><span style="color: #FF8000">// Esta no extiende C.<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">E </span><span style="color: #007700">{}<br /><br />function </span><span style="color: #0000BB">f</span><span style="color: #007700">(</span><span style="color: #0000BB">C $c</span><span style="color: #007700">) {<br />    echo </span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$c</span><span style="color: #007700">).</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(new </span><span style="color: #0000BB">C</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(new </span><span style="color: #0000BB">D</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(new </span><span style="color: #0000BB">E</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>Resultado del ejemplo anterior en PHP 8:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
C
D

Fatal error: Uncaught TypeError: f(): Argument #1 ($c) must be of type C, E given, called in /in/gLonb on line 14 and defined in /in/gLonb:8
Stack trace:
#0 -(14): f(Object(E))
#1 {main}
  thrown in - on line 8
</pre></div>
   </div>
  </div>

  <div class="example" id="example-4">
   <p><strong>Ejemplo #4 Declaración de tipo de interfaz de base</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">interface </span><span style="color: #0000BB">I </span><span style="color: #007700">{ public function </span><span style="color: #0000BB">f</span><span style="color: #007700">(); }<br />class </span><span style="color: #0000BB">C </span><span style="color: #007700">implements </span><span style="color: #0000BB">I </span><span style="color: #007700">{ public function </span><span style="color: #0000BB">f</span><span style="color: #007700">() {} }<br /><br /></span><span style="color: #FF8000">// Esta no implementa I.<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">E </span><span style="color: #007700">{}<br /><br />function </span><span style="color: #0000BB">f</span><span style="color: #007700">(</span><span style="color: #0000BB">I $i</span><span style="color: #007700">) {<br />    echo </span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$i</span><span style="color: #007700">).</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(new </span><span style="color: #0000BB">C</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(new </span><span style="color: #0000BB">E</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>Resultado del ejemplo anterior en PHP 8:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
C

Fatal error: Uncaught TypeError: f(): Argument #1 ($i) must be of type I, E given, called in - on line 13 and defined in -:8
Stack trace:
#0 -(13): f(Object(E))
#1 {main}
  thrown in - on line 8
</pre></div>
   </div>
  </div>

  <div class="example" id="example-5">
   <p><strong>Ejemplo #5 Declaración de tipo de retorno de base</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">sum</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">float </span><span style="color: #007700">{<br />    return </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Note que un float será devuelto.<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sum</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 /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

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

  <div class="example" id="example-6">
   <p><strong>Ejemplo #6 Retorno de un objeto</strong></p>
   <div class="example-contents">
<div class="annotation-interactive 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 /><br />function </span><span style="color: #0000BB">getC</span><span style="color: #007700">(): </span><span style="color: #0000BB">C </span><span style="color: #007700">{<br />    return new </span><span style="color: #0000BB">C</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">getC</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>El ejemplo anterior mostrará:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
object(C)#1 (0) {
}
</pre></div>
   </div>
  </div>

  <div class="example" id="example-7">
   <p><strong>Ejemplo #7 Declaración de tipo de argumento nullable</strong></p>
   <div class="example-contents">
    <div class="annotation-interactive 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 /><br />function </span><span style="color: #0000BB">f</span><span style="color: #007700">(?</span><span style="color: #0000BB">C $c</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$c</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(new </span><span style="color: #0000BB">C</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">f</span><span style="color: #007700">(</span><span style="color: #0000BB">null</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>El ejemplo anterior mostrará:</p></div>
   <div class="example-contents screen">
    <div class="annotation-interactive cdata"><pre>
object(C)#1 (0) {
}
NULL
</pre></div>
   </div>
  </div>

  <div class="example" id="example-8">
   <p><strong>Ejemplo #8 Declaración de tipo de retorno nullable</strong></p>
   <div class="example-contents">
    <div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">get_item</span><span style="color: #007700">(): ?</span><span style="color: #0000BB">string </span><span style="color: #007700">{<br />    if (isset(</span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'item'</span><span style="color: #007700">])) {<br />        return </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'item'</span><span style="color: #007700">];<br />    } else {<br />        return </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br />    }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  <div class="example" id="example-9">
   <p><strong>Ejemplo #9 Declaración de tipo para las propiedades de clase</strong></p>
   <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">User </span><span style="color: #007700">{<br />    public static </span><span style="color: #0000BB">string $foo </span><span style="color: #007700">= </span><span style="color: #DD0000">'foo'</span><span style="color: #007700">;<br /><br />    public </span><span style="color: #0000BB">int $id</span><span style="color: #007700">;<br />    public </span><span style="color: #0000BB">string $username</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">int $id</span><span style="color: #007700">, </span><span style="color: #0000BB">string $username</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id </span><span style="color: #007700">= </span><span style="color: #0000BB">$id</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">username </span><span style="color: #007700">= </span><span style="color: #0000BB">$username</span><span style="color: #007700">;<br />    }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

  
 <div class="sect2" id="language.types.declarations.strict">
  <h3 class="title">Tipado estricto</h3>

  <p class="para">
   Por defecto, PHP convertirá los valores de un tipo incorrecto al tipo
   escalar esperado siempre que sea posible. Por ejemplo, una función, que espera
   como parámetro una <span class="type"><a href="language.types.string.php" class="type string">string</a></span>, a la que se pasa un
   <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> recibirá una variable de tipo <span class="type"><a href="language.types.string.php" class="type string">string</a></span>.
  </p>

  <p class="para">
   Es posible activar el modo de tipado estricto archivo por archivo.
   En el modo estricto, solo una variable que coincida exactamente con el
   tipo esperado en la declaración será aceptada, de lo contrario se lanzará un
   <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span>.
   La única excepción a esta regla es que un valor de tipo <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>
   puede pasar una declaración de tipo <span class="type"><a href="language.types.float.php" class="type float">float</a></span>.
  </p>

  <div class="warning"><strong class="warning">Advertencia</strong>
   <p class="simpara">
    Las llamadas a funciones desde funciones internas no serán
    afectadas por la declaración <code class="literal">strict_types</code>.
   </p>
  </div>

  <p class="para">
   Para activar el modo estricto, se utiliza la expresión <a href="control-structures.declare.php" class="link"><code class="literal">declare</code></a> con la
   declaración <code class="literal">strict_types</code>:
  </p>

  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    El tipado estricto se aplica a las llamadas de función realizadas desde
    <em>dentro</em> de un archivo cuyo tipado estricto está activo, y no a las funciones declaradas en ese archivo. Si un archivo cuyo tipado estricto no está activado realiza una llamada a una función que ha sido definida en un archivo cuyo tipo estricto está activo, la preferencia del llamante (modo coercitivo) será respetada y el valor será forzado.
   </p>
  </p></blockquote>

  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    El tipado estricto solo está definido para las declaraciones de tipo escalar.
   </p>
  </p></blockquote>

  <div class="example" id="example-10">
   <p><strong>Ejemplo #10 Tipado estricto para los valores de argumentos</strong></p>
   <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">declare(</span><span style="color: #0000BB">strict_types</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br />function </span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">, </span><span style="color: #0000BB">int $b</span><span style="color: #007700">) {<br />    return </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sum</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 /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">1.5</span><span style="color: #007700">, </span><span style="color: #0000BB">2.5</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>Resultado del ejemplo anterior en PHP 8:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
int(3)

Fatal error: Uncaught TypeError: sum(): Argument #1 ($a) must be of type int, float given, called in - on line 9 and defined in -:4
Stack trace:
#0 -(9): sum(1.5, 2.5)
#1 {main}
  thrown in - on line 4
</pre></div>
   </div>
  </div>

  <div class="example" id="example-11">
   <p><strong>Ejemplo #11 Tipado coercitivo para los valores de argumentos</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">, </span><span style="color: #0000BB">int $b</span><span style="color: #007700">) {<br />    return </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sum</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 /><br /></span><span style="color: #FF8000">// Estos serán forzados a enteros: ¡note la salida a continuación!<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">1.5</span><span style="color: #007700">, </span><span style="color: #0000BB">2.5</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

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

  <div class="example" id="example-12">
   <p><strong>Ejemplo #12 Tipado estricto para los valores de retorno</strong></p>
   <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">declare(</span><span style="color: #0000BB">strict_types</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br />function </span><span style="color: #0000BB">sum</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">int </span><span style="color: #007700">{<br />    return </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sum</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 /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">sum</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2.5</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

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

Fatal error: Uncaught TypeError: sum(): Return value must be of type int, float returned in -:5
Stack trace:
#0 -(9): sum(1, 2.5)
#1 {main}
  thrown in - on line 5
</pre></div>
   </div>
  </div>
 </div>

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