PHP скрипты

MySQL

Apache

phpMyADmin

6.4: Условный оператор Switch

Главная Страница » Книги по PHP » Самоучитель PHP 5 для чайников с примерами » Условный оператор Switch

К сожалению, управляющий оператор if даже в сочетании с ключевыми словами else и elseif иногда может оказаться неэффективным при решении определенного класса задач. Например, в книжный магазин завезли несколько новых книг. Нужно написать PHP-приложение, которое выводит фамилию автора книги, указанную пользователем. Прежде чем ваши руки устремятся к клавиатуре, давайте немного поразмышляем о способе решения.

Итак, представим наше PHP-приложение в виде «черного ящика», то есть имеются входные и выходные данные, а что внутри пока неизвестно. На данный момент в нашем распоряжении есть оператор if, с помощью которого задача решается следующим образом. Так как от пользователя в программу поступает название книги, то можно последовательно сравнивать его со всеми имеющимися названиями и при совпадении выводить соответствующую фамилию (листинг 6.9).

Листинг 6.9. Оператор Switch.

‹html›
‹head›
‹title› Оператор Switch ‹/title›
‹/head›
‹body›
‹?php
$book_name = "Самоучитель по PHP"; // входные данные
if ( $book_name == "Самоучитель no Perl" )
{
echo "Автор: Петров"; // выходные данные
}
elseif ( $book_name == "Самоучитель no ASP" )
{
echo "Автор: Иванов"; // выходные данные
}
elseif ( $book_name == "Самоучитель по РНР" )
{
echo "Автор: Сидоров"; // выходные данные
}
?›
‹/body›
‹/html›

Сейчас нас не интересует способ поступления названия книги, поэтому оно просто хранится в переменной $book_name. Чтобы избежать многократного выполнения оператора if, мы использовали его в сочетании с ключевым словом elseif. В результате программа выведет фамилию Сидоров, так как выражение $book_name == "Самоучитель по РНР" имеет значение TRUE, а все предыдущие - FALSE.

Несложно заметить, что конструкции подобного типа очень громоздки, так как они скорее предназначены для малого количества сравнений. В данном случае применение оператора if выглядит искусственным.

Для более логичного и эффективного решения подобных задач применяется управляющий оператор выбора switch:

switch (выражение)
{
case выражение : действие;
break;
...
case выражение : действие;
break;

default : действие;
}

Вся конструкция начинается со слова switch. Далее в круглых скобках следует выражение, которое, в отличие от выражения оператора if, может быть не только типа Boolean, но и Integer, Double и String. От его значения зависит, какие действия выполнять. В нашем случае это может быть переменная $book_name, так как именно по ней определяется какую фамилию выводить.

После закрывающей круглой скобки следует блок, в котором находятся выражения для сравнения и соответствующие им действия. Синтаксически это оформляется с помощью специального слова case и знака двоеточия (смотрите пример).

Оператор break служит для того, чтобы выйти из конструкции switch в случае, когда значения выражений совпали. Подробно о нем читайте дальше в этой главе.

После слова default следует действие, которое нужно выполнить, если совпадений не было. Например, вывести сообщение, что запрашиваемой книги нет в магазине.

Решение задачи с использованием оператора switch будет выглядеть так, как показано на примере листинга 6.10.

Листинг 6.10. Решение задачи с помощью оператора Switch.

‹html›
‹head›
‹title›Оператор Switch‹/title›
‹/head›
‹body›
‹?php
$book_name = "Самоучитель no PHP";
switch ( $book_name )
{
// выводится, если $book_name имеет значение "Самоучитель по Perl"
case "Самоучитель по Perl": echo "Автор: Петров";
// выход из конструкции switch
break;
case "Самоучитель по ASP": echo "Автор: Иванов";
break;
case "Самоучитель по PHP": echo "Автор: Сидоров";
break;
// сообщение выведется, если не было совпадений
default: echo "Такой книги в наличии нет";
}
?›
‹/body›
‹/html›

Надо отметить, что присутствие в конструкции switch слов default и break не является обязательным. Если опустить слово default, то в случае, когда совпадений не было, никаких действий просто не выполняется. Интереснее дело обстоит с оператором break (листинг 6.11).

Листинг6.11. Особенности оператора Break.

‹html›
‹head›
‹title›Особенности оператора Break‹/title›
‹/head›
‹body›
‹?php
$book_name = "Самоучитель no Perl";
switch ( $book_name )
{
case "Самоучитель no Perl": echo "Автор: Петров";
case "Самоучитель no ASP": echo "Автор: Иванов";
break;
case "Самоучитель no PHP": echo "Автор: Сидоров";
break;
default: echo "Такой книги в наличии нет";
}
?>
‹/body›
‹/html›

В результате выведутся фамилии Петров и Иванов. Другими словами, если совпали выражения и опущен оператор break, то выполнятся все действия вплоть до следующего оператора break. В нашем случае это привело к неправильной работе программы. Но есть случаи, когда отсутствие break помогает избежать многократного повторения в конструкции switch. Например, Петров написал не только самоучитель по Perl, но и еще несколько книг, тогда задачу можно решить так, как показано на примере листинга 6.12.

Листинг 6.12. Особенности оператора Break.

‹html›
‹head›
‹title›Особенности оператора Break‹/title›
‹/head›
‹body›
‹?php
$book_name = "Информатика в школе";
switch ( $book_name )
{
case "Самоучитель no Perl":
case "Информатика в школе":
case "Программирование в Internet": echo "Автор: Петров";
break;
case "Самоучитель no ASP": echo "Автор: Иванов";
break;
case "Самоучитель no PHP": echo "Автор: Сидоров";
break;
default: echo "Такой книги в наличии нет";
}
?›
‹/body›
‹/html›

В этом случае если пользователь ввел название одной из трех книг Петрова, выведется его фамилия, так как отсутствует оператор break. Стоит отметить, что таким образом задача решается намного эффективнее, чем многократное повторение операторов break и вывода фамилии Петров.

Нельзя не сказать еще несколько слов о выражении, следующим за case. В отличие от многих других языков программирования, оно может иметь любой скалярный тип данных. Например, в решениях наших задач мы использовали строковые выражения.

Поделиться с друзьями