200 likes | 355 Views
Управляющие конструкции в РНР. Управляющие конструкции.
E N D
Управляющие конструкции • Управляющие конструкции предоставляют в распоряжение программиста средства для построения сложных программ, способных проверять условия и реагировать на изменения значений входных данных во время работы, т.е. эти структуры управляют выполнением программы. • Управляющие конструкции обычно проверяют условия на истинность или ложность, и в зависимости от результата проверки выполняется то или иное действие. • Рассмотрим выражение $а == $b. Это выражение истинно, если $а равно $b, и ложно в противном случае. Результат истинного выражения считается равным 1, а результат ложного выражения равен 0. • Рассмотрим следующий фрагмент: $а = 5; $b = 5; print $а == $b; // В результате выводится значение 1. Если изменить $а или $b и присвоить переменной значение, отличное от 5, выводится 0.
Команда if • Команда if представляет собой разновидность команды выбора, которая вычисляет значение выражения и в зависимости от того, будет ли полученный результат истинным или ложным, выполняет (или не выполняет) блок программного кода. • Существует две общих формы команды if: if (выражение) { if (выражение) { блок блок } } else { блок } • Проверка условий дает либо истинный, либо ложный результат. Выполнение блоков зависит от результата проверки, причем блок может состоять как из одной, так и из нескольких команд. • В следующем примере после проверки условия выбирается и выводится одно из двух утверждений: if ($cooking_weight < 200) { print "This is enough pasta (< 200g) for 1-2 people"; } else { print "That's a lot of pasta"; } • Если в результате проверки условия выполняется всего одна команда, фигурные скобки не обязательны. if ($cooking_weight < 100) print "Are you sure this is enough?";
Команда elseif • Команда elseif добавляет в управляющую конструкцию if дополнительный уровень проверки и увеличивает количество условий, на основании которых принимается решение: if (выражение) { блок } elseif (выражение) { блок } • В РНР существует альтернативное представление команды elseif–в виде двух отдельных слов elseи if. Оба варианта приводят к одинаковым результатам, а альтернативное представление поддерживается исключительно для удобства. Команда elselfособенно полезна в тех случаях, когда происходит последовательное уточнение проверяемых условий. • Важно: условие elselfвычисляется лишь в том случае, если все предшествующие условия ifи elseifоказались ложными. if ($cooking_weight < 200) { print "This is enough pasta (< 200g) for 1-2 people"; } elseif ($cooking_weight < 500) { print "That's a lot of pasta"; } else { print "Ok! Very well"; }
Вложенные команды if • Вложение команд if обеспечивает максимальный контроль над проверкой условий. • Например, вес продукта должен проверяться лишь в том случае, если речь идет о пасте (макаронных изделиях): // Проверить значение $pasta if ($food == "pasta") { // Проверить значение $cooking_weight if ($cooking_weight < 200) { print "This is enough pasta (< 200g) for 1-2 people"; } elseif ($cooking_weight < 500) { print "That's a lot of pasta"; } else { print "Ok! Very well"; } } • Как видно из приведенного кода, вложенные команды if позволяют лучше управлять логикой работы программы.
Вычисление нескольких условий • При выборе логики работы программы в управляющей структуре можно проверять комбинацию сразу нескольких условий: if ($cooking_weight < 0) { print "Invalid cooking weight!"; } if ( ($cooking_weight > 0) && ($cooking_weight < 200) ) { print "This is enough pasta (< 200g) for 1-2 people"; } elseif ( ($cooking_weight > 200) && ($cooking_weight < 500) ) { print "That's a lot of pasta"; } else { print "Ok! Very well"; } • Проверка сложных условий позволяет устанавливать интервальные ограничения, обеспечивающие более четкий контроль над логикой выполнения программы и уменьшающие количество лишних управляющих конструкций, в результате чего программа становится более понятной.
Альтернативное ограничение блоков • В управляющих структурах используются специальные ограничители, определяющие границы блоков – фигурные скобки. • Для удобства программистов в РНР поддерживается альтернативный формат ограничения блоков с использованием двоеточия: if (выражение): блок else: блок endif; • Следовательно, две приведенных ниже команды if полностью эквивалентны: if ($а== $b) { print "Equivalent values!"; } if ($a ==$b): print "Equivalent values!"; endif;
Конструкция while • Конструкция while предназначена для многократного (циклического) выполнения блока команд. Блок команды while выполняется до тех пор, пока условие цикла остается истинным. • Общая форма цикла while выглядит так: while (выражение) : блок endwhile; • Рассмотрим использование цикла while на примере вычисления факториала (n!), где n = 5: $n = 5; $nсору = $n; $factorial = 1; // Установить начальное значение факториала while ($n > 0) : $factorial = $n * $factorial; $n--; // Уменьшить $n на 1 endwhile; print "The factorial of $ncopy is $factorial."; // Программа выводит следующий результат: The factorial of 5 is 120. • В этом примере $n уменьшается в конце каждой итерации. Условие цикла не должно быть истинным в тот момент, когда переменная $n станет равна 0, поскольку величина $factorial умножится на 0, а этого быть не должно.
Цикл do…while • Цикл do...while работает почти так же, как и цикл while, но условие проверяется не в начале, а в конце каждой итерации. • Цикл do…while всегда выполняется хотя бы один раз, а цикл while может вообще не выполняться, если перед входом в цикл условие окажется ложным. • Общая форма цикла do…while выглядит так : do { блок } while (выражение); • В цикле do…while не поддерживается альтернативный синтаксис (ограничение блоков при помощизавершающего ключевого слова и двоеточия), поэтому блок может заключаться только в фигурные скобки. • Пример вычисления факториала : $n = 5: $ncopy = $n; $factorial = 1; // Установить начальное значение факториала do { $factorial = $n * $factorial; $n--: // Уменьшить Sn на 1 } while (Sn > 0); print "The factorial of Sncopy is $factorial."; // Программа выводит следующий результат: The factorial of 5 is 120.
Цикл for • Цикл for обеспечивает еще одну возможность многократного выполнения блоков. Он отличается от цикла while только тем, что условие изменяется в самой управляющей конструкции, а не где-то внутри блока команд. Как и в случае с циклом while, цикл выполняется до тех пор, пока проверяемое условие остается истинным. • Общая форма конструкции for выглядит так: for (инициализация; условие; приращение) { блок } • Инициализация выполняется всего один раз и определяет начальное значение управляющей переменной цикла. Условие проверяется в начале каждой итерации и определяет, должна ли выполняться текущая итерация или нет. Приращение определяет изменение управляющей переменной при каждой итерации (переменная может как увеличиваться, так и уменьшаться).
Цикл for • Следующий пример демонстрирует простейший случай применения цикла for: for ($i = 10; $1 <- 100; $1 +=10): // Обратная косая черта предотвращает возможную интерполяцию переменной $1 print "\$i = $i <br>"; endfor; // Выполнение этого фрагмента дает следующий результат: $i = 10 $i = 20 $i = 30 $i = 40 $i = 50 $i = 60 $i = 70 $i = 80 $i = 90 $i = 100 • В этом примере управляющая переменная $i инициализируется значением 10. Условие заключается в том, что цикл продолжается до тех пор, пока $i не достигнет или не превысит пороговую величину 100. Наконец, при каждой итерации значение $i увеличивается на 10. В результате команда print выполняется 10 раз, каждый раз выводя текущее значение $i. Обратите внимание: для увеличения $i на 10 используется оператор сложения с присваиванием. Для этого есть веские причины, поскольку циклы for в РНР не поддерживают более традиционной записи $i = $i + 10. • Данный пример можно записать и в другом виде, но с теми же результатами: for ($i = 10; $i <= 100; print "\$i - $i <br>"; $i+=10);
Цикл for • У цикла for существует несколько специфических особенностей. • Например, можно инициализировать несколько переменных одновременно, разделяя команды инициализации запятыми: for ($x=0,$y=0: $x+$y<10; $x++) : $У += 2; // Увеличить $у на 2 print "\$y = $y <BR>"; // Вывести значение $у $sum = $x + $y; print "\sum = $sum<BR>"; // Вывести значение $sum endfor; // Результат: $y = 2 $sum = 2 Sy = 4 $sum = 5 $y = 6 $sum = 8 $y = 8 $sum = 11 • Этот пример выводит текущие значения $y и суммы $х и $у. Как видно из приведенных результатов, выводится значение $sum = 11, хотя эта сумма выходит за границы условия цикла ($х + $у < 10). Это происходит из-за того, что при входе в данную итерацию переменная $у была равна 6, а переменная $х была равна 2. Значения переменных соответствовали условию цикла, поэтому $х и $у были присвоены новые значения, в результате чего была выведена сумма. При очередной проверке условия сумма 11 превысила пороговое значение 10 и цикл завершился.
Цикл for • В управляющих выражениях циклов for могут отсутствовать любые компоненты. Например, можно передать ранее инициализированную переменную прямо в цикл, не присваивая ей определенного начального значения. Возможны и другие ситуации – например, приращение переменной цикла может осуществляться в зависимости от некоторого условия, определяемого в цикле. В этом случае приращение не должно указываться в управляющем выражении. • Пример: $х = 5: for (: : $х +=2): print " $х "; if ($x == 15): break; // Выйти из цикла for endif; endfor; // Результат: 5 7 9 11 13 15 • Хотя циклические конструкции for и while выполняют практически одинаковые функции, считается, что цикл for делает программу более наглядной. Это объясняется тем, что программист при виде команды for немедленно получает всю необходимую информацию о механике и продолжительности цикла. С другой стороны, в командах while приходится тратить лишнее время на поиск обновлений управляющих переменных – в больших программах это может занимать немало времени.
Конструкция foreach • Конструкция foreach представляет собой разновидность for, включенную в язык для упрощения перебора элементов массива. • Существуют две разновидности команды foreach, предназначенные для разных типов массивов: foreach (массив as $элемент) { foreach (массив as $ключ => $элемент) { блок блок } } • Например, при выполнении следующего фрагмента: $menu = аrrау("pasta", "steak", "potatoes", "fish", "fries"); foreach ($menu as $item) { print "$item <BR>"; } // Будет выведен следующий результат: pasta steak potatoes fish fries • В этом примере следует обратить внимание на два обстоятельства. Во-первых, конструкция foreach автоматически возвращается в начало массива (в других циклических конструкциях этого не происходит). Во-вторых, нет необходимости явно увеличивать счетчик или иным способом переходить к следующему элементу массива – это происходит автоматически при каждой итерации foreach.
Конструкция foreach • Пример использования цикла foreach при работе с ассоциативными массивами: $inventory = array { "merlot" => 15, "zinfandel" => 17, "sauvignon" => 32 } foreach ($inventory as $i => $item_count) { print "$item_count bottles of $i remaining<BR>"; } // В этом случае результат выглядит так: 15 bottles of merlot remaining 17 bottles of zinfandel remaining 32 bottles of sauvignon remaining • Как видно из приведенных примеров, конструкция foreach заметно упрощает работу с разными массивами.
Конструкция switch • Принцип работы конструкции switch отчасти напоминает if – результат, полученный при вычислении выражения, проверяется по списку потенциальных совпадений. • Это особенно удобно при проверке нескольких значений, поскольку применение switch делает программу более наглядной и компактной. • Общий формат команды switch: switch (выражение) { case (условие): блок case (условие): блок ... default: блок } • Проверяемое условие указывается в круглых скобках после ключевого слова switch. Результат его вычисления последовательно сравнивается с условиями в секциях case. При обнаружении совпадения выполняется блок соответствующей секции. Если совпадение не будет обнаружено, выполняется блок необязательной секции default.
Конструкция switch • Например, программа отображает раскрывающийся список с несколькими вариантами и каждая строка списка соответствует некоторой команде, выполняемой в отдельной конструкции case: $user_input = "recipes"; // Команда, выбранная пользователем switch ($user_input): case("search"): print "Let's perform a search!"; break; case("dictionary"): print "What word would you like to look up?"; break; case("recipes"): print "Here is a list of recipes..."; break; default: print "Here is the menu..."; break; endswitch; • Переменная, указанная в условии switch($user_input), сравнивается с условиями всех последующих секций case. Если значение, указанное в секции case, совпадает со значением сравниваемой переменной, выполняется блок этой секции. Команда break предотвращает проверку дальнейших секций case и завершает выполнение конструкции switch. Если ни одно из проверенных условий не выполняется, активизируется необязательная секция default. Если секция default отсутствует и ни одно из условий не выполняется, команда switch просто завершается и выполнение программы продолжается со следующей команды. • При отсутствии в секции case команды break выполнение switch продолжается со следующей команды до тех пор, пока не встретится команда break или не будет достигнут конец конструкции switch.
Конструкция switch • Следующий пример демонстрирует последствия отсутствия забытой команды break: $value = 0.4; switch($value): case (0.4): print "value is 0.4<br>"; case (0.6): print "value is 0.6<br>"; break; case (0.3): print "value is 0.3<br>"; break; default: print "You didn't choose a value!"; break; endswitch; // Результат выглядит так: value is 0.4 value is 0.6 • Отсутствие команды breakпривело к тому, что была выполнена не только команда printв той секции, где было найдено совпадение, но и команда printв следующей секции. Затем выполнение команд конструкции switchпрервалось из-за команды switch, следующей за второй командой print.
Команда break • Команда break немедленно прерывает выполнение той конструкции while, for или switch, в которой она находится. • В общем виде синтаксис команды выглядит так: break n • Необязательный параметр n определяет количество уровней управляющих конструкций, завершаемых командой break. Например, если команда break вложена в две команды while и после break стоит цифра 2, происходит немедленный выход из обоих циклов. • По умолчанию значение n равно 1; выход на один уровень может обозначаться как явным указанием 1, так и указанием команды break без параметра. • Важно: команда if не относится к числу управляющих конструкций, прерываемых командой break. • Рассмотрим пример использования команды break в цикле foreach: $arr = array(14, 12, 128, 34, 5); $magic number = 128: foreach ($arr as $val): if (Sval == $magic_number): print "The magic number is in the array!"; break; endif; print "val is Sval <br>"; endforeach; // Если значение $magic_number присутствует в массиве $аrr (как в приведенном примере), поиск прерывается. // Результат выглядит так: val is 14 val is 12 The magic number is in the array!
Команда continue • При выполнении команды continue в цикле пропускаются все оставшиеся команды текущей итерации и немедленно начинается новая итерация. • Синтаксис команды continue в общем виде: continue n • Необязательный параметр n указывает, на сколько уровней внешних циклов распространяется действие continue. • Например, нужно сосчитать простые числа в интервале от 0 до некоторой заданной границы. Предположим, что имеется функция is_prime(), которая проверяет, является число простым или нет: $boundary = 555; for ($i = 0; $i <= $boundary; $i++): if (! is_prime($i)): continue; endif; $prime_counter++; endfor; // Если проверяемое число является простым, блок команды if обходится и переменная $prime_counter увеличивается. В противном случае выполняется команда continue, в результате чего происходит немедленный переход в начало следующей итерации.