Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

PHP5_nachinayushim

.pdf
Скачиваний:
29
Добавлен:
20.03.2015
Размер:
26.79 Mб
Скачать

164 Глава 4

делать именно то, что требуется. Вместо того чтобы просто выполнять все строки программы одна за другой, структуры управляющей логики дают разработчику воз+ можность выбирать для выполнения определенную строку кода и позволяют для при+ нятия решений сравнивать различные переменные и значения.

Условные операторы или операторы ветвления

В простейшей своей форме условный блок кода означает либо ‘‘выполнить одну строку кода’’, либо ‘‘не выполнять код вообще’’ в зависимости от того, выполняется ли заданное условие. Более сложный вариант подразумевает ‘‘выполнить данную строку кода’’ или ‘‘выполнить другую строку кода’’ в зависимости от того, какое усло+ вие выполняется. Это можно расширить до ‘‘выполнить один завершенный блок ко+ да’’ или ‘‘выполнить другой завершенный блок кода’’. Наконец, можно перечислить все возможные итоговые значения для определенного условия. Если результатом ус+ ловия является итоговое значение номер 1, то следует выполнять блок кода 1; если результатом является итоговое значение 2, то будет выполнен блок 2; если результа+ том является итоговое значение 3 ++++++ блок 3, и т.д.

Пример ветвления

Все изложенное представляет собой, скорее, абстрактную дискуссию, поэтому по+ лезно будет рассмотреть реальный пример из повседневной жизни. Посещение магази+ нов непосредственно не связано с программированием, но оно позволяет проиллюст+ рировать методику принятия решения, которая может быть реализована в программе.

Предположим, что требуется составить список продуктов, которые потребуются для приготовления бутерброда с сыром. Необходимо проверить наличие продуктов и сделать бутерброд на завтрак или в случае необходимости отправиться в магазин за недостающими продуктами. Ниже подробно описываются этапы данного процесса.

Заглянуть в холодильник и проверить, есть ли там молоко, сыр и масло.

Если какого+либо из перечисленных продуктов не хватает, то его следует доба+ вить в список и перейти к следующему этапу; если все есть, то перейти к сле+ дующему этапу.

Проверить наличие хлеба.

Если хлеба нет, то его следует вписать в список и перейти к следующему этапу; если хлеб есть, то перейти к следующему этапу.

Если уже есть все продукты, то приготовить бутерброд; если чего+либо не дос+ тает, то перейти к следующему этапу.

Пойти в супермаркет.

Купить недостающие продукты.

Сделать бутерброд с сыром.

Данный пример представляет небольшой фрагмент процесса принятия логиче+ ских решений, который мы используем практически каждый день. Часто мы проверя+ ем определенные условия (есть ли все необходимые продукты), прежде чем предпринять

Логические операторы, циклы и массивы 165

конкретные шаги (например, сделать бутерброд). В зависимости от этих условий (например, не хватает сыра) могут понадобиться дополнительные шаги (например, посещение магазина и покупка недостающих продуктов), позволяющие добиться оп+ ределенных целей (таких как приготовление бутербродов с сыром).

Этот пример представляется типичным примером использования операторов принятия решений в PHP. При написании PHP+программ некоторые фрагменты кода пишутся для обработки специфических ситуаций, и если определенные ситуации не возникают, то нет необходимости выполнять относящийся к ним PHP+код.

По сути, процесс, описанный в примере, можно достаточно легко описать в PHP+ программе. Фактически утверждения в примере достаточно близки к тому, что требу+ ется, поэтому их можно использовать в качестве псевдокода (они хорошо подходят для большинства языков программирования, так как в большинстве языков подобный процесс принятия решений может быть представлен с помощью операторов if).

Например, можно написать на PHP следующий код (предположим, что определе+ ны переменные $fridge и $bread_bin, в которых хранятся строковые значения ++++++

названия продуктов):

if ($fridge == "молоко, сыр и масло") { if ($bread_bin == "хлеб") {

make_sandwich(); } else {

go_to_store(); make_sandwich();

}

} else { go_to_store();

make_sandwich();

}

Иначе говоря, если в холодильнике есть молоко, сыр и масло, то следует прове+ рить наличие хлеба в хлебнице. Если оба эти условия выполняются, то можно остать+ ся дома и сделать бутерброд. Однако если хлеба нет, то прежде чем сделать бутерброд, придется сходить в магазин и купить хлеба.

