ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Конструкции языка PHP. Инструкция if-else. Оператор switch. Цикл с постусловием do-while. Инструкции break и continue

Конструкции языка

Ну а теперь разберемся с языковыми конструкциями. Некоторые из них нами уже применялись, например, инструкция if. В этом разделе приводится полное описание всех языковых конструкций PHP. Их не так много, и это достоинство PHP. Как показывает практика, чем более лаконичен синтаксис языка, тем проще его использовать в повседневной практике. PHP — отличный пример этому.

О терминологии

Иногда мы будем использовать слово "конструкция", а иногда — "инструкция". В данном случае эти два термина совершенно эквивалентны. Наоборот, термины "оператор" и "операция" несут разную смысловую нагрузку: любая операция есть оператор, но не наоборот. Например, echo — оператор, но не операция, а ++ — операция.

Инструкция if-else

Начнем с самой простой инструкции — условного оператора. Его формат таков:

if(логическое_выражение)
инструкция_1;
else
инструкция_2;

Действие его следующее: если логическое_выражение истинно, то выполняется инструкция_1, а иначе — инструкция_2. Как и в любом другом языке, конструкция else может опускаться, в этом случае при получении должного значения просто ничего не делается.

Пример:

<?php
if($a>=1&&$b<=10) echo "Все OK";
else echo "Неверное значение в переменной!";
?>

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

Например:

<?php
if($a>$b) { print "a больше b"; $c=$b; }
elseif($a==$b) { print "a равно b"; $c=$a; }
else { print "a меньше b"; $c=$a; }
?>

Это не опечатка: elseif слитно, вместо else if. Так тоже можно писать, хотя это и не удобочитаемо.

Конструкция if-else имеет еще один альтернативный синтаксис:

if(логическое_выражение):
команды;
elseif(другое_логическое_выражение):
другие_команды;
else:
иначе_команды;
endif

Обратите внимание на расположение двоеточия (:)! Если его пропустить, будет сгенерировано сообщение об ошибке. И еще: как обычно, блоки elseif и else можно опускать.

Использование альтернативного синтаксиса

В предыдущих разделах нами уже неоднократно рассматривался пример вставки HTML-кода в тело сценария. Для этого достаточно было просто закрыть скобку ?>, написать этот код, а затем снова открыть ее при помощи <?, и продолжать программу. Чаще всего, однако, нужно бывает делать не вставки HTML внутрь программы, а вставки кода внутрь HTML. Это гораздо проще для дизайнера, который, возможно, в будущем захочет переоформить ваш сценарий, но не сможет разобраться, что ему изменять, а что не трогать. Поэтому целесообразно бывает отделять HTML-код от программы, например, поместить его в отдельный файл, который затем подключается к программе при помощи инструкции include (см. ниже). Сейчас мы не будем подробно останавливаться на этом вопросе, но потом обязательно к нему вернемся. Вот, например, как будет выглядеть наш старый знакомый сценарий, который приветствует пользователя по имени, с использованием альтернативного синтаксиса ifelse:

<?if(@$go):?>
Привет, <?=$name?>!
<?else:?>
<form action=<?=$REQUEST_URI?> method=post>
Ваше имя: <input type=text name=name><br>
<input type=submit name=go value="Отослать!">
<?endif?>

Оператор switch

Оператор switch (переключатель) удобен, когда требуется значение переменной или выражение сравнить с определенными величинами и выполнить тот или иной фрагмент кода в зависимости от результатов сравнения.

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

switch (выражение){

case вариант 1:

код

[break]

case вариант 2:

код

[break]

...

[default:

код]

}

Пример:

<?php
$x=2;
switch($x){
case 1:
echo"x равно 1";
case 2:
echo"x равно 2";
case 3:
echo"x равно 3";
}
?>

В приведенном примере сработают 2-й и 3-й варианты. Если мы хотим, чтобы сработал только один какой-нибудь вариант(только тот, который соответствует значению выражения), то нужно использовать оператор break.

Пример:

<?php
$x=2;
switch($x){
case 1:
echo"x равно 1";
break;
case 2:
echo"x равно 2";
break;
case 3:
echo"x равно 3";
break;
}
?>

В этом примере сработал 2-й вариант.

Цикл с предусловием while

Предназначение — while цикличное выполнение команд в теле цикла, включающее предварительную проверку, нужно ли это делать (истинно ли логическое выражение в заголовке). Если не нужно (выражение ложно), то конструкция заканчивает свою работу, иначе выполняет очередную итерацию и начинает все сначала. Выглядит цикл так:

while(логическое_выражение)
инструкция;

где, как обычно, логическое_выражение — логическое выражение, а инструкция — простая или составная инструкция тела цикла. (Очевидно, что внутри последнего должны производиться какие-то манипуляции, которые будут иногда изменять значение нашего выражения, иначе оператор зациклится. Это может быть, например, простое увеличение некоего счетчика, участвующего в выражении, на единицу.) Если выражение с самого начала ложно, то цикл не выполнится ни разу.

