Ну а теперь разберемся с языковыми конструкциями. Некоторые из них нами уже применялись, например, инструкция 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;
}
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться