mirror of
https://github.com/php/doc-es.git
synced 2026-03-24 07:22:16 +01:00
329 lines
8.7 KiB
XML
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
|
|
-->
|