Пример:

<?php
$i=1; $p=1;
while($i<32) {
echo $p," ";
$p=$p*2; // можно было бы написать $p*=2
$i=$i+1; // можно было бы написать $i+=1 или даже $i++
}
?>

Данный пример выводит все степени двойки до 31-й включительно. Как и инструкция if, цикл while имеет альтернативный синтаксис, что упрощает его применение вперемешку с HTML-кодом:

while(логическое_выражение):
команды;
endwhile;

Цикл с постусловием do-while

В отличие от цикла while, этот цикл проверяет значение выражения не до, а после каждого прохода. Таким образом, тело цикла выполняется хотя бы один раз. Выглядит оператор так:

do {
команды;
} while(логическое_выражение);

После очередной итерации проверяется, истинно ли логическое_выражение, и, если это так, управление передается вновь на начало цикла, в противном случае цикл обрывается.

Альтернативного синтаксиса для do-while разработчики PHP не предусмотрели (видимо, из-за того, что, в отличие от прикладного программирования, этот цикл довольно редко используется при программировании сценариев).

Универсальный цикл for

Этот цикл не зря называют универсальным — ведь с его помощью можно (и нужно) создавать конструкции, которые будут выполнять действия совсем не такие тривиальные, как простая переборка значения счетчика. Формат конструкции такой:

for(инициализирующие_команды; условие_цикла; команды_после_прохода)
тело_цикла;

Работает он следующим образом. Как только управление доходит до цикла, первым делом выполняются операторы, включенные в инициализирующие_команды (слева направо). Эти команды перечисляются там через запятую, например:

for($i=0,$j=10,$k="Test!; ...)

Затем начинается итерация. Первым делом проверяется, выполняется ли условие_цикла (как в конструкции while). Если да, то все в порядке, и цикл продолжается. Иначе осуществляется выход из конструкции.

Например:

// прибавляем по одной точке
for($i=0,$j=0,$k="Test"; $i<10; .....) $k.=".";

Предположим, что тело цикла проработало одну итерацию. После этого вступают в действие команды_после_прохода (их формат тот же, что и у инициализирующих операторов).

Например:

for($i=0,$j=0,$k="Points"; $i<100; $j++,$i+=$j) $k=$k.".";

Хочется добавить, что приведенный пример (да и вообще любой цикл for) можно реализовать и через while, только это будет выглядеть не так изящно и лаконично.

Например:

$i=0; $j=0; $k="Points";
while($i<100) {
$k.=".";
$j++; $i+=$j;
}

Как обычно, имеется и альтернативный синтаксис конструкции:

for(инициализирующие_команды; условие_цикла; команды_после_прохода):
операторы;
endfor
;

Инструкции break и continue

Продолжим разговор про циклические конструкции. Очень часто для того, чтобы упростить логику какого-нибудь сложного цикла, удобно иметь возможность его прервать в ходе очередной итерации (к примеру, при выполнении какого-нибудь особенного условия). Для этого и существует инструкция break, которая осуществляет немедленный выход из цикла. Она может задаваться с одним необязательным параметром — числом, которое указывает, из какого вложенного цикла должен быть произведен выход. По умолчанию используется 1, т. е. выход из текущего цикла, но иногда применяются и другие значения:

<?php
for($i=0; $i<10; $i++) {
for($j=0; $j<10; $j++) {
if($A[$i]==$A[$j]) break(2);
}
}
if($i<10) echo "Найдены совпадающие элементы в матрице \$A!";
?>

В этом примере инструкция break осуществляет выход не только из второго, но и из первого цикла, поскольку указана с параметром 2.

Инструкцию break удобно использовать для циклов поисков: как только очередная итерация цикла удовлетворяет поисковому условию, поиск обрывается.

Например, вот цикл, который ищет в массиве $A первый нулевой элемент:

<?php
$A="Авто";
for($i=0; $i<count($A); $i++)
if($A[$i]==0) break;
if($i<count($A)) echo "Нулевой элемент найден: i=$i";
?>

Стандартная функция count(), которую мы еще не рассматривали, просто возвращает число элементов в массиве $A. Инструкция continue так же, как и break, работает только "в паре" с циклическими конструкциями. Она немедленно завершает текущую итерацию цикла и переходит к новой (конечно, если выполняется условие цикла для цикла с предусловием). Точно так же, как и для break, для continue можно указать уровень вложенности цикла, который будет продолжен по возврату управления.

В основном continue позволяет вам сэкономить количество фигурных скобок в коде и увеличить его удобочитаемость. Это чаще всего бывает нужно в циклах-фильтрах, когда требуется перебрать некоторое количество объектов и выбрать из них только те, которые удовлетворяют определенным условиям.

Например, вот цикл, который обнуляет те элементы массива $A, которые удовлетворяют нескольким условиям:

for($i=0; $i<count($A); $i++) {
if(!условие1($A[$i])) continue;
. . .
if(!условиеN($A[$i])) continue;
$A[$i]=0;
}