Несмотря на то что все описанные до сих пор операции с переменными замечательны, они оставляют желать лучшего в терминах реального языка программирования. Поэтому вам нужны управляющие структуры. Управляющие структуры — это средства, которые позволяют управлять поведением программ. Управляющие структуры позволяют указывать условия, при которых должен выполняться тот или иной фрагмент кода, обычно базирующиеся на текущем состоянии сценария. Часто они даже могут транслироваться из обычных утверждений на естественном языке. Чтобы проиллюстрировать это, рассмотрим то, что в программировании называется условным оператором: "Если Джон закончит 15 страниц этой книги, то он может лечь спать". Как эту логику трансформировать в компьютерную программу, которая сообщит, когда мне можно отправляться спать? Чтобы сравнить количество написанных мною страниц с тем, сколько я должен написать, мне придется использовать оператор if. Оператор i f не похож на все описанное до сих пор и имеет следующую общую форму:
if(условие) { /* Код, выполняемый, если условие истинно */ } [ else { 34 Использование РНР для разработки Web-приложений Часть I /* Код, выполняемый, если условие ложно */ } ] Условие — это любое выражение, возвращающее булевское значение.
НА ЗАМЕТКУ Когда в этой книге описывается общий синтаксис функции, квадратные скобки вокруг какойлибо его части (такие, как вокруг части else приведенной выше конструкции) служат для обозначения необязательной части, которая может быть пропущена при практическом использовании. Более того, далее в этой книге встречаются случаи, когда такие скобки находятся внутри других скобок, что означает, что они выделяют необязательную часть порции выражения, которая в свою очередь является необязательной.
Однострочная версия оператора if также встречается в следующем виде: if (условие) /* Код, выполняемый, если условие истинно */ Чтобы наглядно проиллюстрировать применение оператора if, рассмотрим пример, приведенный в листинге 1.11.
Листинг 1.11. Базовое использование оператора i f if (true) echo "Эта строка отображается всегда! " if (false) { echo "Эта строка не отображается никогда. " } else { echo "Эта строка тоже отображается всегда! "
Приведенный код генерирует следующий вывод: Эта строка отображается всегда! Эта строка тоже отображается всегда! Оператор if в РНР — наиболее фундаментальная управляющая структура, предназначенная для выполнения того, что называется блоком кода, в том и только в том случае, когда условное выражение возвращает булевское значение "истина". (Ниже будет объяснено, что означает "булевское".) Как узнать, что выражение возвращает "истину"? РНР предлагает множество методов, описанных в табл. 1.2, каждый из которых возвращает либо булевское значение true ("истина"), либо false ("ложь").
НА ЗАМЕТКУ Несмотря на то что в общем случае условная часть оператора i f должна быть равна предопределенным значениям true или false, целые значения больше нуля также трактуются как true, в то время как 0 трактуется false.
Тем не менее, настоятельно рекомендуется использовать условные выражения, возвращающие булевские значения.
таблица 1.2. Операции сравнения Пример операции Действие $foo == $bar true, если $foo равно $bar. $foo === $bar true, если $f oo равно $bar и обе переменных относятся к одному типу. $foo != $bar true, если $foo не равно $bar. $foo ! == $bar true, если $foo не равно $bar и обе переменных не относятся к одно- му типу. $foo < $bar true, если $foo меньше $bar. $foo > $bar true, если $foo больше $bar. $foo <= $bar true, если $foo меньше или равно $bar. $foo >= $bar true, если $foo больше или равно $bar. Итак, как же работают эти операторы сравнения? В основном так же, как матема- тические операции, описанные ранее: $answer = (14 > 15); /* $answer = false */ $answer m (14 <= 15); /* $answer = true */ ?>
Можно надеяться, теперь вы имеете представление о том, как написать короткий пример сценария, который сможет вычислить время, когда я могу отправляться спать В листинге 1.12 показаны результаты.
Листинг 1.12. Использование операций сравнения в операторе i f <?php $pgs_complete = 14; if ($pgs_complete < 15) { echo "Очень жаль! Ты еще не можешь спать, Джон!<ВК>"; } else ( echo "Поздравляю! Уже можешь пойти спать!!<BR>";
Все прекрасно, пока нужно проверить только одно условие для выполнения блока кода, но что делать в ситуациях, когда встречается два или более условий? Одним решением может быть — встроить один или более операторов i f внутрь друг друга, как показано в листинге 1.13.
Листинг 1.13. вложенные условия <?php i f ($value > 0) ( i f ($value <= 10) { echo 'Значение переменной $value находится между 1 и 1 0 . ' ; } e l s e { i f ($value <= 20) { 36 Использование РНР для разработки Web-приложений "часты echo 'Значение переменной $value находится между 1 и 20.'; } else { echo 'Значение переменной $value больше 20.';
СОВЕТ В блок кода может быть включено все что угодно, в том числе и другой блок. Нет ограничений на "глубину" вложенности, хотя хорошей практикой является ограничение степени вложенности блоков для сохранения читаемости кода.
Хотя это и работает, существует лучший способ. Когда требуется проверка множества условий, в РНР существуют логические операции для комбинации множества условий в единое булевское значение. Например, рассмотрим следующее условное предложение: "Если Джон закончит 15 страниц, или ему больше нечего будет писать, то он может лечь спать". Это конкретное предложение утверждает, что я могу лечь спать тогда, когда закончу 15 страниц или же закончу писать книгу вообще. Для того чтобы справиться с этой ситуацией, нужно использовать оператор if с множеством условий. Вспомните из начального представления оператора if, что условная часть предложения является выражением, возвращающим при вычислении булевское значение. То есть для создания составного оператора if все, что понадобится — это набор булевских операций. Эти операции, называемые также логическими операциями, перечислены в табл. 1.3.
Таблица 1.3. Логические операции РНР Операция Действие $foo and $bar true, если $foo и $bar истинны. $foo or $bar true, если $foo или $bar истинны. $foo xor $bar true, если $f oo или $bar истинно (но не оба сразу). !$foo true, если $f oo ложно. $foo && $bar true, если $foo и $bar истинны. $foo II $bar true, если $foo или $bar истинны.
НА ЗАМЕТКУ Несмотря на то что они выглядят идентичными, операции and и or — не то же самое, что && и ||- Разница заключается в их приоритетах. В РНР операции and и or выполняются до операций && и | |. Из-за этого настоятельно рекомендуется использовать скобки, чтобы явно задать порядок операций в любых сложных выражениях.
<?php $answer = ($а < $b) II ($с > $d); /* хорошо */ $answer = $a < $b || $c > $d; /* плохо */
Вооруженные этими знаниями, давайте посмотрим, как можно представить код из предыдущего листинга с помощью составных условных выражений.
Листинг 1.14. Составные операторы i f <?php $finished = true; $pgs_complete = 14; if (($pgs_complete > 0) I I $finished) { echo "Ты закончил, иди nocnH<BR>"; } else { echo "Ты еще не закончил, никакого CHa!<BR>";
Хотя это уже отлично, существует возможность еще усовершенствовать часть логики else. Ранее был представлен фрагмент кода, который имел встроенный оператор if в части else другого условия, похожего на то, что было показано в листинге 1.13.
НА ЗАМЕТКУ В ситуациях, когда вы используете условия для определения значения переменной, может применяться следующий синтаксис: $variable = (условие) ? /* истина */ : /* ложь */;
$variable будет присвоено значение из первого сегмента, если условие истинно, и из второго — если ложно. В ситуациях подобного рода использованный код может быть в некоторой мере упрощен за счет применения предложения elseif. Это предложение заменяет else в условии if, как показано ниже:
if(условие) ( /* Блок кода, подлежащий выполнению, если условие истинно */ } elseif(условие) { /* Блок кода, подлежащий выполнению, если первое условие ложно, а второе истинно */ } else { /* Блок кода, подлежащий выполнению, если оба условия ложны */ }
Следует отметить, что таким образом можно соединять вместе столько конструкций elseif, сколько понадобится. Этот способ должен использоваться, только когда существует множество сложных условий, которые требуется проверять при выполнении сценария. Для более простых ситуаций рассмотрим совершенно новую управляющую конструкцию — оператор switch. Как и все, кроме наиболее фундаментальных управляющих конструкций, оператор switch — это упрощенный способ выполнения задач, которые можно выполнить с помощью оператора if. Назначение switch — позволить разработчику присваивать блок кода каждому из множества разных возможных случаев, которые может принимать управляющая переменная. Общая форма оператора switch выглядит следующим образом:
switch($variable) { [case <константа>:] /* код, выполняющийся, когда $variable равна 1 */ [break;] [case <константа>:] /* код, выполняющийся, когда $variable равна 2 */ [break;] ...другие случаи [default:] /*код, выполняющийся, если не было совпадения ни с одним из случаев*/
СОВЕТ Константы case не ограничены целыми величинами, как в других языках, подобных С. В РНР может использоваться любые значения констант, включая строки и числа с плавающей точкой.
При использовании оператору switch представляется единственная переменная, значение которой сравнивается с теми, которые указаны в каждом индивидуальном предложении case. Фактически оператор switch похож на серию операторов if, как показано в листинге 1.15.
Листинг 1.15. Использование i f для имитации switch <?php /* Метод с использованием оператора if */ if ($1 == 0) echo 'Первый случай'; if ($1 == 1) echo 'Второй случай'; /* Тот же код с применением оператора switch */ switch($i) { s case 0: echo 'Первый случай'; break; case 1: echo 'Второй случай'; break;
Обратите внимание, что когда вы используете оператор switch, то слово break в конце каждого блока является необязательным. Если оно не указано, РНР продолжит обработку сценария с текущего места, выполняя каждый блок case до тех пор, пока не встретит break либо не достигнет конца оператора switch, как показано в листинге 1.16.
Листинг 1.16. Использование оператора switch <?php switch(Si) { case 1: echo 'Первый случай<ВК>'; case 2: echo 'Второй случай<В1Я> ' ; break; default: echo 'Случай по умолчанию'; }
Если переменная $i имеет значение 1, будут выполнены и первый и второй блоки кода, поскольку break встречается только в конце case 2. Результат выполнения сценария при $i = 1 будет выглядеть,так: