Занятие 5. Конструкции языка Инструкция if-else Начнем с самой простой инструкции - условного оператора. Его формат таков: if (логическое_выражение) инструкция_1; else инструкция_2; Действие его следующее: если логическое__выражение истинно, то выполняется инструкция_1, а иначе - инструкция_2. Как и в любом другом языке, конструкция else может опускаться, в этом случае при получении должного значения просто ничего не делается. Пример: if ($a>=1&&$b<=10) echo “Все ОК”; else echo “Неверное значение в переменной”; Если инструкция_1 или инструкция_2 должны состоять из нескольких команд, то они, как всегда, заключаются в фигурные скобки. Например: if ($a>$b) { echo "а больше b"; c=$b; } elseif ($a==$b) { echo "а равно b"; $c=$a; } else { echo "а меньше b"; $с=$а; } Конструкция if-else имеет еще один альтернативный синтаксис: if (логическое выражение): команды; elseif (другое__логическое_выражение): другие команды; else: иначе_команды; endif Цикл с предусловием while Эта конструкция также унаследована непосредственно от Си. Ее предназначение — цикличное выполнение команд в теле цикла, включающее предварительную проверку, нужно ли это делать (истинно ли логическое выражение в заголовке). Если не нужно (выражение ложно), то конструкция заканчивает свою работу, иначе выполняет очередную итерацию и начинает все сначала. Выглядит цикл так: while (логическое_выражение) инструкция; где, как обычно, логическое_выражение - логическое выражение, а инструкция - простая или составная инструкция тела цикла. (Очевидно, что внутри последнего должны производиться какие-то манипуляции, которые будут иногда изменять значение нашего выражения, иначе оператор зациклится. Это может быть, например, простое увеличение некоего счетчика, участвующего в выражении, на единицу.) Если выражение с самого начала ложно, то цикл не выполнится ни разу. Например: $i=1; $р=1; while ($i<32) { echo $p," "; $р=$р*2; // можно было бы написать $р*=2 $i=$i+1; // можно было бы написать $i+=1 или даже $i++ } Данный пример выводит все степени двойки до 31-й включительно. Как и инструкция if, цикл while имеет альтернативный синтаксис, что упрощает его применение вперемешку с HTML-кодом: while (логическое_выражение): команды; endwhile; Цикл с постусловием do-while В отличие от цикла while, этот цикл проверяет значение выражения не до, а после каждого прохода. Таким образом, тело цикла выполняется хотя бы один раз. Выглядит оператор так: do { команды; } while (логическое_выражение); После очередной итерации проверяется, истинно ли логическое_выражение и, если это так, управление передается вновь на начало цикла, в противном случае цикл обрывается. Альтернативного синтаксиса для do-while разработчики РНР не предусмотрели (видимо, из-за того, что, в отличие от прикладного программирования, этот цикл довольно редко используется при программировании сценариев). Универсальный цикл 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, т. е. выход из текущего цикла, но иногда применяются и другие значения: for ($i=0; $i<10; $!++} { for ($j=0; $j<10; $j++) { if ($A[$i]=$A[$j]) break(2); } } if ($i<10; echo 'Найдены совпадающие элементы в матрице \$А!'; В этом примере инструкция break осуществляет выход не только из второго, но и из первого цикла, поскольку указана с параметром 2. Инструкцию break удобно использовать для циклов поисков: как только очередная итерация цикла удовлетворяет поисковому условию, поиск обрывается. Например, вот цикл, который ищет в массиве $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; Si<count($A); $i++) { if(!условие1($A[$i])) continue; … if (!условиеN($A[$i])) continue; $A[$i]=0; }