1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-24 07:22:16 +01:00
Files
2025-05-06 22:42:56 +02:00

329 lines
8.7 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: cdc9d28d334bbc08386fecf8aade66080004a9dd Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes -->
<sect1 xml:id="control-structures.switch" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>switch</title>
<?phpdoc print-version-for="switch"?>
<simpara>
La instrucción <literal>switch</literal> equivale a una serie de instrucciones
<literal>if</literal>. En numerosas ocasiones, se necesitará comparar la misma variable (o expresión) con un gran número de valores
diferentes, y ejecutar diferentes partes de código según el valor
al que sea igual. Esto es exactamente para lo que sirve la instrucción
<literal>switch</literal>.
</simpara>
<note>
<simpara>
Téngase en cuenta que, a diferencia de otros lenguajes, la estructura
<link linkend="control-structures.continue">continue</link> se aplica
a las estructuras <literal>switch</literal> y se comporta de la misma manera
que <literal>break</literal>.
Si se tiene un <literal>switch</literal> dentro de un bucle, y se desea continuar hasta la siguiente iteración del bucle externo,
se debe utilizar <literal>continue 2</literal>.
</simpara>
</note>
<note>
<para>
Téngase en cuenta que switch/case provoca una
<link linkend="types.comparisions-loose">comparación amplia</link>.
</para>
</note>
<para>
En el siguiente ejemplo, cada bloque de código es equivalente.
Uno utiliza una serie de instrucciones <literal>if</literal> y
<literal>elseif</literal>, y el otro una instrucción de tipo
<literal>switch</literal>. En cada caso, la salida es la misma.
<example>
<title>Instrucción <literal>switch</literal></title>
<programlisting role="php">
<![CDATA[
<?php
// Este switch:
switch ($i) {
case 0:
echo "i igual 0";
break;
case 1:
echo "i igual 1";
break;
case 2:
echo "i igual 2";
break;
}
// Equivale a:
if ($i == 0) {
echo "i igual 0";
} elseif ($i == 1) {
echo "i igual 1";
} elseif ($i == 2) {
echo "i igual 2";
}
?>
]]>
</programlisting>
</example>
</para>
<para>
Es importante entender que la instrucción
<literal>switch</literal> ejecuta cada una de las
cláusulas en orden. La instrucción <literal>switch</literal>
se ejecuta línea por línea. Al principio,
no se ejecuta ningún código. Solo cuando se encuentra una instrucción
<literal>case</literal> cuya
expresión se evalúa a un valor que coincide con el valor de la
expresión <literal>switch</literal>, PHP ejecuta entonces las instrucciones correspondientes.
PHP continúa ejecutando las instrucciones hasta
el final del bloque de instrucciones del <literal>switch</literal>,
o bien hasta que encuentra la instrucción <literal>break</literal>.
Si no se puede utilizar la instrucción
<literal>break</literal> al final de la instrucción
<literal>case</literal>, PHP continuará ejecutando
todas las instrucciones que siguen. Por ejemplo :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch ($i) {
case 0:
echo "i igual 0";
case 1:
echo "i igual 1";
case 2:
echo "i igual 2";
}
?>
]]>
</programlisting>
</informalexample>
</para>
<simpara>
En este ejemplo, si <varname>$i</varname> es igual a 0, PHP ejecutará
todas las instrucciones que
siguen ! Si <varname>$i</varname> es igual a 1, PHP ejecutará
las dos últimas instrucciones. Y solo si <varname>$i</varname> es
igual a 2, se obtendrá el resultado
esperado, es decir, la visualización de
"i igual 2". Por lo tanto, es importante no olvidar
la instrucción <literal>break</literal> (aunque es posible que se omita en ciertas circunstancias).
</simpara>
<simpara>
En un comando <literal>switch</literal>, una condición se evalúa solo una vez, y el resultado se
compara con cada <literal>case</literal>.
En una estructura <literal>elseif</literal>, las condiciones se evalúan en cada comparación. Si la
condición es más complicada que una simple
comparación, o bien forma parte de un bucle,
<literal>switch</literal> será más rápido.
</simpara>
<para>
La lista de comandos de un <literal>case</literal> puede
estar vacía, en cuyo caso PHP utilizará la lista de
comandos del caso siguiente.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i es menor que 3 pero no es negativo";
break;
case 3:
echo "i igual 3";
}
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Un caso especial es <literal>default</literal>. Este caso se utiliza cuando todos
los otros casos han fallado. Por ejemplo :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch ($i) {
case 0:
echo "i igual 0";
break;
case 1:
echo "i igual 1";
break;
case 2:
echo "i igual 2";
break;
default:
echo "i no es igual a 2, ni a 1, ni a 0.";
}
?>
]]>
</programlisting>
</informalexample>
<note>
<simpara>
Varios casos default generarán un error de nivel
<constant>E_COMPILE_ERROR</constant>.
</simpara>
</note>
<note>
<simpara>
Técnicamente, el caso <literal>default</literal> puede ser colocado
en cualquier posición. Solo se utilizará si ningún otro caso coincide.
Sin embargo, por convención, es preferible colocarlo al final.
</simpara>
</note>
</para>
<para>
Si ningún <literal>case</literal> coincide, y no hay un <literal>default</literal>, entonces no se ejecutará ningún código, al igual que si ninguna instrucción <literal>if</literal> fuera verdadera.
</para>
<para>
Un valor de <literal>case</literal> puede ser dado en forma de expresión. Sin embargo, esta expresión será
evaluada sola, y luego comparada de manera aproximada con el valor del <literal>switch</literal>. Esto significa
que no puede ser utilizada para evaluaciones complejas del valor del <literal>switch</literal>. Por ejemplo :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$target = 1;
$start = 3;
switch ($target) {
case $start - 1:
print "A";
break;
case $start - 2:
print "B";
break;
case $start - 3:
print "C";
break;
case $start - 4:
print "D";
break;
}
// Muestra "B"
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Para comparaciones más complejas, el valor &true; puede ser utilizado como valor de <literal>switch</literal>.
O, alternativamente, bloques <literal>if</literal>-<literal>else</literal> en lugar de <literal>switch</literal>.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$offset = 1;
$start = 3;
switch (true) {
case $start - $offset === 1:
print "A";
break;
case $start - $offset === 2:
print "B";
break;
case $start - $offset === 3:
print "C";
break;
case $start - $offset === 4:
print "D";
break;
}
// Muestra "B"
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
La sintaxis alternativa para esta estructura de control es
la siguiente : (para más información, ver
<link linkend="control-structures.alternative-syntax">sintaxis
alternativas</link>).
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch ($i):
case 0:
echo "i igual 0";
break;
case 1:
echo "i igual 1";
break;
case 2:
echo "i igual 2";
break;
default:
echo "i no es igual a 2, ni a 1, ni a 0";
endswitch;
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Es posible utilizar un punto y coma en lugar de dos puntos después
de un case, como sigue :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch($beer)
{
case 'leffe';
case 'grimbergen';
case 'guinness';
echo 'Buena elección';
break;
default;
echo 'Por favor, haga una elección...';
break;
}
?>
]]>
</programlisting>
</informalexample>
</para>
<sect2 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member>&match;</member>
</simplelist>
</para>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->