А если в холодильнике нет молока, сыра и масла, то все равно придется идти в ма+ газин и покупать их независимо от того, есть хлеб или нет (подразумевается, что в данном случае также проверяется наличие хлеба, и если его нет, то он будет куплен одновременно с остальными продуктами в списке, поэтому снова проверять его нали+ чие необязательно).

Оператор if

Оператор if вкратце уже рассматривался в главе 2, поэтому читатель должен представлять себе, как он работает. Абстрактно его действие заключается в том, что:

если (условие истинно) { то выполнить данную строку кода; }

Оператор if выполняет код (между фигурными скобками), только если условие истинно. Если же условие не соблюдается, то данный код будет проигнорирован и не будет выполняться PHP+процессором вообще.

Рассмотрим другой пример:

если (идет дождь) { взять зонт; } выйти на улицу ;

Вторая строка выполняется независимо от истинности условия, но зонт необхо+ димо взять, только если идет дождь.

166 Глава 4

Если требуется выполнить целый блок кода, то необходимо поместить данный код после условия и между фигурными скобками:

если (условие истинно){ выполнить содержимое данных скобок;

}

Чтобы расширить пример с зонтом, можно написать так:

если (погода дождливая){ взять зонт; одеть плащ;

}

выйти на улицу;

Снова оператор ‘‘выйти на улицу’’ выполняется в любом случае, а взять зонт и на+ деть плащ нужно, только если условие ‘‘погода дождливая’’ истинно.

Использование булевых операторов в структурах управляющей логики

Наиболее широко булевы термы и значения используются в структурах управляю+ щей логики, таких как операторы if..then..else и switch..case. Данные струк+ туры работают в зависимости от вычисления выражений, результатом которых явля+ ются булевы значения (истина или ложь). Если результат ‘‘истина’’, то выполняется один набор операторов, если ‘‘ложь’’ ++++++ другой.

Операторы, результатом которых является одно из булевых значений, называются булевыми операторами. Они включают в себя операторы сравнения (такие как ‘‘больше чем’’ и ‘‘меньше чем’’), операторы ‘‘равно’’ и ‘‘не равно’’ и т.д. Некоторые из таких операторов использовались в главе 3 для реализации логики принятия решения в приложении, обрабатывающем заявки на ссуды. В действительности всякий раз, ко+ гда требуется создать условие для принятия какого+либо решения, необходимо при+ менять один из этих операторов. Существует четыре крупных категории таких опера+ торов, рассмотрим примеры использования операторов в каждой из них.

Операторы > и <

Операторы ‘‘больше’’ и ‘‘меньше’’ справедливо считаются фундаментальными в начальной математике и в равной степени важны в программировании. В PHP они могут использоваться для сравнения двух констант, константы с переменной или двух переменных. В зависимости от результата сравнения можно выполнить определен+ ный набор действий. В случае сравнения констант результат очевиден:

if (5 < 6) { echo "Пять меньше чем шесть"; }

Однако все равно стоит углубиться в детали происходящего. Условная часть опе+ ратора if ++++++ выражение, заключенное в круглые скобки. В результате вычисления этого выражения получается одно из двух булевых значений: истина или ложь. Фак+ тически это единственно возможные результаты, поскольку условие либо соблюдает+ ся, либо нет. Поэтому в данном примере результатом данного выражения является истина (true). Оператор if выполняется, только если его условие истинно.

Предыдущий пример нельзя назвать полезным, потому что и без проверки извест+ но, что пять меньше шести. Однако если сравнивать содержимое переменной с ка+ ким+либо числом, например, со счастливым числом, то ответ будет зависеть от зна+ чения переменной:

If ($lucky_number < 6) { echo "Наше счастливое число меньше шести"; }

Логические операторы, циклы и массивы 167

Можно также сравнить две переменные:

If ($lucky_number < $lottery_number) { echo "Наше счастливое число слишком мало"; }

И конечно, результаты условия можно использовать не только для отображения какого+либо сообщения, но и для определения необходимого набора действий:

If ($lucky_number < $lottery_number){

echo "Наше счастливое число слишком мало"; $lucky_number = $lucky_number + 1;

}

Рассмотрим простой пример, в котором PHP+программа ‘‘загадывает’’ число между 1 и 10, а пользователю необходимо угадать это число. Чтобы заставить PHP ‘‘загадывать’’ число, необходимо использовать функцию+генератор случайных чисел, которая на+ зывается rand(). Принцип ее действия описан после примера.

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

1. Запустите HTML+редактор и введите следующий код:

<html>

<head><title></title></head>

<body>

<?php

