PHP: Условный оператор if else

В этой главе:

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

  • Оператор if else

  • Конструкция elseif/else if

  • Тернарный оператор - ? :

Условный оператор позволяет пропустить или выполнить некоторый блок кода в зависимости от результата вычисления указанного выражения - условия. Можно сказать, что условный оператор является точкой принятия решения в программе, иногда его также называют оператор ветвления. Если представить, что программа - это дорога, а интерпретатор PHP - путешественник, идущий по ней, то условные операторы можно представить как перекрестки, где программный код разветвляется на две или более дорог, и на таких перекрестках интерпретатор должен выбирать, по какой дороге двигаться дальше.

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

Оператор if является наиболее простым из операторов ветвлений.

Синтаксис оператора if:

синтаксис оператора if в php

Оператор if сначала вычисляет условное выражение указанное в круглых скобках, результатом этого выражения является булево значение. Если полученный результат является истинным (true), то инструкция выполняется. Если выражение возвращает ложное значение (false), то инструкция не выполняется. В качестве условия может применяться выражение любой сложности. Информацию о том, какие значения преобразуются в значение FALSE, можно посмотреть в главе про 'Логический тип данных'.

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

Следующий код демонстрирует применение оператора if:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
 
$a1 = 5;
 
// Если значение переменной меньше 100, выполнить инструкцию, следующую за оператором if
if ($a1 < 100)
  echo "Число $a1 меньше, чем 100";
   
// переменная $username никак не инициализирована: по умолчанию значение null
// с помощью оператора (Логическое НЕ) инвертируем значение в TRUE
if (!$username) {
  $username = "User";
  // и выводим имя пользователя на экран
  echo $username;
}
 
?>

Операторы if могут быть вложенными в другие операторы if:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
   
  $a = 0;
  $b = 50;
  $i = 10;
  $j = 15;
   
  // Если выражение "i == 10" возвращает true
  if($i == 10)
    // то выполняется проверка условного выражения вложенного оператора if
    if ($j < 20) $a = $b;
  
?>

Обратите внимание на последний пример: инструкцию не обязательно надо записывать именно под оператором if, если инструкция не большая по размеру, то ее можно записать и в одну строку.

Оператор if else

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

Синтаксис оператора if else:

синтаксис оператора if-else в php

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

Немного изменив наш предыдущий пример, мы можем увидеть, как работает оператор if else, если условие возвращает значение false:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
  $username = 'Holly';
 
  if ($username == 'Admin') {
    echo 'Добро пожаловать на страницу администратора.';
  }
  else {
    echo 'Добро пожаловать в гостевую страницу';
  }
 
?>

Оператор if else может быть вложенным. Такие вложенные условные операторы встречаются на практике достаточно часто. Оператор if является вложенным, если он расположен внутри другого блока if или else. Если в коде используется несколько операторов if подряд, то else всегда относится к ближайшему if:

1
2
3
4
5
6
7
8
9
10
<?php
 
  if($i) {                // внутренний блок if($i)
    if($a) инструкция;
    if($b) инструкция;
    else  инструкция; // этот else относится к if($b) - так как он ближе
  }
  else инструкция; // этот else относится к if($i)
 
?>

Последний else не относится к if($a), так как он находится не во внутреннем блоке, поэтому ближайший к нему получается if($i). Оператор else расположенный внутри блока относится к if($b), потому что этот if - является ближайшим к нему.

Конструкция elseif/else if

Оператор if/else вычисляет значение условного выражения и выполняет тот или иной фрагмент программного кода. Но что, если требуется выполнить один из многих фрагментов? Если вам нужно проверить несколько условий подряд, то для этого подойдет конструкция elseif или else if (это одна и та же конструкция, просто по разному записана). Формально она не является самостоятельной конструкцией PHP; это лишь распространенный стиль программирования, заключающийся в применении повторяющихся операторов if/else. Она позволяет проверять дополнительные условия, пока не будет найдено истинное или достигнут блок else. Конструкция elseif/else if должна располагаться после оператора if и перед оператором else, если такой имеется.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
 
  $username = 'Арни';
 
  if ($username == 'Админ') {
    echo 'Добро пожаловать на страницу администратора.';
  }
  elseif ($username == 'Гость') {
    echo 'Доступ запрещен!';
  }
  else if ($username == 'Арни') {
    echo "Добро пожаловать $username!";
  }
  else {
    echo ('Добро пожаловать в гостевую страницу');
  }
 
