Условные операторы

Управляющие структуры — это языковые конструкции, которые позволяют управлять ходом выполнения программы или сценария. Их можно разделить на две категории: на условные структуры (или структуры ветвления) и структуры повторения (или циклы).

Если необходимо, чтобы сценарий разумно реагировал на информацию, введенную пользователем, код должен быть способным принимать решения. Конструкции, которые указывают программе на необходимость принимать решение, называются условными операторами.

Операторы if

Для принятия решений используется оператор if. Ему необходимо задать условие. Если условие имеет значение true, то выполняется следующий за ним блок кода. Условие в операторе if должно быть заключено в круглые скобки ().

Например, если заказ посетителя в компании "Автозапчасти от Вована" не включает ни покрышек, ни масла, ни свечей зажигания, вероятно, это связано со случайным нажатием кнопки Отправить заказ. Вместо сообщения "Заказ обработан" страница могла бы выдать более приличествующее ситуации сообщение.

Если посетитель вообще не заказывает запчастей, вероятно, имеет смысл вывести сообщение вроде "Вы ничего не заказали на предыдущей странице!". Это легко сделать с помощью следующего оператора if:

if ( $totalqty == 0 )

echo 'Вы ничего не заказали на предыдущей странице!<br />';


В этом операторе используется условие $totalqty == 0. Помните, что операция равенства (==) ведет себя иначе, нежели операция присваивания (=).

Условие $totalqty == 0 будет иметь значение true, если значение переменной $totalqty равно нулю. Если значение переменной $totalqty не равно нулю, значение условия будет равно false. Когда значением условия будет true, оператор echo выполнится.

Блоки кода

Часто внутри такого условного оператора, как if, требуется выполнить более одного оператора. В этом случае соответствующая последовательность операторов записывается в виде блока. Чтобы объявить блок, операторы потребуется заключить в фигурные скобки:

if ($totalqty == 0) {

echo '<р style="color:red">';

echo ' Вы ничего не заказали на предыдущей странице! ' ;

echo '</р>';

}

Три строки кода, заключенные в фигурные скобки, теперь представляют собой блок. Когда значением условия является true, выполняются все три строки. Если значением условия будет false, все три строки кода будут проигнорированы.

Операторы else

Часто не только приходится принимать решение, должно или не должно выполняться то или иное действие, но и выбирать это действие из некоторого набора возможных действий.

Оператор else позволяет определить альтернативное действие, которое должно выполняться, если значение условия в операторе if окажется равным false. Скажем, в рассматриваемом примере необходимо предупредить клиента о том, что он ничего не заказал. С другой стороны, если он сделал заказ, вместо предупреждения ему должен выводиться список заказанных товаров.

Если немного изменить код и добавить в него оператор else, можно отображать либо уведомление, либо итоговую информацию.

If ($totalqty == 0) {

echo "Вы ничего не заказали на предыдущей странице!<br />";

} else {

echo $tireqty." покрышек<br />";

echo $oilqty." бутылок масла<br />";

echo $sparkqty" свечей зажигания<br />";

}

Вкладывая операторы if один в другой, можно строить более сложные логические цепочки. Приведенный ниже код не только обеспечивает отображение итоговой информации, когда значение условия $totalqty == 0 равно true, но и отображает каждую из итоговых строк при выполнении ее собственного условия.

if ($totalqty == 0) {

echo "Вы ничего не заказали на предыдущей странице!<br />";

} else {

if ($tireqty>0)

echo $tireqty." покрышек<br />";

if ( $oilqty>0 )

echo $oilqty." бутылок масла<br />";

if ( $sparkqty>0 )

echo $sparkqty." свечей зажигания<br />";

}

Операторы elseif

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

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

■ приобретение менее 10 покрышек — без скидки;

■ приобретение от 10 до 49 покрышек — скидка 5%;

■ приобретение от 50 до 99 покрышек — скидка 10%;

■ приобретение 100 и более покрышек — скидка 15%.

Можно подготовить программный код, вычисляющий скидки, с использованием условий и операторов if и elseif. Для объединения двух условий в одно применяется операция И (&&).