if (isset($_POST['posted'])) { $number = rand(1,10);

if ($_POST['guess'] > $number) { echo "<h3>Ваше число

слишком большое</h3>"; echo "<br>Загаданное число:

$number, Вы проиграли, попробуйте еще раз <hr>";

} else if ($_POST['guess'] < $number) {

echo "<h3>Ваше число слишком маленькое</h3>"; echo "<br>Загаданное число:

$number, Вы проиграли, попробуйте еще раз <hr>";

} else {

echo "<br> Загаданное число: $number, Вы выиграли!<hr>";

}

}

?>

<form method="POST" action="guessgame.php">

<input type="hidden" name="posted" value="true">

Угадайте число от 1 до 10 <input name="guess" type="text"> <br>

<br>

<input type="submit" value="Отправить"> </form>

</body>

</html>

2.Сохраните данный файл как guessgame.php и откройте его в браузере. Введи+ те число в текстовое поле и нажмите кнопку Отправить. На рис. 4.1 показан

примерный результат.

168 Глава 4

Рис. 4.1.

Как это работает

Данная программа слегка обманывает пользователя, потому что генерирует слу+ чайное число только после того, как пользователь отправил свой ответ. Это не влияет на результат, так как случайное число генерируется полностью независимо от пере+ данного ответа пользователя. Ниже приведен код, генерирующий случайное число:

$number = rand(1,10);

Функция rand() чрезвычайно проста в использовании ++++++ ей просто необходимо передать минимальное и максимальное значение, разделенное запятой, и она сгене+ рирует случайное число между двумя заданными значениями. Результат сохраняется в переменной $number.

Когда страница открывается впервые, форма запрашивает у пользователя число и сохраняет ответ пользователя в текстовом поле, атрибут name которого равен guess.

Угадайте число от 1 до 10 <input name="guess" type="text">

Когда форма отправляется, данные в поле guess передаются обратно сценарию; устанавливается переменная $_POST[posted], после чего можно использовать функцию isset(), чтобы определить, следует ли выполнять оставшуюся часть обра+ ботки (первый оператор if).

Затем используются операторы сравнения, позволяющие определить, что введенное пользователем число больше, меньше или равно случайному числу. Введенное пользо+ вателем число, которое хранится в переменной $_POST[guess], сравнивается с чис+ лом, ‘‘загаданным’’ PHP+программой. Если значение этой переменной больше, чем зна+ чение $number, то выполняется код между двумя последующими фигурными скобками:

if ($_POST['guess'] > $number) { echo "<h3>Ваше число

слишком большое</h3>";

Логические операторы, циклы и массивы 169

echo "<br>Загаданное число:

$number, Вы проиграли, попробуйте еще раз <hr>";

Код после первых фигурных скобок информирует пользователя о том, что введен+ ное число слишком велико, выводит ‘‘загаданное’’ число и приглашает сыграть снова.

Затем используется оператор else if. Чтобы он работал, необходимо закрыть предыдущий блок кода с помощью закрывающей фигурной скобки, написать else if и начать другой блок кода с открывающей фигурной скобки. Данный оператор рабо+ тает как другой оператор if и проверяет, является ли введенное пользователем число слишком маленьким. Если это так, то выполняется код в следующих за данным опера+ тором фигурных скобках:

} else if ($_POST['guess'] < $number) {

echo "<h3>Ваше число слишком маленькое</h3>"; echo "<br>Загаданное число:

$number, Вы проиграли, попробуйте еще раз <hr>";

На этот раз программа сообщает пользователю, что его ответ слишком мал, выво+ дит ‘‘загаданное’’ число и приглашает сыграть снова.

Последний блок кода завершает PHP+сценарий. Если сценарий дошел до этой точ+ ки, то пользовательское число уже проверено и должно быть равно случайному числу, поэтому выполняется блок кода else. Программа сообщает пользователю о том, что он выиграл.

} else {

echo "<br> Загаданное число: $number, Вы выиграли!<hr>";

}

}

?>

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

Операторы == и ===

Внимательные читатели уже заметили, что знак равенства в PHP используется в двух различных вариантах. Один знак равенства является оператором присваивания; двой+ ной знак равенства ++++++ оператор равенства. Это различие очень важно. Рассмотрим код:

$lucky_number = 5; $lucky_number = 7;

Вприведенном выше коде переменной $lucky_number присваивается значение 5,

азатем независимо от предыдущего значения (в данном случае 5) переменной при+ сваивается новое значение (7). Иными словами, вторая строка аннулирует первую.

