PHP и MySQL
Глава 2. Операторы языка PHP
§ 2.1. Операторы выбора: if...else
К операторам выбора относят: условный оператор (if...else ) и переключатель (switch ). Синтаксис условного оператора:
if( condition ) statement_1 else statement_2
Условие condition может быть любым выражением. Если оно истинно, то выполняется оператор statement_1 .
В противном случае выполняется оператор statement_2 . Допустима сокращенная форма записи условного оператора, в
которой отсутствуют else и оператор statement_2 .
В свою очередь, операторы statement_1 и statement_2 могут быть условными, что позволяет организовывать
цепочки проверок любой глубины вложенности. И в этих цепочках каждый условный оператор может быть как полным, так и сокращенным.
Синтаксис языка предполагает, что при вложенных условных операторах каждое else соответствует ближайшему if .
Рассмотрим пример:
<?php
$x = 1;
$y = 2;
if($x == 1)
if($y == 2)
echo "x=1 and y=2";
else
echo "x!=1";
?>
При х равном 1 и у равном 2 совершенно справедливо печатается фраза
х = 1 and у = 2 . Однако фраза х != 1 может быть напечатана при х равном 1
и при у не равном 2 , так как else соответствует ближайшему if . Внешний
условный оператор, где проверяется $x == 1 , является сокращенным и в качестве statement_1 включает
полный условный оператор, где проверяется условие $у == 2 . Т.е. проверка этого условия выполняется только при
х равном 1. Простым правильным решением этой задачи является применение фигурных скобок, т.е. нам
нужно фигурными скобками ограничить область действия внутреннего условного оператора, сделав его неполным. Тем самым внешний
оператор превращается в полный условный:
<?php
$x = 1;
$y = 1;
if( $x == 1 )
{
if( $y == 2 ) echo "x = 1 and y = 2";
}
else
{
echo "x != 1";
}
?>
Заметим, что проверка дополнительных условий возможна при помощи оператора elseif . Оператор if может
включать сколько угодно блоков elseif , но else в каждом if может быть только один. Как
правило, в конструкциях if...elseif...else оператор else определяет, что нужно делать, если никакие другие
условия не являются true . Однако, вообще говоря, использование оператора elseif довольно сильно ухудшает
читабельность кода, и лучше в этом случае пользоваться переключателем switch .
<?php
if ( $a > $b )
{
echo "a > b";
}
elseif ( $a == $b )
{
echo "a = b";
}
else
{
echo "a < b";
}
?>
РНР предоставляет также возможность альтернативного синтаксиса условного оператора — без фигурных скобок, а с применением
оператора endif . В следующем примере первая таблица помещается на страницу, если только $HDD равно
Maxtor , а вторая — если Seagate . Наличие оператора >endif в этом случае обязательно,
так как фигурная скобка, обозначающая конец блока if , отсутствует:
<?php
if( $hdd == "Maxtor" ):
?>
<table>
<caption> Maxtor </caption>
</table>
<?php
elseif( $hdd == "Seagate" ):
?>
<table>
<caption> Seagate </caption>
</table>
<?php
endif;
?>
Значение переменной $hdd передается формой test.html:
<html>
<head>
<title>TEST</title>
</head>
<body>
<form action = "test.php" method="GET">
HDD: <input type="text" name="hdd" /><br>
<input type="submit" />
</form>
</body>
</html>
РНР также предоставляет возможность заменять блоки if...else условной операцией:
выражение_1 ? выражение_2 : выражение_3
Первым вычисляется значение выражения_1 . Если оно истинно (т.е. не равно нулю), то вычисляется значение
выражения_2, которое и становится результатом. Если при вычислении значения выражения_1 получится
ноль (ложь), то в качестве результата берется выражение_3 . Классическим примером условной операции является
выражение
x < 0 ? –x : x;
Это выражение возвращает абсолютное значение переменой x .
Т.е., к примеру, код
<?php
if($hdd == "Maxtor")
{
$cdrom = "Teac";
}
else
{
$cdrom = "Nec";
}
?>
можно, используя условную операцию, заменить таким:
<?php
$cdrom = ($hdd == "Maxtor") ? "Teac" : "Nec";
?>
§ 2.2. Операторы выбора: переключатель switch
Переключатель switch является наиболее удобным средством для организации мультиветвления. Синтаксис переключателя
таков:
switch(expression) // переключающее выражение
{
case value1: // константное выражение 1
statements; // блок операторов
break;
case value2: // константное выражение 2
statements;
break;
default:
statements;
}
Управляющая структура switch передает управление тому из помеченных case операторов, для которого
значение константного выражения совпадает со значением переключающего выражения. Если значение переключающего выражения не
совпадает ни с одним из константных выражений, то выполняется переход к оператору, помеченному меткой default .
В каждом переключателе может быть не более одной метки default , однако она может отсутствовать вообще. Приведем
пример программы с переключателем. В этой программе выводятся значения цифр от 1 до 3, введенных в форме test.html. Форма
test.html не отличается от той, что мы уже использовали:
<html>
<head>
<title>TEST</title>
</head>
<body>
<form action = "switch.php" method="GET">
number: <input type="text" name="number" /><br>
<input type="submit" />
</form>
</body>
</html>
<?php
switch( $number )
{
case 1:
echo "number = 1"; break;
case 2:
echo "number = 2"; break;
case 3:
echo "number = 3"; break;
default:
echo "This is not number or number is > 3 or < 1";
}
?>
Важно понять, как выполняется оператор switch , чтобы исключить ошибки. Оператор switch выполняется построчно
(фактически — оператор за оператором). В начале никакой код не выполняется. Только когда будет найден оператор case
со значением, совпадающим со значением выражения switch , PHP начнёт выполнять операторы. PHP продолжает выполнение операторов
до конца блока switch или до первого оператора break . Если вы не запишете операторы break в конце
оператора case в списке, PHP будет выполнять операторы следующего case . Например:
<?php
switch( $number )
{
case 1:
echo "number = 1";
case 2:
echo "number = 2";
case 3:
echo "number = 3";
}
?>
Здесь, если $number равно 1, PHP выполнит все операторы echo ! Если $number равно 2, PHP выполнит
последние два оператора echo , и только если $number равно 3, вы получите "ожидаемое" поведение, и
будет выведено только number = 3 . Итак, важно не забывать записывать операторы break (хотя это может и не
понадобиться при некоторых обстоятельствах).
Заметим также, что в PHP в качестве меток case могут использоваться не только литералы, но и сами метки могут быть
переменными. В качестве меток case в PHP не могут выступать только массивы и объекты.
|