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

web - tec / PHP 5 для начинающи

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

Логические операторы, циклы и массивы 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>

174 Глава 4

Ваши водительские права действительны? <input name="license" type="checkbox"> <br>

<br>

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

</body>

</html>

<?php

}

?>

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

3.Откройте созданный файл в браузере и введите необходимые сведения, как по+ казано на рис. 4.3.

Рис. 4.3.

4. Нажмите кнопку Отправить заявку. Примерный результат показан на рис. 4.4.

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

Чтобы собрать дополнительную информацию, используется более сложная по сравнению с уже рассмотренными HTML+форма (ее можно было бы сделать лучше с дизайнерской точки зрения, но в данном случае достаточно того, что она просто ра+ ботает). В коде используется оператор else, позволяющий отображать форму, только если она не была отправлена пользователем, потому что как только пользователь от+ правил заявку, нет необходимости отображать форму снова (не забудьте написать <?}?> после завершения кода HTML+формы).

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

Рис. 4.4.

Правильная работа PHP+кода зависит от выбора данных из HTML+полей (текстового поля age и флажка license). Данные переменные принимаются после отправки формы как $_POST[age] и $_POST[license]. Приведенный ниже HTML+ код реализует форму и кнопку отправки данных.

<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>

Ваши водительские права действительны? <input name="license" type="checkbox"> <br>

<br>

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

Текстовое поле имеет атрибут name, равный age, поэтому для хранения возраста пользователя создается переменная $_POST[age]. Флажок (license) либо установ+ лен, либо нет, поэтому переменная $_POST[license] может либо содержать значе+ ние on, либо не содержать значения вообще.

176Глава 4

Значение on фактически зависит от браузера, но браузеры Internet Explorer, Netscape Navigator и Opera используют его без каких*либо проблем. Если используется другой браузер и данный пример не работает, то следует применить оператор echo(), чтобы опросить переменную $license и соответствующим образом модернизировать код (подробнее использование оператора echo() в целях отладки описано в главе 5).

PHP+сценарий использует обе эти переменные. Первый оператор if в файле car.php проверяет указанный пользователем возраст, и если возраст больше 20 лет и пользователь имеет водительские права, то можно принять заявку на прокат машины:

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

Второй блок проверяет обратное условие: если пользователь моложе 21 года или он не имеет водительских прав, то ему будет отказано в аренде автомобиля:

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

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

Это весь сценарий.

Есть еще одно непредвиденное обстоятельство: что произойдет, если пользова+ тель введет возраст между 20 и 21 годами, например, 20.5? Это маловероятно, но сце+ нарий должен обрабатывать подобные ситуации. В таком случае любое условие по возрасту будет приемлемым и получится два ответа. В ситуациях подобных данной, возможно, наилучшим решением будет использование операторов >= или <= (‘‘больше или равно’’ либо ‘‘меньше или равно’’). Для того чтобы получить верный результат, можно использовать следующий код:

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

} else {

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

Операторы switch

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

Ниже приведен пример использования оператора switch:

switch ($grade) { case $grade>90: echo ("Оценка A.");

break;

case $grade>80:

echo ("Оценка B."); break;

case $grade>70:

echo ("Оценка C.");

break; case $grade>50: echo ("Оценка D.");

break;

case $grade<50:

echo ("Оценка F. "); break;

default:

echo ("Не сдано");

}

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

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

В операторе switch используется команда break. Когда PHP встречает данную ко+ манду, то останавливает текущее действие, выходит из switch+структуры и переходит к выполнению программного потока сразу после закрывающей скобки. Совпадение с дру+ гими критериями при этом не проверяется, даже если оценка, равная 80%, соответству+ ет всем этим критериям. Это полезно, потому дает возможность обойтись без много+ численных мелких блоков для обработки всех вероятных ситуаций. Если требуется, чтобы проверялись все критерии, то можно просто не использовать ключевое слово break, хотя следует отметить, что break работает только совместно с оператором switch и не работает с if. Также следует заметить, что можно запутаться, если по+ местить break в оператор if, который находится внутри оператора switch или цик+ ла for, так как оператор switch и цикл for в отличие от if реагируют на break.

Если опустить ключевое слово break, то все выражения будут равны true, и оцен+ ки A, B, C, D и F получатся с результатом 80.

switch ($State) { case "IL": echo ("Illinois"); break;

case "GA":

echo ("Georgia"); break;

default:

echo ("California"); break;

}

Если сразу за ключевым словом case просто указать значение (в данном примере IL), то PHP автоматически сравнит с данным значением переменную в круглых скобках оператора switch независимо от того, числовая она или текстовая.

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

Следует создавать case+блоки только для значений, которые ожидаются и с кото+ рыми программа способна работать (даже если оператор switch используется только для прерывания обработки). Например, можно оставить пустым case+блок внутри оператора switch и включить в него только ключевое слово break. После этого, ко+ гда PHP встретит ключевое слово case, оператор switch будет прерван и обработка внутри него будет прекращена. Это происходит в последующем примере кода, когда пользователь вводит для переменной $State значение HH. Тогда активизируется блок для HH и обработка завершается. Когда же вводится неизвестное значение, оно активизирует случай по умолчанию и выводит ответ California:

switch ($State) {

case "HH":

break;

 

case "IL":

 

echo ("Illinois"); break;

case "GA":

178 Глава 4

echo ("Georgia"); break;

default:

echo ("California"); break;

}

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

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

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

<html>

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

<body>

<b>Бронирование гостиниц Namllu</b> <br>

<br>

<?php

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

$price = 500; $starmodifier = 1; $citymodifier = 1;

$destination = $_POST['destination'];

$destgrade = $_POST['destination'] . $_POST['grade']; switch($destgrade) {

case "Barcelonathree": $citymodifier = 2;

$price = $price * $citymodifier;

echo "Недельная стоимость проживания в $destination - $price"; break;

case "Barcelonafour": $citymodifier = 2; $starmodifier = 2;

$price = $price * $citymodifier * $starmodifier;

echo "Недельная стоимость проживания в $destination - $price"; break;

case "Viennathree": $citymodifier = 3.5;

$price = $price * $citymodifier;

echo "Недельная стоимость проживания в $destination - $price"; break;

case "Viennafour": $citymodifier = 3.5; $starmodifier = 2;

$price = $price * $citymodifier * $starmodifier;

echo "Недельная стоимость проживания в $destination - $price"; break;

case "Praguethree":

$price = $price * $citymodifier;

echo "Недельная стоимость проживания в $destination - $price"; break;

case "Praguefour": $starmodifier = 2;

$price = $price * $citymodifier * $starmodifier;

echo "Недельная стоимость проживания в $destination - $price"; break;

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

default:

echo ("Выберите снова"); break;

}

}