?>

Здесь проверяется три условия, и, в зависимости от значения переменной $username, выполняются разные действия.

На самом деле в этом фрагменте нет ничего особенного. Это просто последовательность операторов if, где каждый оператор if является частью конструкции else предыдущего if. Для тех кто впервые столкнулся с такой формой записи и ему не очень понятно, как это работает, мы перепишем этот же пример, только в эквивалентной синтаксической форме, полностью показывающей вложенность конструкций:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
 
  $username = 'Арни';
 
  if ($username == 'Админ') {
    echo 'Добро пожаловать на страницу администратора.';
  }
  else {
    if ($username == 'Гость') {
      echo 'Доступ запрещен!';
    }
    else {
      if ($username == 'Арни') {
        echo "Добро пожаловать $username!";
      }
      else {
        echo ('Добро пожаловать в гостевую страницу');
      }
    }
  }
 
?>

Тернарный оператор - ? :

В этом разделе пойдет разговор об операторе, выполняющем несколько нетипичные действия. Существует распространенная в программировании ситуация, когда в случае выполнения некоторого условия переменной необходимо присвоить одно значение и в случае невыполнения этого условия другое значение. В следующем примере переменной $min присваивается наименьшее из значений $foo и $bar c помощью конструкции if else:

1
2
3
4
5
6
7
8
<?php
 
  if ($foo < $bar)
    $min = $foo;
  else
    $min = $bar;
 
?>

На практике подобные действия оказались настолько распространенными, что был разработан специальный условный оператор, выполняющий данные действия - сокращенный способ присваивания значения переменной на основе выполнения того или иного условия. Этот оператор использует три операнда (по этой причине его часто называют тернарным) и записывается с помощью двух знаков '? :'. Он является единственным оператором в PHP, который использует более двух операндов. С помощью тернарного оператора можно записать предыдущий пример следующим образом:

1
2
3
4
5
<?php
 
  $min = ($foo < $bar) ? $foo : $bar;
 
?>

Сначала проверяется результат работы условного выражения, если условие вернет значение true, то переменной $min присвоится значение переменной $foo, если false, значение переменной $bar.

Синтаксис тернарного оператора:

синтаксис условного оператора

Первым делом интерпретатор PHP вычисляет значение условия, если оно возвращает true, переменной присваивается значение выражения, находящегося по левую сторону от двоеточия (в данном случае выражение1). Если условие возвращает false, переменной присваивается значение выражения, находящегося справа от двоеточия (в данном случае выражение2). Скобки вокруг условного выражения не обязательны, но их довольно часто употребляют для более легкого визуального восприятия тернарного оператора. Тернарные выражения вычисляются слева направо.

Тернарные операторы могут быть вложенными:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
 
  $code = 0;
 
  // следующий код на первый взгляд должен выводить 'Успешно'
  // однако, он выведет 'Предупреждение'
  // происходит это потому что тернарное выражение вычисляется слева направо
 
  $msg = ($code == 0) ? 'Успешно' : ($code == 1) ? 'Предупреждение' : 'Ошибка';
 
  // разберем почему так происходит
  // ($code == 0 ? 'Успешно' : $code == 1 ) ? 'Предупреждение' : 'Ошибка';
 
 
  // первое выражение (то что выделено скобками) возвращает строку 'Успешно',
  // далее эта строка преобразуется в булево значение - true и вычисляется второе выражение
  // т.е. вычисляется уже (true) ? 'Предупреждение' : 'Ошибка';
  // таким образом возвращается значние 'Предупреждение' второго (вложенного) выражения
 
  echo $msg;
   
  // чтобы предыдущий код работал корректно, нужно пользоваться скобками
  // перепишем пример так, чтобы работал как задумано
  $msg = ($code == 0) ? 'Успешно' : (($code == 1) ? 'Предупреждение' : 'Ошибка');
   
  echo "<br>$msg";
 
?>

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

Напоследок стоит упомянуть об одной особенности: у тернарного оператора есть возможность не писать его среднюю часть.

1

2

3

4

5

6

7

<?php
 
  $a1 = 5;
 
  echo (($a1) ?: 10);
 
?>

Выражение ($a1) ?: 10 возвращает значение переменной $a1, если $a1 имеет значение TRUE, и 10 в противном случае.