if ($tireqty < 10) {

$discount = 0;

} elseif (($tireqty >= 10) && ($tireqty <= 49)) {

$discount = 5;

} elseif ( ($tireqty >= 50) && ($tireqty <= 99) ) {

$discount = 10;

} elseif ($tireqty > 100) {

$discount = 15;

}

Обратите внимание на то, что можно применять как elseif, так и else if — с пробелом или без оного; оба варианта допустимы.

При использовании каскадных наборов операторов elseif следует помнить, что выполняется только один из блоков или операторов. В рассматриваемом примере это не существенно, ибо все условия являются взаимоисключающими, поскольку в каждый конкретный момент времени только одно из них может принимать значение true. Если условия записаны так, что в один и тот же момент времени значение true принимают сразу несколько условий, то выполняется только тот блок или оператор, который следует за первым истинным условием.

Операторы switch

Оператор switch работает аналогично оператору if, но позволяет условному выражению иметь в качестве результата более двух значений. В операторе if условие принимает значение true или false. В операторе switch условие может принимать любое количество различных значений в тех случаях, когда результат его вычисления принимает простой тип (integer, string или float). Чтобы иметь возможность реагировать на каждое такое значение, вы должны предусмотреть для него соответствующий оператор case, а также (не обязательно) определить действия, выполняемые по умолчанию, когда возникает случай, не предусмотренный конкретным оператором case.

Вован желает знать, какие формы рекламы содействуют успеху его предприятия. Для этого в форму заказа можно добавить вопрос.

Добавьте в форму приведенный ниже HTML-код, после чего она должна принять вид, показанный на рис. 1.6.

<tr>

<td>Kaк вы нашли Boвaнa?</td>

<td>

<select name="find">

<option value = "а">Я постоянный клиент</option>

<option value = "b">B телевизионной рекламе</option>

<option value = "c">B телефонном справочнике</option>

<option value = "d">Устная рекомендация</option>

</select>

</td>

</tr>

Показанный выше HTML-код добавил новую переменную формы, значением которой будет а, b, с или d.

Условные операторы

Эту новую переменную можно было бы обработать с помощью последовательности операторов if и elseif:

if ($find == "a") {

echo "<р>Постоянный клиент.</p>";

} elseif ($find == "b") {

echo "<р>Клиент, обратившийся после телевизионной рекламы.</р>";

} elseif ($find == "с") {

echo "<р>Клиент, обратившийся по телефонному справочнику.</р>";

} elseif ($find == "d") {

echo "<р>Клиент, обратившийся по чьей-то устной рекомендации.</р>";

} else {

echo "<р>Непонятно, как этот клиент нашел нас.</р>";

}

В качестве альтернативы можно воспользоваться оператором switch:

switch ($find) {

case "a" :

echo "<р>Постоянный клиент.</p>";

break;

case "b" :

echo "<р>Клиент, обратившийся после телевизионной рекламы.</р>";

break;

case "с" :

echo "<р>Клиент, обратившийся по телефонному справочнику.</р>";

break;

case "d" :

echo "<р>Клиент, обратившийся по чьей-то устной рекомендации.</р>";

break;

default :

echo "<р>Непонятно, как этот клиент нашел нас.</р>";

break;

}

(В последних двух примерах предполагается, что вы уже получили переменную $find из массива $_POST.)

Оператор switch ведет себя несколько иначе, нежели оператор if или elseif. Оператор if выбирает на выполнение только один оператор, если специально не используются фигурные скобки для создания блока операторов. Оператор switch действует по-другому принципу. Когда оператор case в рамках оператора switch активизируется, РНР выполняет следующие за ним операторы, один за другим, до тех пор, пока не столкнется с оператором break. Без него оператор switch выполнял бы весь код, следующий за оператором case, условие которого равно true. По достижении оператора break выполняется строка кода, следующая за оператором switch.

Сравнение разных условных операторов

Если вы не работали с операторами, описанными в предыдущих разделах, у вас вполне может возникнуть вопрос: "Какой же из них самый лучший?"

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