<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.control-structures.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'control-structures.match.php',
    1 => 'match',
    2 => 'match',
  ),
  'up' => 
  array (
    0 => 'language.control-structures.php',
    1 => 'Estructuras de Control',
  ),
  'prev' => 
  array (
    0 => 'control-structures.switch.php',
    1 => 'switch',
  ),
  'next' => 
  array (
    0 => 'control-structures.declare.php',
    1 => 'declare',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'language/control-structures/match.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="control-structures.match" class="sect1">
 <h2 class="title">match</h2>
 <p class="verinfo">(PHP 8)</p>
 <p class="para">
  La expresión <code class="literal">match</code> permite realizar una evaluación basada en el
  control de identidad de un valor.
  De manera similar a una instrucción <code class="literal">switch</code>, una expresión
  <code class="literal">match</code> tiene una expresión sujeto que es
  comparada con varias alternativas. A diferencia de <code class="literal">switch</code>,
  se evalúa a un valor, como las expresiones ternarias.
  A diferencia de <code class="literal">switch</code>, la comparación es una verificación de identidad
  (<code class="code">===</code>) en lugar de un control de igualdad débil (<code class="code">==</code>).
  Las expresiones Match están disponibles a partir de PHP 8.0.0.
 </p>

 <div class="example" id="example-1">
  <p><strong>Ejemplo #1 Estructura de una expresión <code class="literal">match</code></strong></p>
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$return_value </span><span style="color: #007700">= match (</span><span style="color: #0000BB">subject_expression</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">single_conditional_expression </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">return_expression</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">conditional_expression1</span><span style="color: #007700">, </span><span style="color: #0000BB">conditional_expression2 </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">return_expression</span><span style="color: #007700">,<br />};<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>


   <div class="example" id="example-2">
  <p><strong>Ejemplo #2 Uso básico de las expresiones <code class="literal">match</code></strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$food </span><span style="color: #007700">= </span><span style="color: #DD0000">'cake'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$return_value </span><span style="color: #007700">= match (</span><span style="color: #0000BB">$food</span><span style="color: #007700">) {<br />    </span><span style="color: #DD0000">'apple' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'This food is an apple'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'bar' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'This food is a bar'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'cake' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'This food is a cake'</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">$return_value</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="cdata"><pre>
string(19) &quot;This food is a cake&quot;
</pre></div>
   </div>
  </div>

  <div class="example" id="example-3">
   <p><strong>Ejemplo #3 Ejemplo de uso de <code class="literal">match</code> con operadores de comparación</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$age </span><span style="color: #007700">= </span><span style="color: #0000BB">18</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$output </span><span style="color: #007700">= match (</span><span style="color: #0000BB">true</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">2 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"Bebé"</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">13 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"Niño"</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&lt;= </span><span style="color: #0000BB">19 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"Adolescente"</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&gt;= </span><span style="color: #0000BB">40 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"Adulto mayor"</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">19 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"Adulto joven"</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">$output</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="cdata"><pre>
string(12) &quot;Adolescente&quot;
</pre></div>
   </div>
  </div>

  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    El resultado de una expresión <code class="literal">match</code> no necesita ser utilizado.
   </span>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    Cuando una expresión <code class="literal">match</code> se utiliza como una expresión autónoma,
    <em>debe</em> ser terminada
    por un punto y coma <code class="literal">;</code>.
   </span>
  </p></blockquote>
 </div>

 <p class="para">
  La expresión <code class="literal">match</code> es similar a una instrucción
  <code class="literal">switch</code> pero presenta algunas diferencias esenciales:

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     Una expresión <code class="literal">match</code> compara los valores de manera estricta (<code class="code">===</code>)
     y no de manera débil como lo hace la instrucción switch.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Una expresión <code class="literal">match</code> devuelve un valor.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Las expresiones <code class="literal">match</code> no pasan a los casos siguientes como lo hacen las
     instrucciones <code class="literal">switch</code>.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Una expresión <code class="literal">match</code> debe ser exhaustiva.
    </span>
   </li>
  </ul>
 </p>

 <p class="para">
  Al igual que las instrucciones <code class="literal">switch</code>, las expresiones <code class="literal">match</code>
  se ejecutan brazo por brazo. Al principio, ningún código se ejecuta.
  Las expresiones condicionales solo se evalúan si todas las expresiones condicionales
  anteriores no coinciden con la expresión del sujeto.
  Solo la expresión de retorno correspondiente a la expresión condicional correspondiente será evaluada.
  Por ejemplo:
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$result </span><span style="color: #007700">= match (</span><span style="color: #0000BB">$x</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">foo</span><span style="color: #007700">() =&gt; </span><span style="color: #DD0000">'value'</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">() =&gt; </span><span style="color: #DD0000">'value'</span><span style="color: #007700">, </span><span style="color: #FF8000">// $this-&gt;bar() no es llamado si foo() === $x<br />    </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">baz </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">beep</span><span style="color: #007700">(), </span><span style="color: #FF8000">// beep() no es llamado a menos que $x === $this-&gt;baz<br />    // etc.<br /></span><span style="color: #007700">};<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>

 <p class="para">
  Los brazos de la expresión de <code class="literal">match</code> pueden contener múltiples expresiones
  separadas por una coma. Se trata de un OU lógico y de una abreviación para múltiples brazos
  que utilizan la misma expresión como resultado.
 </p>
 <p class="para">
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$result </span><span style="color: #007700">= match (</span><span style="color: #0000BB">$x</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">// Este brazo<br />    </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">$c </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">5</span><span style="color: #007700">,<br />    </span><span style="color: #FF8000">// Es equivalente a estos tres brazos:<br />    </span><span style="color: #0000BB">$a </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">5</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$b </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">5</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$c </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">5</span><span style="color: #007700">,<br />};<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  El patrón <code class="literal">default</code> es un caso particular.
  Este patrón coincide con todo lo que no ha sido buscado previamente.
  Por ejemplo:
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$expressionResult </span><span style="color: #007700">= match (</span><span style="color: #0000BB">$condition</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2 </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">foo</span><span style="color: #007700">(),<br />    </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4 </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">bar</span><span style="color: #007700">(),<br />    default =&gt; </span><span style="color: #0000BB">baz</span><span style="color: #007700">(),<br />};<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    El uso de múltiples patrones por defecto provocará un error
   <strong><code>E_FATAL_ERROR</code></strong>.
   </span>
  </p></blockquote>
 </p>

 <p class="para">
  Una expresión <code class="literal">match</code> debe ser exhaustiva. Si la expresión
  no es tratada por ningún brazo de <code class="literal">match</code>, se lanza un error
 <span class="classname"><a href="class.unhandledmatcherror.php" class="classname">UnhandledMatchError</a></span>.
 </p>

 <div class="example" id="example-4">
 <p><strong>Ejemplo #4 Ejemplo de una expresión match no manejada</strong></p>
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$condition </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">;<br /><br />try {<br />    match (</span><span style="color: #0000BB">$condition</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2 </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">foo</span><span style="color: #007700">(),<br />        </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4 </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">bar</span><span style="color: #007700">(),<br />    };<br />} catch (</span><span style="color: #0000BB">\UnhandledMatchError $e</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$e</span><span style="color: #007700">);<br />}<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="cdata"><pre>
object(UnhandledMatchError)#1 (7) {
  [&quot;message&quot;:protected]=&gt;
  string(33) &quot;Unhandled match value of type int&quot;
  [&quot;string&quot;:&quot;Error&quot;:private]=&gt;
  string(0) &quot;&quot;
  [&quot;code&quot;:protected]=&gt;
  int(0)
  [&quot;file&quot;:protected]=&gt;
  string(9) &quot;/in/ICgGK&quot;
  [&quot;line&quot;:protected]=&gt;
  int(6)
  [&quot;trace&quot;:&quot;Error&quot;:private]=&gt;
  array(0) {
  }
  [&quot;previous&quot;:&quot;Error&quot;:private]=&gt;
  NULL
}
</pre></div>
  </div>
 </div>

 <div class="sect2">
  <h3 class="title">Uso de expresiones match para manejar controles de no identidad</h3>
  <p class="para">
   Es posible utilizar una expresión <code class="literal">match</code> para tratar
   los casos condicionales de no identidad utilizando <code class="code">true</code> como expresión sujeto.
  </p>

  <div class="example" id="example-5">
  <p><strong>Ejemplo #5 Uso de una expresión match generalizada para realizar ramificaciones sobre rangos de enteros</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$age </span><span style="color: #007700">= </span><span style="color: #0000BB">23</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$result </span><span style="color: #007700">= match (</span><span style="color: #0000BB">true</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&gt;= </span><span style="color: #0000BB">65 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'senior'</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&gt;= </span><span style="color: #0000BB">25 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'adult'</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&gt;= </span><span style="color: #0000BB">18 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'young adult'</span><span style="color: #007700">,<br />    default =&gt; </span><span style="color: #DD0000">'kid'</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">$result</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="cdata"><pre>
string(11) &quot;young adult&quot;
</pre></div>
   </div>
  </div>

  <div class="example" id="example-6">
  <p><strong>Ejemplo #6 Uso de una expresión match generalizada para realizar ramificaciones sobre el contenido de una cadena de caracteres</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$text </span><span style="color: #007700">= </span><span style="color: #DD0000">'Bienvenidos a nuestra casa'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$result </span><span style="color: #007700">= match (</span><span style="color: #0000BB">true</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">str_contains</span><span style="color: #007700">(</span><span style="color: #0000BB">$text</span><span style="color: #007700">, </span><span style="color: #DD0000">'Welcome'</span><span style="color: #007700">), </span><span style="color: #0000BB">str_contains</span><span style="color: #007700">(</span><span style="color: #0000BB">$text</span><span style="color: #007700">, </span><span style="color: #DD0000">'Hello'</span><span style="color: #007700">) =&gt; </span><span style="color: #DD0000">'en'</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">str_contains</span><span style="color: #007700">(</span><span style="color: #0000BB">$text</span><span style="color: #007700">, </span><span style="color: #DD0000">'Bienvenidos'</span><span style="color: #007700">), </span><span style="color: #0000BB">str_contains</span><span style="color: #007700">(</span><span style="color: #0000BB">$text</span><span style="color: #007700">, </span><span style="color: #DD0000">'Hola'</span><span style="color: #007700">) =&gt; </span><span style="color: #DD0000">'es'</span><span style="color: #007700">,<br />    </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">};<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$result</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="cdata"><pre>
string(2) &quot;es&quot;
</pre></div>
   </div>
  </div>
 </div>
</div><?php manual_footer($setup); ?>