1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-25 16:22:18 +01:00
Files
archived-doc-ru/language/control-structures/switch.xml
2023-04-14 21:51:22 +03:00

339 lines
12 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: cdc9d28d334bbc08386fecf8aade66080004a9dd Maintainer: mch Status: ready -->
<!-- Reviewed: no -->
<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>
Оператор <literal>switch</literal> похож на ряд операторов IF
с одинаковым условием. Во многих случаях вам может понадобиться
сравнивать одну и ту же переменную (или выражение) с множеством
различных значений и выполнять различные участки кода в зависимости
от того, какое значение принимает эта переменная (или выражение). Это
именно тот случай, для которого удобен оператор <literal>switch</literal>.
</simpara>
<note>
<simpara>
Обратите внимание, что в отличие от некоторых других языков, оператор
<link linkend="control-structures.continue">continue</link> применяется в конструкциях
<literal>switch</literal> и действует подобно оператору <literal>break</literal>. Если у вас
конструкция <literal>switch</literal> находится внутри цикла, и вам необходимо перейти к
следующей итерации цикла, используйте <literal>continue 2</literal>.
</simpara>
</note>
<note>
<para>
Заметьте, что конструкция switch/case использует
<link linkend="types.comparisions-loose">нестрогое сравнение (==)</link>.
</para>
</note>
<para>
В следующем примере каждый блок кода эквивалентен.
В одном используется серия операторов <literal>if</literal> и <literal>elseif</literal>,
а в другом - оператор <literal>switch</literal>. В каждом случае результат один и тот же.
<example>
<title>Оператор <literal>switch</literal></title>
<programlisting role="php">
<![CDATA[
<?php
// Оператор switch:
switch ($i) {
case 0:
echo "i равно 0";
break;
case 1:
echo "i равно 1";
break;
case 2:
echo "i равно 2";
break;
}
// Эквивалентно:
if ($i == 0) {
echo "i равно 0";
} elseif ($i == 1) {
echo "i равно 1";
} elseif ($i == 2) {
echo "i равно 2";
}
?>
]]>
</programlisting>
</example>
<example>
<title>Оператор <literal>switch</literal> допускает сравнение с типом <type>string</type></title>
<programlisting role="php">
<![CDATA[
<?php
switch ($i) {
case "яблоко":
echo "i это яблоко";
break;
case "шоколадка":
echo "i это шоколадка";
break;
case "пирог":
echo "i это пирог";
break;
}
?>
]]>
</programlisting>
</example>
</para>
<para>
Важно понять, как оператор <literal>switch</literal> выполняется,
чтобы избежать ошибок. Оператор <literal>switch</literal> исполняет
строчка за строчкой (на самом деле выражение за выражением).
В начале никакой код не исполняется. Только в случае
нахождения оператора <literal>case</literal>, значение которого
совпадает со значением выражения в операторе <literal>switch</literal>,
PHP начинает исполнять операторы. PHP продолжает исполнять операторы
до конца блока <literal>switch</literal> либо до тех пор, пока не
встретит оператор <literal>break</literal>. Если вы не напишете
оператор <literal>break</literal> в конце секции case, PHP будет продолжать
исполнять команды следующей секции case. Например :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch ($i) {
case 0:
echo "i равно 0";
case 1:
echo "i равно 1";
case 2:
echo "i равно 2";
}
?>
]]>
</programlisting>
</informalexample>
</para>
<simpara>
В этом примере, если <varname>$i</varname> равно 0, то PHP исполнит все операторы echo!
Если <varname>$i</varname> равно 1, PHP исполнит два последних оператора echo.
Вы получите ожидаемое поведение оператора ('i равно 2' будет отображено) только, если
<varname>$i</varname> будет равно 2. Таким образом, важно не забывать об операторах
<literal>break</literal> (даже если вы, возможно, хотите избежать его использования по назначению
при определённых обстоятельствах).
</simpara>
<simpara>
В операторе <literal>switch</literal> выражение вычисляется
один раз и этот результат сравнивается с каждым оператором
<literal>case</literal>. В выражении <literal>elseif</literal>,
выражение вычисляется снова. Если ваше условие более сложное,
чем простое сравнение и/или находится в цикле, конструкция
<literal>switch</literal> может работать быстрее.
</simpara>
<para>
Список операторов для исполнения в секции case также может быть пустым, что просто
передаёт управление списку операторов в следующей секции case.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i меньше чем 3, но неотрицательный";
break;
case 3:
echo "i равно 3";
}
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Специальный вид конструкции case - <literal>default</literal>. Сюда управление попадает
тогда, когда не сработал ни один из других операторов case. Например:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch ($i) {
case 0:
echo "i равно 0";
break;
case 1:
echo "i равно 1";
break;
case 2:
echo "i равно 2";
break;
default:
echo "i не равно 0, 1 или 2";
}
?>
]]>
</programlisting>
</informalexample>
<note>
<simpara>
Несколько указаний default вызовут ошибку <constant>E_COMPILE_ERROR</constant>.
</simpara>
</note>
<note>
<simpara>
Формально конструкция <literal>default</literal> может быть перечислена в любом месте.
Она будет использоваться только в том случае, если ни один другой вариант не подходит.
Однако, по соглашению, лучше всего поместить её в конец, как последнюю конструкцию.
</simpara>
</note>
</para>
<para>
Если ни одна конструкция <literal>case</literal> не совпадает и нет конструкции <literal>default</literal>,
то код не будет выполнен, как если бы ни одно утверждение <literal>if</literal> не было истинным.
</para>
<para>
Значение case может быть задано в виде выражения. Однако это выражение будет оценено само по себе,
а затем слабо сопоставлено со значением switch.
Это означает, что его нельзя использовать для сложных оценок значения switch. Например:
<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;
}
// Выведет "B"
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Для более сложных сравнений в качестве значения switch может использоваться значение &true;.
Или, как вариант, вместо <literal>switch</literal> использовать блоки <literal>if</literal>-<literal>else</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;
}
// Выведет "B"
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Возможен альтернативный синтаксис для управляющей структуры switch.
Для более детальной информации, смотрите <link
linkend="control-structures.alternative-syntax">Альтернативный синтаксис для
управляющих структур</link>.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch ($i):
case 0:
echo "i равно 0";
break;
case 1:
echo "i равно 1";
break;
case 2:
echo "i равно 2";
break;
default:
echo "i не равно 0, 1 или 2";
endswitch;
?>
]]>
</programlisting>
</informalexample>
</para>
<para>
Возможно использование точки с запятой вместо двоеточия после оператора case. К примеру :
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
switch($beer)
{
case 'tuborg';
case 'carlsberg';
case 'stella';
case 'heineken';
echo 'Хороший выбор';
break;
default;
echo 'Пожалуйста, сделайте новый выбор...';
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
-->