?>

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

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

Где Вы хотели бы провести отпуск? <br>

<br>

<input name="destination" type="radio" value="Prague">

Прага

<br>

<input name="destination" type="radio" value="Barcelona">

Барселона

<br>

<input name="destination" type="radio" value="Vienna">

Вена

<br>

<br>

В гостинице какого класса Вы хотели бы остановиться? <br>

<br>

<input name="grade" type="radio" value="three">

Три звездочки

<br>

<input name="grade" type="radio" value="four">

Четыре звездочки

<br>

<br>

<input type="submit" value="Заказать"> </form>

</body>

</html>

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

3.Откройте файл в браузере, введите в форму какие+либо сведения и нажмите кнопку Заказать. Примерный результат показан на рис. 4.5.

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

Два замечания по поводу оператора switch: он легко читается и в нем использует+ ся только несколько строк кода. Первое замечание субъективно. Рассмотрим второе: данную программу можно было бы написать как последовательность операторов if

ив ней пришлось бы использовать большое число строк PHP+кода между тегами <?php

и?>, а в файле holiday.php используется всего 41 строка.

Рассмотрим работу программы в целом. При открытии страницы пользователь ви+ дит HTML+форму и понимает, что ему требуется сделать какой+либо выбор. Как толь+ ко пользователь отправляет форму, PHP+код активизируется, так как переменная $_POST[posted] установлена, а это определяется в условной части первого (и толь+ ко) оператора if с помощью функции isset(). Затем код внутри данного оператора if начинает работать и присваивает значения нескольким переменным:

$price = 500; $starmodifier = 1; $citymodifier = 1;

$destination = $_POST['destination'];

180 Глава 4

Рис. 4.5.

В следующей строке вводится новая переменная, $destgrade, значение которой представляет собой конкатенацию $_POST['destination'] и $_POST['grade'].

$destgrade = $_POST['destination'] . $_POST['grade'];

Если пользователь выбирает Барселону и четырехзвездочную гостиницу, то зна+ чением переменной $destgrade будет строка ‘‘Barcelonafour’’. Путем однократного введения условия в оператор switch частично сокращается количество строк кода (по сравнению с использованием нескольких операторов if):

