mirror of
https://github.com/php/doc-ru.git
synced 2026-03-25 16:22:18 +01:00
339 lines
12 KiB
XML
339 lines
12 KiB
XML
<?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
|
||
-->
|