Вследующем примере оператор равенства не оказывает влияния на значения пе+ ременных:

if ($lucky_number == 7) echo ("Ваше счастливое число: 7");

В других языках программирования, например, в Visual Basic, знак равенства (=) не является строго оператором присваивания и в зависимости от контекста может слу+ жить в качестве оператора сравнения. Программисты, которые привыкли к такому способу сравнения, часто ошибаются в PHP и присваивают переменной значение, имея в виду сравнение переменной с данным значением. Например:

$lucky_number = 5;

If ($lucky_number = 7) {

echo "Ваше число $lucky_number";

170 Глава 4

} else {

echo "Ваше число $lucky_number";

}

В этом примере программа выводит ‘‘Ваше число 7’’ (первый случай), а не ‘‘Ваше число 5’’ (второй случай), так как вместо того чтобы сравнить два значения знак равен+ ства в операторе if, фактически переназначает (присваивает) значение 7 переменной $lucky_number. В PHP необходимо использовать одинарный знак равенства для при+ своения значений и двойной знак равенства для сравнения, в противном случае про+ грамма может выдавать непредвиденные результаты. Об этом необходимо помнить.

Существует еще одна версия оператора равенства, она была введена в PHP 4.01. В данном операторе используется три знака равенства и он выдает true, только если значения равны и типы данных значений/переменных также равны:

if ($lucky_number === $random_number) {

echo "Ваше счастливое число $random_number";

}

Тройной знак равенства очень полезен в ситуациях, когда необходимо проверить не только равенство значений, но и точное соответствие типов данных этих значе+ ний. Например, требуется узнать, равно ли данное значение именно true или false, а не одному из не булевых значений, которые можно преобразовать в true или false (см. раздел ‘‘Булевы значения’’ в данной главе выше).

Операторы != и <>

Противоположностью оператору равенства == является оператор неравенства ! =. Часто, читая чужой PHP+код, программисты пропускают ! (восклицательный знак), однако он имеет большое значение, так как меняет значение выражения на противо+ положное, поэтому с ним следует быть особенно внимательным.

if ($lucky_number != 7) {

echo ("Ваше счастливое число определенно не 7");

}

Символы != буквально означают ‘‘не равно’’.

Существует другая форма записи для оператора неравенства ++++++ использование операторов ‘‘меньше’’ и ‘‘больше’’. В операторе if такая нотация используется сле+ дующим образом:

if ($lucky_number <> 7) {

echo ("Ваше счастливое число определенно не 7");

}

Любой из этих операторов (!= или <>) возвращает false только в одном случае, когда значением переменной $lucky_number является число 7. Оператор <> означает ‘‘не’’.

Воспользуемся простым сценарием из главы 3 для выбора ответа с помощью пере+ ключателей. На этот раз программа будет не только задавать вопрос, но и сообщит пользователю о том, верен его ответ или нет.

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

1. Откройте HTML+редактор и введите следующий код:

<html>

<head><title></title></head>

<body>

<?php

Логические операторы, циклы и массивы 171

if (isset($_POST['posted'])) {

if ($_POST['question1'] == "Лиссабон") {

echo "Верно, $_POST[question1] –правильный ответ<hr>";

}

if ($_POST['question1'] != "Лиссабон") {

echo "Неверно, $_POST[question1] – неправильный ответ<hr>";

}

}

?>

<form method="POST" action="quiz.php">

<input type="hidden" name="posted" value="true">

Назовите столицу Португалии

<br>

<br>

<input name="question1" type="radio" value="Порту">

Порту

<br>

<input name="question1" type="radio" value="Лиссабон">

Лиссабон

<br>

<input name="question1" type="radio" value="Мадрид">

Мадрид

<br>

<br>

<input type="submit" value="Отправить ответ"> </form>

</body>

</html>

2.Сохраните данный файл как quiz.php и закройте его.

3.Откройте созданный файл в браузере, выберите ответ Мадрид и нажмите кнопку Отправить ответ. На рис. 4.2 показан результат.

Рис. 4.2.

4. Попробуйте выбрать другие ответы и посмотрите, какой будет результат.

172 Глава 4

Как это работает

Операторы if проверяют, имеет ли переменная $_POST[question1] значение Лиссабон. Если это так, то пользователю отправляется положительный ответ; в про+ тивном случае возвращается отрицательный ответ.

Логические операторы (AND, OR, !)