switch($destgrade) {

Необходимо обработать все семь возможных результатов. (Три варианта гостини+ цы, умноженные на два класса, плюс нестандартный выбор.) Шестью возможными вариантами являются Барселона и трехзвездочная гостиница, Барселона и четырех+ звездочная гостиница, Прага и трехзвездочная гостиница, Прага и четырехзвез+ дочная гостиница, Вена и трехзвездочная гостиница, Вена и четырехзвездочная гостиница. Таким образом, возможными значениями переменной $destgrade могут быть только строки Barcelonathree, Barcelonafour, Praguethree, Praguefour, Viennathree и Viennafour, а также нестандартный выбор пользователя.

Так как во всех случаях выполняются одинаковые действия, рассмотрим только один пример:

case "Barcelonathree": $citymodifier = 2;

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

$price = $price * $citymodifier;

echo "Стоимость недельного проживания в $destination - $price"; break;

В случае Barcelonathree переменной $citymodifier присваивается значение 2, умноженное на цену. Затем отображается пункт назначения и цена, и оператор break переводит управление в конец программы. Если значение $destgrade не совпадает ни с одним корректным вариантом, значит что+то было сделано не так, и пользовате+ лю отображается сообщение о необходимости вернуться и ответить на вопросы снова.

Хорошей практикой является добавление в конец case+блока ключевого слова break, даже если этот блок не выполняет никаких действий:

default:

echo ("Выберите снова"); break; }

Это означает, что код, скорее всего, не будет генерировать ошибок, если когда+ нибудь после оператора else будет добавлен новый case+блок.

Циклы и массивы

ВPHP имеется три вида циклов: while, do while и for. Все они рассматриваются

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

Циклы

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

Однако циклы отличаются от условных операторов, потому что содержимое цикла может выполняться снова и снова. Проверяется условие, и если оно удовлетворено, то выполняется код цикла. Затем условие проверяется снова; если оно все еще кор+ ректно, то код цикла выполняется снова, и этот процесс может повторяться много+ кратно. Каждый проход по циклу называется итерацией (iteration).

Как будет показано далее, все типы циклов приспособлены для различных ситуаций.

Цикл while

Цикл while является простейшим из циклов и отчасти похож на оператор if, по+ тому что проверяет результат выполнения некоторого условия. В зависимости от то+ го, истинно или ложно данное условие, выполняется раздел кода, помещенный между фигурными скобками после условного оператора:

while (условие истинно){

выполнить содержимое данного блока;

}

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

182 Глава 4

няется, что оно ложно, то код в фигурных скобках игнорируется и PHP продолжает работу с первой строки ниже скобок. Рассмотрим пример псевдокода:

while (луна полная){ койот будет выть;

}

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

while ($shopping_total > $credit_limit){ echo ("Вы превысили лимит своего кредита,

поэтому последний объект будет удален из Вашей корзины"); $last_purchase_but_one = $shopping_total - $last_purchase; $last_purchase = $last_purchase_but_one;

}

Если пользователь превысит свой кредитный лимит $credit_limit, то его послед+ няя покупка будет отменена и ее стоимость ($last_purchase) будет вычтена из общего счета ($shopping_total). Затем следует изменить значение $last_purchase, так чтобы оно было равно общей стоимости всех покупок, кроме последней, $last_ purchase_but_one. Это даст возможность проходить по циклу, удаляя из списка при+ обретенных товаров один объект за раз до тех пор, пока $shopping_total не будет меньше, чем $credit_limit.

Нетрудно заметить, что если $credit_limit имеет негативное значение, то дан+ ный цикл может продолжаться бесконечно. Бесконечные циклы могут возникать, ко+ гда используется условие, которое может быть всегда верным. Это означает, что про+ грамма не закончится, поскольку проверка условия никогда не возвратит false. При этом ошибка не генерируется, просто программа продолжает обрабатывать содержимое цикла снова и снова. Об этом следует помнить при написании программ, использующих циклы. Подробнее бесконечные циклы описываются в настоящей главе далее.

Чтобы посмотреть на цикл while в действии, можно расширить приложение, обра+ батывающее заявку на ссуду, которое было написано в главе 3. Программа запрашивала у пользователя сумму ссуды, а затем подтверждала принятие заявки или отклоняла ее. Те+ перь представим, что утверждено несколько возможных вариантов ссуды, из которых пользователь может выбирать. Существует три различных варианта ссуды, в каждом из которых предлагается своя сумма и своя месячная процентная ставка. Новая про+ грамма будет сообщать пользователю о том, как долго ему придется возвращать ссуду.

Конечно, чтобы это сделать, от пользователя необходимо получить еще один блок информации: сумму, которую пользователь готов выплачивать ежемесячно. Кроме того, пользователь должен ежемесячно выплачивать проценты по ссуде. Иначе гово+ ря, если клиент взял взаймы 1000 долларов под 5% в месяц и возвращает 100 долларов в месяц, то в это число также включается 50 долларов по процентам за первый месяц. Таким образом, в действительности в первый месяц клиент возвращает 50 долларов невыплаченной ссуды. Во втором месяце остаток ссуды будет равен 950 долларов, и если вернуть еще 100 долларов, то 5% от этой суммы составят 47,50 долларов. Оче+ видно, что вычисления довольно скоро могут стать сложными, хотя формула каждый месяц будет оставаться постоянной:

Платеж = Месячный платеж – Проценты Долг = Долг – Платеж

Соседние файлы в папке web - tec