Занятие 4.

advertisement
Занятие 4.
Конструкции языка
Инструкция if-else
Начнем с самой простой инструкции - условного оператора. Его формат таков:
if (логическое_выражение)
инструкция_1;
else
инструкция_2;
Действие его следующее: если логическое__выражение истинно, то выполняется
инструкция_1, а иначе - инструкция_2. Как и в любом другом языке, конструкция else может
опускаться, в этом случае при получении должного значения просто ничего не делается.
Пример:
if ($a>=1&&$b<=10)
echo “Все ОК”;
else
echo “Неверное значение в переменной”;
Если инструкция_1 или инструкция_2 должны состоять из нескольких команд, то
они, как всегда, заключаются в фигурные скобки. Например:
if ($a>$b)
{
print “а больше b”;
c=$b;
}
elseif ($a==$b)
{
print “а равно b”;
$c=$a;
}
else
{
print "а меньше b"; $с=$а;
}
Оператор if может включать сколько угодно блоков elseif, но else в каждом if может быть
только один. Как правило, в конструкциях if…elseif…else оператор else определяет, что нужно
делать, если никакие другие условия не являются true.
Трансляция полей формы в переменные
На прошлом занятии мы рассматривали простой пример обработки данных формы.
Вернемся к нему.
Все данные из полей формы интерпретатор преобразует в глобальные одноименные
переменные. В нашем случае значение поля name после начала работы программы будет
храниться в переменной $name, а значение поля age - в переменной $age. То есть, не надо ничего
ниоткуда "получать" - все уже установлено и распаковано из URL-кодировки.
Вот наш окончательный сценарий hello.php. Как видите, он сжался до неприличных
размеров:
<html><body>
<? echo “Привет, $name!<br> Я знаю, Вам $age лет!”?>
</html></body>
Давайте теперь его усовершенствуем - сделаем так, чтобы при запуске без параметров
сценарий выдавал документ с формой, а при нажатии кнопки - выводил нужный текст. Самый
простой способ определить, был ли сценарий запущен без параметров - проверить, существует
ли переменная с именем, совпадающим с именем кнопки отправки. Если такая переменная существует, то, очевидно, что пользователь запустил программу, нажав на кнопку. Здесь мы
применим инструкцию if.
<html><body>
<? if (!$doGo) {?>
<form action=”hello.php”>
Введите имя: <input type=text name="name"><br>
Введите возраст: <input type=text name="age"><br>
<input type=submit name="doGo" value="Нажмите кнопку!">
</form>
<?} else {?>
Привет, <?=$name?>!<br>
Я знаю, Вам <?=$age?> лет!"
<?}?>
</html></body>
Из этого примера мы можем почерпнуть еще один удобный прием, который нами пока не
рассматривался. Это конструкция <?=выражение?>. Она является
ничем
иным,
как
просто более коротким обозначением для <?echo (выражение)?>, и предназначена для
того, чтобы вставлять величины прямо в HTML-страницу.
К тому же, теперь исчезла необходимость и в промежуточном файле form.html: его код
встроен в сам сценарий.
Трансляция списков
Механизм трансляции полей формы в РНР работает приемлемо, когда среди них нет
полей с одинаковыми именами. Если же таковые встречаются, то в переменную, ясное дело,
записываются только данные последнего встретившегося поля. Это довольно-таки неудобно при
работе, например, со списком множественного выбора <select multiple>:
<select name=Sel multiple>
<option>First
<option>Second
<option>Third
</select>
В таком списке вы можете выбрать (подсветить) не одну, а сразу несколько строчек,
используя клавишу <Ctrl> и щелкая по ним кнопкой мыши. Пусть мы выбрали First и Third.
Тогда после отправки формы сценарию придет строка параметров Sel=First&Sel=Third, и в
переменной $Sel окажется, конечно, только Third. Значит ли это, что первый пункт потерялся и
механизм трансляции в РНР работает некорректно? Оказывается, нет, и для решения подобных
проблем в РНР предусмотрена возможность давать имена полям формы в виде имени массива с
индексами:
<select name="Sel[] " multiple>
<option>First
<option>Second
<option>Third
</select>
Теперь сценарию придет строка Sel[]=First&Sel[]=Third, интерпретатор обнаружит, что
мы хотим создать "автомассив" (то есть массив, который не содержит пропусков, и у которого
индексация начинается с нуля), и, действительно, создаст переменную $Sel типа массив,
содержимое которого следующее: array (0=>"First”, 1=>"Third"). Как мы видим, в результате ничего не пропало - данные только слегка видоизменились.
Забегая вперед, еще несколько слов об автомассивах. Рассмотрим такой несложный
пример программы:
$А[]=10;
$А[]=20;
$А[]=30;
После отработки этих строк будет создан массив $A, заполненный последовательно
числами 10, 20 и 30, с индексами, отсчитываемыми с нуля. То есть, если внутри квадратных
скобок при присваивании элементу массива не указано ничего, то подразумевается элемент
массива, следующий за последним. В общем-то это должно быть интуитивно понятным именно на легкость в использовании и ориентировались разработчики РНР.
Прием с автомассивом в поле <select multiple>, действительно, выглядит довольно
элегантно. Однако не стоит думать, что он применим только к этому элементу формы:
автомассивы мы можем применять и в любых других полях. Вот пример, создающий 2
переключателя (кнопки со значениями вкл/выкл), один редактор строки и одно текстовое
(многострочное) поле, причем все данные после запуска сценария, обрабатывающего эту форму,
будут представлены в виде одного-единственного автомассива:
<input type=checkbox name=Arr[] value=ch1>
<input type=checkbox name=Arr[] value=ch2>
<input type=text name=Arr[] value="Some string">
<textarea name=Arr[]>Some text</textarea>
То есть, мы видим, что РНР совершенно нет никакого дела до того, в каких элементах
формы мы используем автомассивы - он в любом случае обрабатывает все одинаково. И это,
пожалуй, правильно.
Трансляция массивов
В сущности, мы уже рассмотрели почти все возможности РНР по автоматической
трансляции данных формы. Напоследок взглянем на еще одно полезное свойство РНР. Пусть у
нас есть такая форма:
Имя: <input type=text name=Data[name]><br>
Адрес: <input type=text name=Data[address]><br>
Город: <br>
<input type=radio name=Data[city] value=Moscow>Москва<br>
<input type=radio name=Data[city] value=Peter>Санкт-Петербург<br>
<input type=radio name=Data[city] value=Kiev>Киев<br>
Можно догадаться, что после передачи подобных данных сценарию на РНР в нем будет
инициализирован ассоциативный массив $Data с ключами name, address и city. То есть, имена
полям формы можно давать не только простые, но и представленные в виде одномерных
ассоциативных массивов.
Забегая вперед, скажу, что у сценарии к отдельным элементам формы можно будет
обратиться при помощи указания ключа массива: например, $Data[‘city’] обозначает значение
той радиокнопки, которая была выбрана пользователем, а $Data[“name”] - ее имя. Заметьте, что
в сценарии мы обязательно должны заключать ключи в кавычки или апострофы - в противном
случае интерпретатором будет выведено предупреждение. В то же время, в параметрах name
полей формы мы, наоборот, должны их избегать - уж так устроен РНР.
Download