Логические операторы уже обсуждались ранее в данной главе, теперь их можно применить на практике. Чтобы понять их работу в программах, можно провести анало+ гию с их действием в обычном языке, поскольку, например, их использование в англий+ ском языке почти аналогично использованию в PHP. Например, если сегодня суббота и погода солнечная, то можно идти на пляж. Подобным образом это реализуется и в PHP:

if ($day == "Суббота" AND $weather === "солнце светит") { echo ("Значит можно идти на пляж");

}

Оператор AND также можно написать с помощью двойного амперсанда (&&):

if ($day == "Суббота" && $weather == "солнце светит") { echo ("Значит можно идти на пляж");

}

Операторы OR и! используются также просто. Можно перефразировать данный при+ мер и использовать в нем оператор OR для представления противоположной ситуации.

if ($day == "Понедельник" OR $weather == "идет дождь") { echo ("значит сегодня пляж отменяется");

}

Если сегодня понедельник или идет дождь, то идти на пляж нельзя. Данный опера+ тор также может быть представлен с помощью двойных вертикальных черт (двойного символа конвейера) ||, поэтому предыдущий пример кода можно записать так:

if ($day == "Понедельник" || $weather == "идет дождь") { echo ("значит сегодня пляж отменяется");

}

Следует отметить, что (хотя это не всегда влияет на работу кода) операторы && и AND имеют несколько различный приоритет. То же можно сказать и об операторах || и OR. Операторы && и || имеют приоритет выше, чем у их текстовых аналогов.

Несмотря на то что оператор NOT существует, использовать слово ‘‘not’’ нельзя. Фактически в качестве оператора NOT используется восклицательный знак. Если вос+ клицательный знак предшествует круглым скобкам, то он изменяет результат в них на противоположный, поэтому если условие первоначально возвращает true, то при использовании восклицательного знака оно будет возвращать false и наоборот. На+ пример, если текущий день не суббота, то идти на пляж нельзя:

if !($day == "Суббота") {

echo ("значит сегодня пляж отменяется");

}

Может показаться, что восклицательный знак работает так же, как и описанный ранее оператор неравенства, однако это не так. Оператор неравенства применяется только к выражению, частью которого он является, тогда как восклицательный знак перед круглыми скобками в операторе if применяется ко всему условию (к выраже+ нию в скобках). Фактически можно обратить результат условия, в котором даже нет операторов. Можно просто поместить переменную в условную часть оператора if, и если данная переменная не имеет значения, то в следующем примере условие будет

Логические операторы, циклы и массивы 173

возвращать false, но если перед условием будет стоять восклицательный знак, то ус+ ловие будет возвращать true. Описать данный код можно так: ‘‘Если переменная $answer не содержит значения, то перейти к оператору echo’’.

if !($answer) {

echo ("Ответа нет");

}

Данный оператор распечатывает сообщение, только если переменной $answer не присвоено значение или если ей присвоено нулевое значение (что в PHP эквивалент+ но отсутствию значения). Это происходит из+за того, что оператор ! инвертирует значение $answer, поэтому если $answer возвращает false, то !($answer) воз+ вращает true, и выполняется оператор в фигурных скобках. Это важный момент, по+ тому что часто условие, используемое в операторе if, просто является результатом вычисления какого+либо выражения или результатом функции, и если выражение возвращает true, то оператор if продолжает обработку. В условной части операто+ ров вообще может не быть.

Рассмотрим практический пример использования логических операторов.

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

Следующую программу можно использовать в компании, предоставляющей авто+ мобили напрокат, чтобы определять, можно ли доверить тому или иному клиенту ав+ томобиль. Предполагаемый водитель должен иметь водительские права и быть стар+ ше 21 года. Программа проверяет эти и другие данные.

1. Откройте HTML+редактор и введите следующий код:

<html>

<head><title></title></head>

<body>

<b>Компания Namllu. Прокат автомобилей</b> <?php

if (isset($_POST['posted'])) {

if ($_POST['age'] > 20 and $_POST['license'] == "on") { echo ("Вам можно предоставить машину напрокат.<hr>");

}

if ($_POST['age'] < 21 or $_POST['license'] == "") {

echo ("К сожалению, мы не можем предоставить Вам машину напрокат.<hr>");

}

} else { ?>

<form method="post" action="car.php">

<input type="hidden" name="posted" value="true">

Имя:

<input name="first_name" type="text">

Фамилия:

<input name="last_name" type="text">

возраст:

<input name="age" type="text"size="3"> <br>

<br>

Адрес:

<textarea name="address" rows=4 cols=40> </textarea>

<br>

<br>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]