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

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 == )
{
    if( 
$y == ) 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 не могут выступать только массивы и объекты.